2010-10-09 28 views
9

Tengo un problema al convertir series temporales irregulares a series temporales normales. A continuación un ejemplo simplificado se puede encontrar:Convierta una serie temporal irregular en una serie temporal normal

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 

me gustaría crear un ts.d series de tiempo regular que se parece a esto C (1981, NA, NA, 1984,1985).

Lo sorprendente es que la primera vez que ejecuto esto: ¡funciona! pero cuando quiero volver a ejecutarla o repetirla (los as.ts (línea)) que se detenga el funcionamiento y obtener una muy larga serie de tiempo:

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.

lo que va mal?

Respuesta

6

Como se ha señalado la as.Date(as.character(t), "%Y") es incorrecta, ya que no da el mes y el día deseado. Si quisiéramos convertir años a la clase "Date" podríamos hacer esto as.Date(as.yearmon(t)) usando el zoológico as.yearmon; sin embargo, entonces tendríamos el problema adicional de que diferentes años tienen diferentes números de días, por lo que no hay forma de tener una serie regular que use fechas para representar años.

Realmente no queremos las fechas en primer lugar. Sólo queremos trabajar con año en cuyo caso se simplifica a poco:

> 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 

o si queremos estar seguros que podíamos hacer esto lo que obligará a ser anual, incluso si la entrada tiene, por casualidad, una menor frecuencia: frequency(z) <- 1; as.ts(z) o simplemente definir la serie zoológico original tiene una frecuencia de 1 desde el principio:

> 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 

con este ejemplo no hace una diferencia, pero en este caso z <- zoo(c(1, 3, 6), c(1981, 1983, 1985), frequency = 1) la explícita frequency sería necesario para evitar que tenga una frecuencia de 0.5.

3

No es un error. Hay 1.461 días que abarcan los 4 años en su serie temporal. Y no funciona para mí la primera vez que lo ejecuto. as.Date(t,"%Y") no sabe qué mes/día usar para crear una fecha, por lo que usa el mes/día de hoy. Eso no hace un análisis reproducible. Tal vez puedas probar:

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) 

que produce:

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