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.
Respuestas:
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 . 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 . Aquí se muestra una gráfica de los pronósticos para los próximos 360 días . El gráfico Actual / Ajuste / Pronóstico resume claramente los resultadosCuando 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.
fuente
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.
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.
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.
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.
fuente