Simule rutas de muestra de pronóstico del modelo tbats

8

Utilizando el excelente paquete de pronósticos de Rob Hyndman, me encontré con la necesidad no solo de tener intervalos de predicción, sino también de simular una serie de caminos futuros, dadas las observaciones pasadas de una serie temporal con estacionalidades complejas. Hay algo para series de tiempo menos complejas con solo una o dos estacionalidades (simulate.ets () en el paquete de pronóstico), pero en mi caso, requeriría el equivalente de simulate.ets () para el modelo tbats más complejo.

Supongo que los datos necesarios para crear tales rutas ya están presentes en el objeto de ajuste, sin embargo, la posibilidad de crear rutas de muestra parece no ser directamente accesible. Por lo tanto, he encontrado una solución ingenua y me gustaría saber si este enfoque es correcto.

require(forecast)
fit = bats(test,use.parallel=T,use.damped.trend=F,use.trend=T,seasonal.periods=seasonal.periods)

Ingenuamente, imagino que se pueden construir rutas de muestra utilizando el pronóstico puntual de

fit 

> forecast(fit)
         Point Forecast    Lo 80    Hi 80    Lo 95    Hi 95
1960.016       24.48576 23.82518 25.14633 23.47550 25.49602
1960.032       24.79870 23.88004 25.71735 23.39374 26.20366
1960.048       25.31743 24.39878 26.23608 23.91247 26.72239
1960.065       25.69254 24.77389 26.61120 24.28759 27.09750 
1960.081       26.06863 25.14998 26.98729 24.66367 27.47359
1960.097       26.43215 25.51350 27.35080 25.02719 27.83711
1960.113       26.77674 25.85809 27.69540 25.37179 28.18170

y simplemente agregando valores aleatorizados del procedimiento de ajuste del modelo.

> fit$errors
Time Series:
Start = c(1959, 2) 
End = c(1960, 1) 
Frequency = 365 
  [1]  0.140656913 -0.455335141 -0.558989185  1.697532911 -0.114406022  0.366182718 -0.377056927  0.396144296

Por lo tanto, con

prediction = forecast(fit)
errors = fit$errors

path = prediction$mean + sample(errors, size = length(prediction$mean))
plot(ts(path))

Se puede construir una ruta de muestra.

ingrese la descripción de la imagen aquí

¿Es esta una forma válida de construir rutas de muestra? Si no, ¿cuál sería la forma correcta?

¡Muchas gracias por cualquier ayuda!

Peter Lustig
fuente

Respuestas:

2

No, ese método no es válido en general.

Aquí hay un contraejemplo simple e ilustrativo. Suponga que tiene una caminata aleatoria sin deriva:

Yt=Yt1+εt
εtN(0,1)

Este proceso cae en la clase TBATS (es solo un modelo ETS de tipo "ANN" con α=1, sin ninguna estacionalidad compleja, ni transformación de Box-Cox, ni errores de ARMA).

Esto es lo que parece si usa su método en datos simulados:

ingrese la descripción de la imagen aquí

La "ruta simulada" es plana y tiene una pequeña variación, mientras que los datos originales se desviarán bastante de su nivel medio. No se "parece" en absoluto a los datos originales.

Si repetimos el procedimiento muchas veces y calculamos los cuantiles empíricos para el 95% medio de la distribución en cada horizonte, verá que están equivocados en comparación con los intervalos de predicción informados por forecast.tbats(si el método funcionó, deberían coincidir con el exterior, intervalos grises):

ingrese la descripción de la imagen aquí

Muchos modelos de series temporales pueden verse como una transformación de una secuencia de variables aleatorias no correlacionadas; La transformación exacta depende del modelo. Dada una transformación específica, generalmente puede tomar los residuos (llámelosεt^), vuelva a muestrearlos y luego aplique esta transformación para simular desde el mismo proceso.

Por ejemplo, la caminata aleatoria transforma una secuencia de variables no correlacionadas εtpor la recursividad indicada anteriormente (la suma acumulativa). Si su serie original termina enT, puedes probar εT+1, desde {ε1^,,εT^}y aplique la misma recursividad para obtener un valor simulado para YT+1, Me gusta esto:

YT+1=YT+εT+1

Si calcula los cuantiles como antes, debería acercarse al área gris.

En general, por lo tanto, este tipo de arranque basado en modelos requiere un código ligeramente diferente para diferentes modelos, para realizar diferentes transformaciones en el remuestreo εt. La función simulate.etsmaneja esto para usted para la clase ETS, pero todavía no parece haber un equivalente para TBATS en el paquete, por lo que puedo decir.

Chris Haug
fuente
¿Alguna recomendación sobre una forma de hacer esto para TBATS sin necesidad de meterse en la creación de un simulate.tbatsmétodo?
Bryan Shalloway
1
Personalmente no lo he necesitado y no conozco una implementación existente, pero debería ser relativamente sencillo de implementar. Puedes dibujar elεT desde N(0,σ^2) o al volver a muestrear el ε^i, como se describió anteriormente. Luego, simplemente pase esos a través de las recursiones modelo. Tenga en cuenta que esto le dará una muestra dep(YT+1,...,YT+h|Y1,...,YT,θ^)solo, por lo que no incluye la incertidumbre de los parámetros, pero los intervalos de predicción citados rara vez lo hacen.
Chris Haug
-2

Esta es probablemente una respuesta muy tardía, pero no veo por qué no.

Tu enfoque parece correcto. Pero, hay una manera más fácil de hacerlo.

Ya ha asignado un nombre de variable a su pronóstico. Simplemente necesitas hacerlo plot(prediction). Al agregar la variable hque es el número de períodos para pronosticar prediction, puede controlar la duración del pronóstico. Por ejemplo, se podría decir prediction <- forecast(fit, h = 48). Tenga en cuenta que el valor de hdepende de qué tan lejos en el futuro desea ver.

Mustafa Hasanbulli
fuente
1
No me interesa la trama en sí, sino tener acceso a un conjunto de pronósticos.
Peter Lustig