Processing math: 100%

5 votos

Utilización de la información a ambos lados de una "brecha" en los datos de las series temporales para la imputación

Al igual que en mi pregunta anterior, estoy buscando la forma de imputar los datos que faltan en una serie temporal de datos jerárquicos.

Con todos mis otros procedimientos, incluida la experimentación de paquetes de imputación ( Amelia , HoltWinters de Forecast y MICE imputación) sólo he podido utilizar los datos de la serie temporal anteriores a la brecha que falta.

     Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
2001 220 194 238 190 217 244 242 225 242 259 267 244
2002 212 246 250 236 261 286 265 269 226 267 234 246
2003 202 199 297 272 236 266 235 226 260 183 226 265
2004 211 215 219 213 240 236 273 266 262 244 241 235
2005 212 198 233 251 259 282 305 267 241 264 222 269
2006 182 220 250 287 279 281 286 332 300 272 221 233
2007  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA
2008 193 215 235 242 246 315 326 280 279 239 236 258
2009 246 189 257 241 268 223 260 288 234 260 216 195

Estoy tratando de hacer un procedimiento de imputación simple que utilice las estimaciones de previsión y backcasting del modelo de series temporales. La previsión utiliza los datos anteriores para predecir el futuro y el backcasting utiliza los datos posteriores para "predecir" el pasado.

A continuación, me gustaría combinar el valor de la previsión y el de la previsión para utilizarlo como imputación. Después miraré el ajuste, etc.

¿Cómo se hace esto en la codificación?

Por ejemplo, soy capaz de determinar qué modelo SARIMA existe para el primer período 2001-end2006. Pero no el periodo completo (porque mis funciones básicas que conozco de R no soportan los valores NA).

Esto es sólo para el período 2001-finales de 2006:

ARIMA(2,0,2)(1,0,1)[12] with non-zero mean 

Call: auto.arima(x = ts.datt) 

Coefficients:
         ar1      ar2      ma1     ma2    sar1     sma1  intercept
      1.3610  -0.8258  -1.2407  0.9191  0.8982  -0.7560   244.8374
s.e.  0.0884   0.0960   0.0878  0.1127  0.2190   0.3335     6.1894

sigma^2 estimated as 605.9:  log likelihood = -335.01
AIC = 686.02   AICc = 688.3   BIC = 704.23

¿Debo modelar sólo el primer período, predecir por forecast ¿modelo entonces el último período por separado y luego hago un backcast? ¿Cómo voy a hacer este backcasting (es decir, "predecir" el pasado)?

EDITAR: Lo que pregunto es 1) ¿Cómo puedo utilizar los datos de los años 2008 y 2009 para BACKCAST? Ya sé cómo utilizar los datos de 2001-2006 para hacer previsiones.

2) ¿Cómo puedo determinar el modelo SARIMA para todo el período? (2001-2009), es decir

0 votos

@joran No. Estoy buscando cualquier código/paquete que me permita hacer backcasting (que es una palabra inventada para 'predecir/predecir el pasado').

3voto

Daryl Spitzer Puntos 220

Pruebe a utilizar na.StructTS en el paquete del zoológico. Dispone de métodos para las series zoo y ts. Por ejemplo, utilizando el paquete incorporado USAccDeaths insertar algunos NAs y luego interpolarlos:

library(zoo)
window(USAccDeaths, 1975, c(1975, 12)) <- NA
na.StructTS(USAccDeaths)

Para más información, consulte el sitio web de StructTS.

0 votos

Por alguna razón no tengo el na.StructTS en mi paquete del zoológico. He probado con ?na.StructTS y ??na.StructTS pero ambos dicen que no se ha encontrado documentación. Cuando lo busco en Google, veo que debería haber un na.StructTS Sólo tengo na.trim na.aggregate na.approx y na.locf - ¿alguna idea de dónde fue na.StructTS?

0 votos

Asegúrate de que tienes la última versión de zoo (actualmente la versión 1.7-2).

0 votos

@Gracias por resaltarlo. Por alguna razón cuando voy al instalador de paquetes - R sólo reconoce 1.6-4 como el último paquete de zoo. Lo comprobaré ahora.

2voto

Maurice Puntos 22343

na.interp de la forecast paquete tiene un buen rendimiento (similar al de na.StructTS como recomienda @g_grothendieck, aunque un poco más rápido) en este análisis de los métodos de interpolación de series temporales .

1voto

Loren Pechtel Puntos 2212

Lo primero que se me ocurre es poner los datos de 2008-2009 en un vector, invertir el vector y ajustarlo/preverlo utilizando los mismos métodos que se utilizaron con los datos de 2001-2006.

No estoy seguro de si es necesario que la estacionariedad u otros requisitos se mantengan para que esto funcione, pero no lo creo.

0voto

Idin K Puntos 55

Interesante pregunta, yo también estoy pensando en añadir una función de estimación de valores perdidos combinada de previsión y retroceso al paquete R imputeTS.

Lo que en este caso habría que hacer es, 1. Tomar los datos de 2001-2006 y hacer una previsión para 2007, por ejemplo, con previsión / auto.arima

  1. Tomar los datos de 2008-2009 e invertirlos y hacer una previsión para 2007 (esto se llama entonces backcast, porque se hace en sentido inverso)

  2. Los dos resultados (del backcast y de la previsión) pueden combinarse como se quiera. La solución más sencilla sería la media del valor de la previsión y del backcast. Pero también se podría pensar en ponderarlos en función de la cantidad de datos que se utilizaron para la construcción del modelo.

Para su ejemplo, esto podría ser así:

library(forecast)

#Create data for forecast and backcast
fcData <- x[1:72]
bcData <- c[84:108]

#reverse backcast data
rev(bcData)

#Do Forecast
resultForecasts <- forecast(auto.arima(fcData),h=12)$mean

#Do Backcast and reverse the results
resultBackcasts(rev(forecast(auto.arima(bcData),h=12)$mean)

#And now you would have to combine back and forecast

Los problemas son mayores si hay múltiples NA en toda la serie temporal. Entonces no se puede simplemente dividir en antes y después de una determinada brecha de NA. Porque las partes anteriores también contendrán NAs y, por lo tanto, no es posible hacer una previsión. En este caso, tendría que iterar sobre el conjunto de datos. Siempre haciendo la previsión anterior/posterior para el siguiente NA.

Pero los otros carteles también tienen razón, hay métodos que podrían ser más adecuados si sólo quieres reemplazar/imputar los valores que faltan.

library(imputeTS)
na.kalman(x)

Sería un ejemplo de un método del paquete imputeTS. ( https://cran.r-project.org/web/packages/imputeTS/imputeTS.pdf para una descripción detallada del método) También el paquete forecast y zoo tienen algunos métodos especialmente para la imputación de series temporales.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X