Análisis diario de series de tiempo

25

Estoy tratando de hacer análisis de series de tiempo y soy nuevo en este campo. Tengo un recuento diario de un evento del 2006 al 2009 y quiero ajustarle un modelo de serie temporal. Aquí está el progreso que he hecho:

timeSeriesObj = ts(x,start=c(2006,1,1),frequency=365.25)
plot.ts(timeSeriesObj)

La trama resultante que obtengo es:

Diagrama de series de tiempo

Para verificar si hay estacionalidad y tendencia en los datos o no, sigo los pasos mencionados en esta publicación :

ets(x)
fit <- tbats(x)
seasonal <- !is.null(fit$seasonal)
seasonal

y en el blog de Rob J Hyndman :

library(fma)
fit1 <- ets(x)
fit2 <- ets(x,model="ANN")

deviance <- 2*c(logLik(fit1) - logLik(fit2))
df <- attributes(logLik(fit1))$df - attributes(logLik(fit2))$df 
#P value
1-pchisq(deviance,df)

Ambos casos indican que no hay estacionalidad.

Cuando trazo el ACF y el PACF de la serie, esto es lo que obtengo:

ACF PACF

Mis preguntas son:

  1. ¿Es esta la forma de manejar datos diarios de series temporales? Esta página sugiere que debería mirar tanto los patrones semanales como los anuales, pero el enfoque no me resulta claro.

  2. No sé cómo proceder una vez que tengo las parcelas ACF y PACF.

  3. ¿Puedo simplemente usar la función auto.arima?

    ajuste <- arima (myts, orden = c (p, d, q)

***** Resultados de Auto.Arima actualizados ******

Cuando cambio la frecuencia de los datos a 7 de acuerdo con los comentarios de Rob Hyndman aquí , auto.arima selecciona un modelo ARIMA estacional y genera:

Series: timeSeriesObj 
ARIMA(1,1,2)(1,0,1)[7]                    

Coefficients:
       ar1      ma1     ma2    sar1     sma1
      0.89  -1.7877  0.7892  0.9870  -0.9278
s.e.   NaN      NaN     NaN  0.0061   0.0162

sigma^2 estimated as 21.72:  log likelihood=-4319.23
AIC=8650.46   AICc=8650.52   BIC=8682.18 

****** Actualización de estacionalidad ******

Cuando pruebo la estacionalidad con frecuencia 7, da como resultado True pero con la estacionalidad 365.25, da como resultado false. ¿Es esto suficiente para concluir la falta de estacionalidad anual?

timeSeriesObj = ts(x,start=c(2006,1,1),frequency=7)
fit <- tbats(timeSeriesObj)
seasonal <- !is.null(fit$seasonal)
seasonal

devoluciones:

True

mientras

timeSeriesObj = ts(x,start=c(2006,1,1),frequency=365.25)
fit <- tbats(timeSeriesObj)
seasonal <- !is.null(fit$seasonal)
seasonal

devoluciones:

False
statBeginner
fuente
¿Qué salida str(x)produce?
S. Kolassa - Restablece a Mónica el
Produce num [1: 1460] 17 12 12 17 13 14 14 5 12 21 ...
statBeginner
¿Podría publicar los datos?
pronosticador
Desafortunadamente no puedo.
statBeginner 01 de
3
Bien, confiaría en la inspección visual y el conocimiento del dominio además de las pruebas estadísticas para detectar la estacionalidad. A su pregunta sobre si Arima puede manejar la estacionalidad múltiple: seguro que ARIMA manejará cualquier tipo de estacionalidad, Rsimple no tiene la capacidad de manejarlo. Buscaría soluciones comerciales si hay un alto costo de inventario / fabricación involucrado para el producto que está tratando de pronosticar. Rtiene limitaciones severas para pronosticar tareas como la suya. Mire las preguntas sobre el pronóstico diario en otro lugar de este sitio.
pronosticador

Respuestas:

25

Su ACF y PACF indican que al menos tiene una estacionalidad semanal, que se muestra en los picos en los rezagos 7, 14, 21 y así sucesivamente.

También puede tener una estacionalidad anual, aunque no es obvio por su serie de tiempo.

Su mejor apuesta, dada la posibilidad de múltiples estacionalidades, puede ser un tbatsmodelo, que explícitamente modela múltiples tipos de estacionalidad. Cargue el forecastpaquete:

library(forecast)

Su salida de str(x)indica que xaún no contiene información sobre potencialmente tener múltiples estacionalidades. Mira ?tbatsy compara la salida de str(taylor). Asignar las estacionalidades:

x.msts <- msts(x,seasonal.periods=c(7,365.25))

Ahora puedes ajustar un tbatsmodelo. (Sea paciente, esto puede llevar un tiempo).

model <- tbats(x.msts)

Finalmente, puede pronosticar y trazar:

plot(forecast(model,h=100))

No se debe utilizar arima()o auto.arima(), ya que éstos sólo pueden manejar un solo tipo de estacionalidad: ya sea semanal o anual. No me preguntes qué auto.arima()haría con tus datos. Puede elegir una de las estacionalidades, o puede ignorarlas por completo.


EDITAR para responder preguntas adicionales de un comentario:

  1. ¿Cómo puedo verificar si los datos tienen una estacionalidad anual o no? ¿Puedo crear otra serie de número total de eventos por mes y usar su ACF para decidir esto?

Calcular un modelo sobre datos mensuales podría ser una posibilidad. Entonces podría, por ejemplo, comparar AIC entre modelos con y sin estacionalidad.

Sin embargo, prefiero usar una muestra reservada para evaluar los modelos de pronóstico. Mantenga los últimos 100 puntos de datos. Ajuste un modelo con estacionalidad anual y semanal al resto de los datos (como arriba), luego ajuste uno con solo estacionalidad semanal, por ejemplo, usando auto.arima()un tscon frequency=7. Pronostique utilizando ambos modelos en el período de espera. Verifique cuál tiene un error más bajo, utilizando MAE, MSE o lo que sea más relevante para su función de pérdida. Si hay poca diferencia entre los errores, vaya con el modelo más simple; de lo contrario, use el que tenga el error más bajo.

La prueba del budín está en comer, y la prueba del modelo de serie temporal está en el pronóstico.

Para mejorar las cosas, no use una sola muestra reservada (que puede ser engañosa, dado el aumento al final de su serie), sino que use pronósticos de origen sucesivos, que también se conoce como "validación cruzada de series temporales" . (Recomiendo mucho todo el libro de texto de pronóstico gratuito en línea .

  1. Entonces, ¿los modelos ARIMA estacionales generalmente no pueden manejar múltiples estacionalidades? ¿Es una propiedad del modelo mismo o es solo la forma en que se escriben las funciones en R?

Los modelos ARIMA estándar manejan la estacionalidad por diferenciación estacional. Para los datos mensuales estacionales, no modelaría las series temporales sin procesar, sino las series temporales de diferencias entre marzo de 2015 y marzo de 2014, entre febrero de 2015 y febrero de 2014, etc. (Para obtener pronósticos en la escala original, por supuesto necesitaría volver a diferenciar).

No existe una forma obvia de extender esta idea a múltiples estacionalidades.

Por supuesto, puede hacer algo con ARIMAX, por ejemplo, al incluir dummies mensuales para modelar la estacionalidad anual, luego modelar los residuos usando ARIMA estacional semanal. Si desea hacer esto en R, use ts(x,frequency=7), cree una matriz de dummies mensuales e ingrese eso en el xregparámetro de auto.arima().

No recuerdo ninguna publicación que extienda ARIMA específicamente a múltiples estacionalidades, aunque estoy seguro de que alguien ha hecho algo similar en mi párrafo anterior.

S. Kolassa - Restablece a Monica
fuente
Aquí hay algunas preguntas que he basado en su respuesta: 1. ¿Cómo puedo verificar si los datos tienen una estacionalidad anual o no? ¿Puedo crear otra serie de número total de eventos por mes y usar su acf para decidir esto? 2. Entonces, ¿los modelos ARIMA estacionales no pueden manejar múltiples estacionalidades? ¿Es una propiedad del modelo mismo o es solo la forma en que se escriben las funciones en R?
statBeginner 01 de
Publicación actualizada con resultados de Auto.Arima con estacionalidad semanal
statBeginner
1
@StephanKolassa, encontré este artículo de AT&T hace un tiempo que usa múltiples ARIMA estacionales. No es posible un modelo como el del artículo R, ya Rque no tiene la capacidad de manejar ARIMA multiseasonal.
pronosticador
2
@forecaster: genial, gracias! Parece que hacen doble diferenciación en la ecuación 3.1. Estoy un poco preocupado por perder muchos datos de esa manera. Desafortunadamente, no comparan sus resultados con un punto de referencia simple , por ejemplo, las demandas de la semana pasada. Lo que me gusta es cómo también investigan las combinaciones de pronósticos entre su DSARIMA y un tbatsmodelo similar.
S. Kolassa - Restablece a Mónica el
3
@StephanKolassa Estoy de acuerdo, soy un gran defensor del uso del pronóstico ingenuo como punto de referencia, como lo respaldan los Principios de pronóstico de Armstrong, y solo agrego complejidad si mejora la precisión. Terminé en el percentil 2 superior en algunas competiciones de kaggle usando métodos ingenuos en mis conjuntos.
pronosticador
4

La mejor manera de descomponer los datos estacionales utilizando los paquetes R existentes es ceemdan () en Rlibeemd. Esta técnica extrae la estacionalidad de múltiples períodos. Los valores predeterminados funcionan bien. Utiliza la transformación de Hilbert-Huang en lugar de la transformación de Fourier. La transformación de Fourier tiene un grave inconveniente, ya que solo puede manejar datos estacionarios y lineales cuando la mayoría de las series de interés no lo son. Por ejemplo, la caminata aleatoria y_t = y_ {t-1} + e_t es la caminata aleatoria más simple y frecuente. Otros métodos mantienen fija la amplitud de la variación estacional cuando a menudo varía en la práctica.

usuario162655
fuente
1
Consulte el tutorial básico y la referencia de MathJax para obtener ayuda sobre cómo poner las matemáticas en respuestas. Ofrezca también alguna justificación del reclamo de " mejor " (o considere modificar el reclamo): tendría que ser al menos tan bueno como cualquier otra opción, no solo la mayoría de ellos.
Glen_b -Reinstale a Monica
2
Vale la pena mencionar que este paquete está en CRAN
Glen_b -Reinstate Monica
3

Las preguntas que plantea han sido tratadas en R Time Series Forecasting: Preguntas sobre mi resultado . Lea atentamente mi respuesta detallada y todos los comentarios en la discusión, incluidos los de la pregunta original, ya que creo que son relevantes para su problema. En realidad, puede tomar los datos que se proporcionaron en la publicación y usarlos como un momento de enseñanza para usted. Use toda la discusión como una guía para lo que debe hacer.

IrishStat
fuente
1
¡Muchas gracias! Usaré los datos de esa publicación para probar cosas.
statBeginner 01 de