2010-10-09 5 views
9

Je rencontre un problème lors de la conversion de séries temporelles irrégulières en séries temporelles régulières. Ci-dessous un exemple simplifié peut être trouvé:Conversion d'une série chronologique irrégulière en série chronologique régulière

require(zoo) 
t <- as.character(c(1981,1984,1985)) 
d <- c(1,3,6) 
dt <- data.frame(d,t) 
t <- as.Date(t,"%Y") 
z <- zoo(d,t) 
plot(z) 
ts.d <- as.ts(as.zooreg(z,freq=1)) # create a regular ts object 
ts.d # regular time series 

Je voudrais créer une ts.d de séries chronologiques régulières qui ressemble à ceci c (1981, NA, NA, 1984,1985).

La chose étonnante est que la première fois que je lance ceci: ça marche! mais quand je veux lancer à nouveau ou le répéter (les as.ts() la ligne), il arrête fonctionnement et j'obtenir une série de temps très long:

ts.d # regular time series 
Time Series: 
Start = 4299 
End = 5760 
Frequency = 1 
    [1] 1 NA NA NA NA NA NA NA NA NA NA NA NA NA 
[15] NA NA NA NA NA NA NA NA 

etc.

Qu'est-ce qui ne va pas?

Répondre

6

Comme il a été souligné la as.Date(as.character(t), "%Y") est incorrecte car elle ne donne pas le mois désiré et jour. Si nous voulions convertir des années en classe "Date", nous pourrions faire cela as.Date(as.yearmon(t)) en utilisant as.yearmon du zoo; Cependant, nous aurions alors le problème que les différentes années ont des nombres de jours différents, donc il n'y a aucun moyen d'avoir une série régulière utilisant des dates pour représenter les années.

Vraiment, nous ne voulons pas de dates en premier lieu. Nous voulons juste travailler avec des années dans ce cas, il simplifie juste:

> z <- zoo(c(1, 3, 6), c(1981, 1984, 1985)) 
> 
> as.ts(z) 
Time Series: 
Start = 1981 
End = 1985 
Frequency = 1 
[1] 1 NA NA 3 6 

ou si nous voulons être sûrs que nous pourrions faire ce qui obligera à être annuelle, même si l'entrée a, par hasard, un une fréquence plus basse: frequency(z) <- 1; as.ts(z) ou définir simplement la série de zoo d'origine pour avoir une fréquence de 1 dès le début:

> z <- zoo(c(1, 3, 6), c(1981, 1984, 1985), frequency = 1) 
> as.ts(z) 
Time Series: 
Start = 1981 
End = 1985 
Frequency = 1 
[1] 1 NA NA 3 6 

Avec cet exemple, il ne fait pas de différence, mais dans ce cas z <- zoo(c(1, 3, 6), c(1981, 1983, 1985), frequency = 1) la frequency explicite serait nécessaire pour l'empêcher d'avoir une fréquence de 0.5.

3

Ce n'est pas un bug. Il y a 1 461 jours couvrant les 4 années de votre série chronologique. Et ça ne marche pas pour moi la première fois que je le lance. as.Date(t,"%Y") ne sait pas quel mois/jour utiliser pour faire une date, donc il utilise le jour/jour d'aujourd'hui. Cela ne permet pas une analyse reproductible. Essayez ceci:

t <- c(1981,1984,1985) 
d <- c(1,3,6) 
z <- zoo(d,t) 
z <- merge(z,zoo(,c(1981,1982,1983,1984,1985))) 
ts.d <- as.ts(z) 

Ce qui donne:

> ts.d 
Time Series: 
Start = 1981 
End = 1985 
Frequency = 1 
[1] 1 NA NA 3 6 
Questions connexes