Pronosticar series de tiempo por hora con periodicidad diaria, semanal y anual

12

Edición importante: Me gustaría dar las gracias a Dave y Nick hasta ahora por sus respuestas. La buena noticia es que obtuve el bucle para trabajar (principio prestado de la publicación del Prof. Hydnman sobre pronóstico de lotes). Para consolidar las consultas pendientes:

a) ¿Cómo puedo aumentar la cantidad máxima de iteraciones para auto.arima? Parece que con una gran cantidad de variables exógenas, auto.arima está alcanzando las iteraciones máximas antes de converger en un modelo final. Por favor corrígeme si estoy malinterpretando esto.

b) Una respuesta, de Nick, resalta que mis predicciones para los intervalos por hora se derivan solo de esos intervalos por hora y no están influenciadas por las ocurrencias más temprano en el día. Mis instintos, al tratar con estos datos, me dicen que esto no debería causar un problema significativo, pero estoy abierto a sugerencias sobre cómo lidiar con esto.

c) Dave ha señalado que necesito un enfoque mucho más sofisticado para identificar los tiempos de adelanto / retraso que rodean mis variables predictoras. ¿Alguien tiene alguna experiencia con un enfoque programático para esto en R? Por supuesto, espero que haya limitaciones, pero me gustaría llevar este proyecto lo más lejos que pueda, y no dudo que esto también sea útil para otros aquí.

d) Nueva consulta pero totalmente relacionada con la tarea en cuestión: ¿Auto.arima considera los regresores al seleccionar los pedidos?

Estoy tratando de pronosticar visitas a una tienda. Exijo la capacidad de tener en cuenta las vacaciones en movimiento, los años bisiestos y los eventos esporádicos (esencialmente valores atípicos); Sobre esta base, deduzco que ARIMAX es mi mejor opción, utilizando variables exógenas para tratar de modelar la estacionalidad múltiple, así como los factores antes mencionados.

Los datos se registran 24 horas a intervalos de una hora. Esto está demostrando ser problemático debido a la cantidad de ceros en mis datos, especialmente en momentos del día que ven volúmenes muy bajos de visitas, a veces ninguno cuando la tienda acaba de abrir. Además, el horario de atención es relativamente errático.

Además, el tiempo computacional es enorme cuando se pronostica como una serie de tiempo completa con más de 3 años de datos históricos. Pensé que lo haría más rápido al calcular cada hora del día como series de tiempo separadas, y cuando probar esto en las horas más ocupadas del día parece producir una mayor precisión, pero nuevamente se convierte en un problema con las horas tempranas / posteriores que no t constantemente recibe visitas. Creo que el proceso se beneficiaría con el uso de auto.arima, pero no parece ser capaz de converger en un modelo antes de alcanzar el número máximo de iteraciones (por lo tanto, usando un ajuste manual y la cláusula maxit).

He tratado de manejar los datos 'perdidos' creando una variable exógena para cuando las visitas = 0. Nuevamente, esto funciona muy bien para las horas más ocupadas del día cuando la única vez que no hay visitas es cuando la tienda está cerrada por el día; en estos casos, la variable exógena parece manejar esto con éxito para pronosticar hacia adelante y no incluye el efecto del día que se cerró anteriormente. Sin embargo, no estoy seguro de cómo usar este principio para predecir las horas más tranquilas donde la tienda está abierta, pero no siempre recibe visitas.

Con la ayuda de la publicación del profesor Hyndman sobre el pronóstico por lotes en R, estoy tratando de establecer un ciclo para pronosticar la serie 24, pero parece que no quiere pronosticar para la 1 p.m. en adelante y no puedo entender por qué. Obtengo "Error en optim (init [máscara], armafn, method = optim.method, hessian = TRUE,: valor de diferencia finita no finita [1]" pero como todas las series son de igual longitud y esencialmente estoy usando la misma matriz, no entiendo por qué sucede esto, lo que significa que la matriz no tiene rango completo, ¿no? ¿Cómo puedo evitar esto en este enfoque?

https://www.dropbox.com/s/26ov3xp4ayig4ws/Data.zip

date()

#Read input files
INPUT <- read.csv("Input.csv")
XREGFDATA <- read.csv("xreg.csv")

#Subset time series data from the input file
TS <- ts(INPUT[,2:25], f=7)


fcast <- matrix(0, nrow=nrow(XREGFDATA),ncol=ncol(TS))

#Create matrix of exogenous variables for forecasting.
xregf <- (cbind(Weekday=model.matrix(~as.factor(XREGFDATA$WEEKDAY)),
                    Month=model.matrix(~as.factor(XREGFDATA$MONTH)),
                Week=model.matrix(~as.factor(XREGFDATA$WEEK)),
                    Nodata=XREGFDATA$NoData,
                NewYearsDay=XREGFDATA$NewYearsDay,
                    GoodFriday=XREGFDATA$GoodFriday,
                EasterWeekend=XREGFDATA$EasterWeekend,
                    EasterMonday=XREGFDATA$EasterMonday,
                MayDay=XREGFDATA$MayDay,
                    SpringBH=XREGFDATA$SpringBH,
                SummerBH=XREGFDATA$SummerBH,
                    Christmas=XREGFDATA$Christmas,
                BoxingDay=XREGFDATA$BoxingDay))
#Remove intercepts
xregf <- xregf[,c(-1,-8,-20)]

NoFcast <- 0

for(i in 1:24) {

  if(max(INPUT[,i+1])>0) {

  #The exogenous variables used to fit are the same for all series except for the
  #'Nodata' variable. This is to handle missing data for each series
   xreg <- (cbind(Weekday=model.matrix(~as.factor(INPUT$WEEKDAY)),
                     Month=model.matrix(~as.factor(INPUT$MONTH)),
                 Week=model.matrix(~as.factor(INPUT$WEEK)),
                     Nodata=ifelse(INPUT[,i+1] < 1,1,0),
                     NewYearsDay=INPUT$NewYearsDay,
                 GoodFriday=INPUT$GoodFriday,
                     EasterWeekend=INPUT$EasterWeekend,
                 EasterMonday=INPUT$EasterMonday,
                     MayDay=INPUT$MayDay,
                 SpringBH=INPUT$SpringBH,
                     SummerBH=INPUT$SummerBH,
                 Christmas=INPUT$Christmas,
                     BoxingDay=INPUT$BoxingDay))
  xreg <- xreg[,c(-1,-8,-20)]

  ARIMAXfit <- Arima(TS[,i], 
                     order=c(0,1,8), seasonal=c(0,1,0),
                     include.drift=TRUE,
                     xreg=xreg,
                     lambda=BoxCox.lambda(TS[,i])
                     ,optim.control = list(maxit=1500), method="ML")  


  fcast[,i] <- forecast(ARIMAXfit, xreg=xregf)$mean

 } else{
  NoFcast <- NoFcast +1
 }
}

#Save the forecasts to .csv
write(t(fcast),file="fcasts.csv",sep=",",ncol=ncol(fcast))


date()

Agradecería totalmente las críticas constructivas sobre la forma en que estoy haciendo esto y cualquier ayuda para que este script funcione. Soy consciente de que hay otro software disponible, pero estoy estrictamente limitado al uso de R y / o SPSS aquí ...

Además, soy muy nuevo en estos foros: he intentado ofrecer una explicación lo más completa posible, demostrar la investigación previa que he realizado y también proporcionar un ejemplo reproducible; Espero que esto sea suficiente, pero avíseme si hay algo más que pueda proporcionar para mejorar mi publicación.

EDITAR: Nick sugirió que use los totales diarios primero. Debo agregar que he probado esto y que las variables exógenas producen pronósticos que capturan la estacionalidad diaria, semanal y anual. Esta fue una de las otras razones por las que pensé pronosticar cada hora como una serie separada, aunque, como Nick también mencionó, mi pronóstico para las 4 p.m. de un día determinado no se verá influido por las horas anteriores del día.

EDITAR: 08/09/13, el problema con el bucle era simplemente con las órdenes originales que había usado para probar. Debería haberlo detectado antes y poner más urgencia en tratar de auto.arima para trabajar con estos datos; consulte el punto a) yd) anterior.

krcooke
fuente
Además, traté de usar Fourier para cuidar la estacionalidad pero devolví el mismo error "Error en optim (init [máscara], armafn, método = optim.method, hessian = TRUE,: valor de diferencia finita no finita [1]" incluso cuando se usa como una matriz por sí sola sin otras variables exógenas. ¿Podría alguien ayudarme con una explicación de por qué ese sería el caso?
krcooke
¿podría volver a cargar los datos?
MyHeadHurts

Respuestas:

4

Lamentablemente, su misión está condenada al fracaso ya que está restringido a R y SPSS. Debe identificar la estructura de relación de adelanto y retraso para cada uno de los eventos / vacaciones / variables exógenas que pueden entrar en juego. Debe detectar posibles tendencias de tiempo que SPSS no puede hacer. Debe incorporar Tendencias / Predicciones diarias en cada una de las predicciones por hora para proporcionar una predicción consolidada. Debe preocuparse por cambiar los parámetros y cambiar la varianza. Espero que esto ayude. Hemos estado modelando este tipo de datos durante años de manera automática, sujeto por supuesto a controles opcionales especificados por el usuario.

EDITAR: Como OP solicitó, presento aquí un análisis típico. Tomé uno si las horas más ocupadas y desarrollé un modelo diario. En un análisis completo, se desarrollarían las 24 horas y también un modelo diario para conciliar los pronósticos. A continuación se incluye una lista parcial del modelo ingrese la descripción de la imagen aquí. Además de los regresores significativos (tenga en cuenta que se ha omitido la estructura real de adelanto y retraso), hubo indicadores que reflejan la estacionalidad, los cambios de nivel, los efectos diarios, los cambios en los efectos diarios y los valores inusuales que no son consistentes con la historia. Las estadísticas del modelo son ingrese la descripción de la imagen aquí. Aquí se muestra una gráfica de los pronósticos para los próximos 360 días ingrese la descripción de la imagen aquí. El gráfico Actual / Ajuste / Pronóstico resume claramente los resultadosingrese la descripción de la imagen aquíCuando se enfrenta a un problema tremendamente complejo (¡como este!) Uno debe presentarse con mucho coraje, experiencia y ayudas informáticas para la productividad. Simplemente informe a su gerencia que el problema se puede resolver, pero no necesariamente mediante el uso de herramientas primitivas. Espero que esto le anime a continuar sus esfuerzos, ya que sus comentarios anteriores han sido muy profesionales, orientados al enriquecimiento personal y al aprendizaje. Agregaría que uno necesita conocer el valor esperado de este análisis y usarlo como una guía cuando considere un software adicional. Quizás necesite una voz más alta para ayudar a dirigir a sus "directores" hacia una solución factible para esta tarea desafiante.

Después de revisar los Totales diarios y cada uno de los Modelos de 24 horas, ¡definitivamente reflejaría que el Número de visitas está en un serio descenso! Este tipo de análisis realizado por un posible comprador sugeriría una no compra, mientras que un vendedor sería prudente redoblar sus esfuerzos para vender el negocio basándose en esta proyección muy negativa.

IrishStat
fuente
Hola Dave, muchas gracias por tomarte el tiempo de leer mi pregunta y responder. Entiendo que su software va más allá de cualquier alternativa, pero desafortunadamente no es una opción para mí por el momento. Conociendo las capacidades de R, ¿hay algún consejo que pueda ofrecerme para mejorar lo que ya he hecho? Saludos cordiales,
krcooke
@krcooke Puede examinar la correlación cruzada entre visitas y pistas / retrasos alternativos alrededor de cada uno de sus regresores para identificar la respuesta adecuada. Estoy totalmente de acuerdo con Nick en que algunos regresores pueden ser útiles para algunas horas pero no para otras. Puede modelar cada hora por separado. La detección de los 4 tipos de valores atípicos (pulso, cambio de nivel, pulso estacional y tendencias de tiempo) no está disponible en SAS cuando tiene causales y probablemente no esté disponible en SPSS. He descargado sus datos y usaré AUTOBOX . Siempre estamos buscando "datos difíciles" como los suyos para fortalecer nuestros análisis.
IrishStat
Hola Dave, veré qué puedo hacer en torno al análisis de los regresores. Sentí que los regresores que utilicé eran muy 'estándar' y que probablemente impactarían en todas esas tiendas. Usé el fin de semana festivo de jubileo como ejemplo en el comentario de Nick; Esto probablemente se beneficiaría del uso de regresores, pero no lo he incluido por ahora. ¡Y estoy muy interesado en ver qué puede hacer con los datos! Gracias de nuevo.
krcooke
77
" Desafortunadamente, su misión está condenada al fracaso ya que está restringido a R y SPSS ". Este comentario, lamentablemente, va demasiado lejos. cualquier lenguaje completo de Turing puede implementar cualquier algoritmo escrito en cualquier otro, incluso si solo es programable en código de máquina mediante la activación de interruptores y está completamente implementado en Lego. No hay cálculo que se pueda implementar en uno que no se pueda hacer en otro. A menos que esté reclamando propiedades mágicas para AUTOBOX, creo que lo que probablemente quiere decir es algo como "ya disponible como funciones en la distribución de vainilla" como la diferencia.
Glen_b -Reinstale a Monica el
@Glen_b Lo que podría haber dicho es que la potencia de fuego en las distribuciones de vainilla que está utilizando es insuficiente para resolver el problema en cuestión a menos que tenga mucho tiempo libre para escribir nuevos procedimientos.
IrishStat
10

Esto no es más que un paquete de comentarios, pero será demasiado largo para ese formato. No soy más que un aficionado de series de tiempo, pero tengo algunas sugerencias simples.

  1. Puede estar bajo órdenes aquí, pero creo que esto necesita un poco de agudización en términos de lo que espera lograr y lo que es más importante para usted. El pronóstico de visitas es, desafortunadamente, un objetivo difuso. Por ejemplo, supongamos que son las 4 de la tarde y desea pronosticar visitas con una hora de anticipación. ¿Realmente necesitas un supermodelo que incorpore un tratamiento de toda la serie anterior? Esto debe provenir de cierta consideración de los objetivos prácticos y / o científicos reales, que pueden ser estipulados por sus superiores o un cliente o pueden ser suyos como investigadores. Sospecho que es más probable que se necesiten diferentes modelos para diferentes propósitos.

  2. La separación de series por hora parece estar impulsada por la idea de reducir el cómputo sin tener en cuenta cuánto sentido tiene. Entonces, la implicación es que no (no) usará la información de hoy para predecir lo que está sucediendo a las 4 p. M., ¿Solo todas las observaciones previas a las 4 p.m.? Me parece que necesita mucho hablar.

  3. Evidentemente, usted es un aprendiz en series de tiempo (y me estoy poniendo a la par), pero ningún alumno debería comenzar con un problema tan grande. ¡De Verdad! Tiene muchos datos, tiene periodicidades en varias escalas, tiene irregularidades en los horarios de apertura y días festivos, tiene variables exógenas: ha elegido un problema muy difícil. (¿Qué pasa con las tendencias también?) Es fácil de decir, pero evidentemente te ha pasado por alto: es posible que primero tengas que trabajar en versiones muy simplificadas del problema y tener una idea de cómo adaptar modelos más simples. Evidentemente, incluir todo en un modelo grande y complicado no está funcionando bien, y parece que se requiere algo radicalmente más simple, o darse cuenta de que el proyecto es posiblemente demasiado ambicioso.

Nick Cox
fuente
Hola Nick, 1- ¡De hecho estoy bajo órdenes! El objetivo es tratar de construir un modelo para que no tenga una previsión excesiva (lo que resulta en una pérdida de horas de personal) o una previsión insuficiente (para que el personal no se sienta abrumado). 2- Lo consideré pero profundizaré para comprender lo que gano / pierdo de esta manera. Pronosticar como una serie parecía similar a un 'supermodelo' como lo expresas. 3- Soy consciente de que esto es extremadamente difícil y que estoy golpeando por encima de mi peso en este momento, pero estoy completamente abierto a una solución más simple que también me funcionará aquí. Muchas gracias por tus pensamientos, Nick.
krcooke
En términos de soluciones más simples, no podría trabajar con técnicas de suavizado exponencial de tal manera que el período de fin de semana de jubileo del año pasado provoque que este año (mismo período) se sobreestime. Debido al tipo de valores atípicos involucrados, sentí que tenía que usar absolutamente variables exógenas. ¿Tienes alguna otra idea que pueda explorar?
krcooke
Todo lo que puedo decir es lo que haría si estuviera bajo órdenes y tuviera exactamente la información que usted proporciona aquí. Mi instinto sería el primero en agregar a los totales diarios y trabajar con ellos. Eso ya es bastante difícil. Es mucho más fácil ser crítico aquí ...
Nick Cox
Hola Nick, es mi culpa, ya debería haber dicho que he intentado esto. Con totales diarios los resultados parecían razonables. Razonable ser la palabra clave porque, como usted y Dave han dicho, hay mucho más que considerar aquí. Si es de interés, puedo volver a ejecutar los datos diarios y demostrar que captura la estacionalidad semanal, mensual y anual. Por eso pensé en pronosticar cada hora como una serie diaria.
krcooke
Uno de los problemas que tuve, como se mencionó en la primera publicación, es que auto.arima alcanza las iteraciones máximas antes de converger, por eso estoy usando parámetros bastante generalizados con Arima (). ¡Cualquier orientación sobre cómo puedo superar esto sería muy apreciada!
krcooke