5 votos

Los resultados del DLM se ven mal

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.

6voto

Senseful Puntos 116

Por lo tanto, tiene datos mensuales con tendencia y estacionalidad y desea analizar los componentes de tendencia/estacionalidad y elaborar previsiones. Se trata de dos tareas distintas. Aunque puede hacer ambas cosas con dlm Hay enfoques más sencillos si se separan las tareas.

Para estudiar la tendencia y la estacionalidad, sugiero utilizar el STL a través del stl() en R. Es robusto y tiene buenos gráficos que son fáciles de explicar a los no estadísticos.

Para la previsión, utilizaría un modelo ARIMA estacional. Para empezar, ignore el evento de la Gran Gala y pruebe a ajustar un modelo ARIMA estacional utilizando auto.arima() del forecast paquete. La selección automática de la diferenciación estacional no es muy buena, por lo que yo utilizaría

fit1 <- auto.arima(x,D=1)

donde x son sus datos.

A continuación, para añadir el efecto BBG, establezca una variable de regresión ficticia ( z ) que toma el valor 1 cuando la BBG se produce en el mes y 0 en caso contrario. Añada esto a su modelo utilizando

fit2 <- auto.arima(x,xreg=z,D=1)

Producir previsiones de cada modelo utilizando el forecast() función. Para fit2 se necesitarán los valores futuros de z .

Incluso si quieres seguir con dlm Los enfoques anteriores proporcionarán referencias comparativas útiles.

0voto

Zolomon Puntos 250

Es difícil de diagnosticar sin ver los resultados, pero aquí va una conjetura: si en el ajuste la varianza asociada al componente de nivel es grande, ese componente "seguirá" a tus datos. Las estimaciones filtradas casi coincidirán con las observaciones, y las previsiones parecerán ir por detrás de ellas -que, según tengo entendido, es lo que usted observa-.

No tengo ninguna explicación para lo que menciona en su tercer párrafo.

Yo pensaría que el comportamiento que observas en el cuarto párrafo no es tan anormal: tienes datos mensuales y el filtro de Kalman tiene que asentarse. Para un periodo transitorio (al menos un año) puedes ver un estado errante.

Entiendo que la tendencia lineal local (dlmModPoly(order=2,...)) no necesita dar un ajuste más suave que el modelo de nivel local (dlmModPoly(order=1,...)). Todo depende de los valores de las varianzas ajustadas de los componentes de nivel y pendiente del estado.

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