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.