Importante modifica: vorrei ringraziare fino in fondo Dave e Nick per le loro risposte. La buona notizia è che ho fatto funzionare il ciclo (principio preso in prestito dal post del Prof. Hydnman sulla previsione in lotti). Per consolidare le query in sospeso:
a) Come faccio ad aumentare il numero massimo di iterazioni per auto.arima - sembra che con un gran numero di variabili esogene auto.arima stia raggiungendo il numero massimo di iterazioni prima di convergere su un modello finale. Per favore, correggimi se lo capisco male.
b) Una risposta, da Nick, evidenzia che le mie previsioni per intervalli orari sono derivate solo da quegli intervalli orari e non sono influenzate da eventi precedenti nella giornata. Il mio istinto, dal trattare questi dati, mi dice che ciò non dovrebbe spesso causare un problema significativo, ma sono aperto a suggerimenti su come gestirli.
c) Dave ha sottolineato che ho bisogno di un approccio molto più sofisticato per identificare i tempi di lead / lag che circondano le mie variabili predittive. Qualcuno ha qualche esperienza con un approccio programmatico a questo in R? Ovviamente mi aspetto che ci siano dei limiti, ma vorrei portare questo progetto il più lontano possibile, e non dubito che questo debba essere utile anche agli altri qui.
d) Nuova query ma completamente correlata all'attività in corso - auto.arima considera i regressori nella selezione degli ordini?
Sto cercando di prevedere le visite in un negozio. Ho bisogno della capacità di rendere conto di vacanze in movimento, anni bisestili ed eventi sporadici (essenzialmente valori anomali); su questa base ritengo che ARIMAX sia la mia migliore scommessa, usando variabili esogene per cercare di modellare la stagionalità multipla e i suddetti fattori.
I dati vengono registrati 24 ore a intervalli di un'ora. Ciò si sta rivelando problematico a causa della quantità di zeri nei miei dati, soprattutto nelle ore del giorno che vedono volumi di visite molto bassi, a volte nessuno quando il negozio è appena stato aperto. Inoltre, gli orari di apertura sono relativamente irregolari.
Inoltre, il tempo di calcolo è enorme quando si prevede come una serie temporale completa con 3 anni + di dati storici. Ho pensato che avrebbe reso più veloce calcolando ogni ora del giorno come serie temporali separate, e quando si esegue il test ad ore più trafficate del giorno sembra produrre una maggiore precisione, ma dimostra ancora una volta di diventare un problema con le prime / successive ore che non t ricevere costantemente visite. Credo che il processo trarrebbe beneficio dall'utilizzo di auto.arima ma non sembra essere in grado di convergere su un modello prima di raggiungere il numero massimo di iterazioni (quindi utilizzando un adattamento manuale e la clausola maxit).
Ho provato a gestire i dati "mancanti" creando una variabile esogena per quando visite = 0. Ancora una volta, questo funziona alla grande per i momenti più affollati della giornata quando l'unica volta che non ci sono visite è quando il negozio è chiuso per la giornata; in questi casi, la variabile esogena sembra gestirla con successo per le previsioni in avanti e senza includere l'effetto del giorno precedentemente chiuso. Tuttavia, non sono sicuro di come utilizzare questo principio per prevedere le ore più tranquille in cui il negozio è aperto ma non sempre riceve visite.
Con l'aiuto del post del Professor Hyndman sulla previsione in batch in R, sto cercando di creare un ciclo per la previsione delle 24 serie, ma non sembra voler prevedere per le 13:00 in poi e non riesco a capire perché. Ottengo "Errore in optim (init [maschera], armafn, method = optim.method, hessian = TRUE,: valore della differenza finita non finita [1]" ma poiché tutte le serie sono di uguale lunghezza e sto essenzialmente usando la stessa matrice, non capisco perché questo accada. Ciò significa che la matrice non è di rango massimo, no? Come posso evitare questo approccio?
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()
Apprezzerei appieno le critiche costruttive sul modo in cui sto procedendo e qualsiasi aiuto per far funzionare questa sceneggiatura. Sono consapevole che esiste un altro software disponibile ma sono strettamente limitato all'uso di R e / o SPSS qui ...
Inoltre, sono molto nuovo in questi forum: ho cercato di fornire una spiegazione quanto più completa possibile, dimostrare la ricerca precedente che ho fatto e fornire anche un esempio riproducibile; Spero che questo sia sufficiente, ma per favore fatemi sapere se c'è qualcos'altro che posso fornire per migliorare il mio post.
EDIT: Nick mi ha suggerito di usare prima i totali giornalieri. Dovrei aggiungere che ho provato questo e le variabili esogene producono previsioni che catturano la stagionalità giornaliera, settimanale e annuale. Questo è stato uno degli altri motivi per cui ho pensato di prevedere ogni ora come una serie separata anche se, come ha anche detto Nick, la mia previsione per le 16:00 in un dato giorno non sarà influenzata dalle ore precedenti della giornata.
EDIT: 09/08/13, il problema con il loop era semplicemente dovuto agli ordini originali che avevo usato per i test. Avrei dovuto individuarlo prima e dare maggiore urgenza al tentativo di auto.arima di lavorare con questi dati - vedere i punti a) e d) sopra.