Me estoy enseñando a mí mismo DLM's usando R's dlm
paquete y tengo dos resultados extraños. Estoy modelando una serie temporal utilizando tres elementos combinados: una tendencia ( dlmModPoly
), la estacionalidad ( dlmModTrig
), y la estacionalidad móvil ( dlmModReg
).
El primer resultado extraño es con el $f
(previsión de un paso) resultado. La mayor parte de esta previsión parece ir un mes por detrás de los datos reales, algo que creo haber visto en muchos ejemplos de previsión de un paso por delante en Internet y en libros. Lo extraño es que la estacionalidad móvil NO tiene un retraso similar, sino que llega exactamente donde debería. ¿Es esto normal?
Si utilizo el resultado de $m
para ensamblar manualmente el componenet, todo se alinea perfectamente, así que es raro, aunque tiene sentido en cierto modo: la estacionalidad móvil tiene datos exógenos para ayudarla mientras que el resto de la previsión no. (Aun así, sería bueno simplemente lag
el resultado $f
y ver un buen partido).
Más preocupante es la diferencia que veo si cambio el grado de dlmModPoly
(de 1 a 2) en un intento de obtener un nivel más suave. Esto introduce un enorme pico en los tres componentes en el mes 9. Los picos se cancelan básicamente en el compuesto, pero obviamente hacen que cada pieza, digamos el nivel o la estacionalidad, se vea bastante ridícula allí.
¿Es una de esas cosas que ocurren y que debería estar preparado para tirar el primer año de datos del resultado como "rodaje"? ¿O es una indicación de que algo va mal? (Incluso en el caso del polinomio de grado 1, el nivel de estacionalidad móvil del primer año es un poco inestable, pero no hay un pico enorme como cuando uso un polinomio de grado 2).
Aquí está mi código R:
lvl0 <- log (my.data[1])
slp0 <- mean (diff (log (my.data)))
buildPTR2 <- function (x)
{
pm <- dlmModPoly (order=1, dV=exp (x[1]), dW=exp (x[2]), m0=lvl0)
tm <- dlmModTrig (s=12, dV=exp (x[1]), q=2, dW=exp (x[3:4]))
rm <- dlmModReg (moving.season, dV=exp (x[1]))
ptrm <- pm + tm + rm
return (ptrm)
}
mlptr2 <- dlmMLE (log (my.data), rep (1, 6), buildPTR2)
dptr2 <- buildPTR2 (mlptr2$par)
dptrf2 <- dlmFilter (log (my.data), dptr2)
tsdiag (dptrf2)
buildPTR3 <- function (x)
{
pm <- dlmModPoly (order=2, dV=exp (x[1]), dW=c(0, exp (x[2])), m0=c(lvl0, slp0))
tm <- dlmModTrig (s=12, dV=exp (x[1]), q=2, dW=exp (x[3:4]))
rm <- dlmModReg (moving.season, dV=exp (x[1]))
ptrm <- pm + tm + rm
return (ptrm)
}
mlptr3 <- dlmMLE (log (my.data), rep (1, 8), buildPTR3)
dptr3 <- buildPTR3 (mlptr3$par)
dptrf3 <- dlmFilter (log (my.data), dptr3)
En cuanto a la pregunta siguiente: los datos en sí son datos mensuales durante 10 años, y cada mes es la media semanal de asistencia a una producción teatral. Los datos tienen sin duda efectos estacionales y estacionales móviles. Quiero modelar la tendencia y los efectos estacionales para dar a la dirección una idea, y para preparar la previsión. (Lo cual no es posible directamente con dlm
cuando se incluye un dlmModReg
componente, aunque ese es el siguiente paso).
(Estoy intentando utilizar un componente polinómico de orden=2 que creo que crea una tendencia IRW, que se supone que es muy suave).
Si importa, mi estacionalidad móvil es un evento anual de la Gala del Big Bash que puede caer en dos meses diferentes, y lo indico con 0 para la mayoría de los meses y 1 para los meses en los que cae el Big Bash.