Edição principal: Gostaria de agradecer muito a Dave e Nick por suas respostas. A boa notícia é que consegui fazer o loop funcionar (princípio emprestado da publicação do Prof. Hydnman na previsão de lotes). Para consolidar as consultas pendentes:
a) Como aumento o número máximo de iterações para auto.arima - parece que, com um grande número de variáveis exógenas, o auto.arima está atingindo o máximo de iterações antes de convergir para um modelo final. Por favor, corrija-me se estou entendendo errado.
b) Uma resposta, de Nick, destaca que minhas previsões para intervalos horários são derivadas apenas desses intervalos horários e não são influenciadas por ocorrências no início do dia. Meus instintos, ao lidar com esses dados, dizem que isso não costuma causar um problema significativo, mas estou aberto a sugestões sobre como lidar com isso.
c) Dave apontou que eu preciso de uma abordagem muito mais sofisticada para identificar os tempos de lead / lag em torno das minhas variáveis preditoras. Alguém tem alguma experiência com uma abordagem programática para isso em R? É claro que espero que haja limitações, mas gostaria de levar esse projeto o mais longe possível, e não duvido que isso deva ser útil para outras pessoas aqui.
d) Nova consulta, mas totalmente relacionada à tarefa em questão - o auto.arima considera os regressores ao selecionar pedidos?
Estou tentando prever visitas a uma loja. Exijo a capacidade de dar conta de férias em movimento, anos bissextos e eventos esporádicos (essencialmente extremos); com base nisso, entendo que o ARIMAX é minha melhor aposta, usando variáveis exógenas para tentar modelar a sazonalidade múltipla e os fatores mencionados acima.
Os dados são gravados 24 horas em intervalos de hora em hora. Isso está provando ser problemático devido à quantidade de zeros nos meus dados, especialmente em horários do dia que apresentam volumes muito baixos de visitas, às vezes nenhum quando a loja acaba de abrir. Além disso, o horário de funcionamento é relativamente irregular.
Além disso, o tempo computacional é enorme ao prever como uma série temporal completa com mais de 3 anos de dados históricos. Imaginei que seria mais rápido computando cada hora do dia como séries temporais separadas, e ao testá-lo em horários mais movimentados do dia parece produzir uma precisão mais alta, mas novamente prova ser um problema nas primeiras / mais tarde horas que não t receber visitas constantemente. Acredito que o processo se beneficiaria do uso do auto.arima, mas ele não parece convergir para um modelo antes de atingir o número máximo de iterações (portanto, usando um ajuste manual e a cláusula maxit).
Tentei manipular dados 'ausentes' criando uma variável exógena para quando visitas = 0. Novamente, isso funciona muito bem para horários mais movimentados do dia, quando o único momento em que não há visitas é quando a loja está fechada para o dia; nesses casos, a variável exógena parece lidar com isso com êxito na previsão e não inclui o efeito do dia anterior ao fechamento. No entanto, não tenho certeza de como usar esse princípio para prever as horas mais tranquilas em que a loja está aberta, mas nem sempre recebe visitas.
Com a ajuda do post do professor Hyndman sobre a previsão de lotes no R, estou tentando configurar um loop para prever a série 24, mas parece que não quero prever a partir das 13h e não consigo descobrir o porquê. Eu recebo "Erro no otim (init [máscara], armafn, método = optim.method, hessian = TRUE,: valor finito de diferença finita não finita [1]" ", mas como todas as séries são de igual comprimento e eu estou essencialmente usando a mesma matriz, não entendo por que isso está acontecendo, o que significa que a matriz não é de classificação completa, não? Como posso evitar isso nessa abordagem?
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()
Eu apreciaria totalmente as críticas construtivas da maneira como estou lidando com isso e qualquer ajuda para fazer esse script funcionar. Estou ciente de que há outro software disponível, mas estou estritamente limitado ao uso de R e / ou SPSS aqui ...
Além disso, sou muito novato nesses fóruns - tentei fornecer uma explicação o mais completa possível, demonstrar as pesquisas anteriores que fiz e também fornecer um exemplo reproduzível; Espero que isso seja suficiente, mas informe-me se houver mais alguma coisa que eu possa fornecer para melhorar minha postagem.
EDIT: Nick sugeriu que eu use totais diários primeiro. Devo acrescentar que testei isso e as variáveis exógenas produzem previsões que capturam sazonalidade diária, semanal e anual. Esse foi um dos outros motivos que pensei em prever a cada hora como uma série separada, mas, como Nick também mencionou, minha previsão para as 16h em um determinado dia não será influenciada pelas horas anteriores.
EDIT: 09/08/13, o problema com o loop estava simplesmente relacionado às ordens originais que eu havia usado para testar. Eu deveria ter percebido isso mais cedo e coloca mais urgência em tentar auto.arima para trabalhar com esses dados - veja os itens a) ed) acima.