22 votos

Auto.arima con datos diarios: ¿cómo captar la estacionalidad/periodicidad?

Estoy ajustando un modelo ARIMA a una serie temporal diaria. Los datos se recogen diariamente desde el 02-01-2010 hasta el 30-07-2011 y se refieren a las ventas de periódicos. Dado que se puede encontrar un patrón semanal en las ventas (la cantidad media diaria de ejemplares vendidos suele ser la misma de lunes a viernes, y luego aumenta el sábado y el domingo), estoy tratando de capturar esta "estacionalidad". Dados los "datos" de ventas, creo las series temporales de la siguiente manera:

salests<-ts(data,start=c(2010,1),frequency=365)

y luego utilizo la función auto.arima(.) para seleccionar el mejor modelo ARIMA mediante el criterio AIC. El resultado es siempre un modelo ARIMA no estacional, pero si pruebo algún modelo SARIMAs con la siguiente sintaxis como ejemplo:

sarima1<-arima(salests, order = c(2,1,2), seasonal = list(order = c(1, 0, 1), period = 7))

Puedo obtener mejores resultados. ¿Hay algún error en el comando ts / especificación arima? El patrón semanal es muy fuerte por lo que no esperaría tantas dificultades para capturarlo. Cualquier ayuda sería muy útil. Muchas gracias, Giulia Deppieri

Actualización:

Ya he cambiado algunos argumentos. Más concretamente, el procedimiento selecciona ARIMA(4,1,3) como el mejor modelo cuando establezco D=7 pero el AIC y los demás índices de bondad de ajuste (y también las previsiones) no mejoran en absoluto. ¡Supongo que hay algún error debido a la confusión entre estacionalidad y periodicidad ?!

Llamada Auto.arima utilizada y salida obtenida:

modArima<-auto.arima(salests,D=7,max.P = 5, max.Q = 5)

 ARIMA(2,1,2) with drift         : 1e+20
 ARIMA(0,1,0) with drift         : 5265.543
 ARIMA(1,1,0) with drift         : 5182.772
 ARIMA(0,1,1) with drift         : 1e+20
 ARIMA(2,1,0) with drift         : 5137.279
 ARIMA(2,1,1) with drift         : 1e+20
 ARIMA(3,1,1) with drift         : 1e+20
 ARIMA(2,1,0)                    : 5135.382
 ARIMA(1,1,0)                    : 5180.817
 ARIMA(3,1,0)                    : 5117.714
 ARIMA(3,1,1)                    : 1e+20
 ARIMA(4,1,1)                    : 5045.236
 ARIMA(4,1,1) with drift         : 5040.53
 ARIMA(5,1,1) with drift         : 1e+20
 ARIMA(4,1,0) with drift         : 5112.614
 ARIMA(4,1,2) with drift         : 4953.417
 ARIMA(5,1,3) with drift         : 1e+20
 ARIMA(4,1,2)                    : 4960.516
 ARIMA(3,1,2) with drift         : 1e+20
 ARIMA(5,1,2) with drift         : 1e+20
 ARIMA(4,1,3) with drift         : 4868.669
 ARIMA(5,1,4) with drift         : 1e+20
 ARIMA(4,1,3)                    : 4870.92
 ARIMA(3,1,3) with drift         : 1e+20
 ARIMA(4,1,4) with drift         : 4874.095

 Best model: ARIMA(4,1,3) with drift        

Así que supongo que la función arima se debe utilizar como:

bestOrder <- cbind(modArima$arma[1],modArima$arma[5],modArima$arma[2])
sarima1<-arima(salests, order = c(4,1,3))

sin parámetros de componentes estacionales ni especificaciones de periodos. Los datos y el análisis exploratorio muestran que se puede considerar aproximadamente el mismo patrón semanal para cada semana, con la única excepción de agosto de 2010 (cuando se registra un aumento constante de las ventas). Lamentablemente, no tengo ninguna experiencia en la modelización de series temporales, de hecho, estoy probando este enfoque con el fin de encontrar una solución alternativa a otros modelos paramétricos y no paramétricos que he intentado ajustar para estos datos problemáticos. También tengo muchas variables numéricas dependientes, pero han mostrado un bajo poder para explicar la variable de respuesta: sin duda, la parte más difícil de modelar es el componente temporal. Además, la construcción de variables ficticias para representar los meses y los días de la semana resultó no ser una solución sólida.

32voto

Senseful Puntos 116

Si hay estacionalidad semanal, fije el periodo estacional en 7.

salests <- ts(data,start=2010,frequency=7) 
modArima <- auto.arima(salests)

Obsérvese que la selección de la diferenciación estacional no fue muy buena en auto.arima() hasta hace muy poco. Si está utilizando la versión 2.xx de la aplicación forecast paquete, set D=1 en la llamada a auto.arima() para forzar la diferenciación estacional. Si utiliza la versión 3.xx del programa forecast la selección automática de D funciona mucho mejor (utilizando una prueba OCSB en lugar de una prueba CH).

No intente comparar el AIC para modelos con diferentes niveles de diferenciación. No son directamente comparables. Sólo puede comparar de forma fiable el AIC con modelos que tengan los mismos órdenes de diferenciación.

No es necesario volver a ajustar el modelo después de llamar a auto.arima() . Devolverá un objeto Arima, como si hubieras llamado a arima() con el orden del modelo seleccionado.

19voto

Owen Fraser-Green Puntos 642

El problema de ajustar el ARIMA estacional a datos diarios es que el "componente estacional" puede que sólo funcione los fines de semana o quizá sólo los días laborables, por lo que en general hay un "componente estacional" no significativo. Ahora lo que tiene que hacer es aumentar su conjunto de datos con 6 variables ficticias que representen los días de la semana y quizás indicadores mensuales para representar los efectos anuales. Ahora considere la posibilidad de incorporar acontecimientos como los días festivos e incluya cualquier efecto de adelanto, desactualización o retraso en torno a estas variables conocidas. No puede haber valores inusuales (pulsos) o cambios de nivel o tendencias temporales locales en los datos. Además, los efectos del día de la semana pueden haber cambiado con el tiempo, por ejemplo, no hubo efecto sábado en las primeras 20 semanas, pero sí en las últimas 50. Si desea publicar los datos diarios de los recorridos, lo intentaré y quizá otros lectores de la lista también puedan contribuir con sus análisis para orientarle.

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