Previsione di serie temporali orarie con periodicità giornaliera, settimanale e annuale


12

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.


Inoltre, ho provato a utilizzare Fourier per occuparmi della stagionalità ma ho restituito lo stesso errore "Errore in optim (init [maschera], armafn, method = optim.method, hessian = TRUE,: valore di differenza finita non finito [1]" anche se usato come matrice da solo senza altre variabili esogene. Per favore qualcuno potrebbe aiutarmi con una spiegazione sul perché sarebbe così?
krcooke

potresti ricaricare i dati?
MyHeadHurts,

Risposte:


4

Sfortunatamente la tua missione è destinata al fallimento poiché sei limitato a R e SPSS. È necessario identificare la struttura delle relazioni di lead e lag per ciascuno degli eventi / festività / variabili esogene che possono entrare in gioco. È necessario rilevare possibili tendenze temporali che SPSS non può fare. È necessario incorporare le tendenze / previsioni giornaliere in ciascuna delle previsioni orarie al fine di fornire una previsione consolidata riconciliata. Devi preoccuparti di cambiare i parametri e cambiare la varianza. Spero che questo ti aiuti. Abbiamo modellato questo tipo di dati per anni in modo automatico, ovviamente con controlli opzionali specifici dell'utente.

EDIT: Come richiesto dall'OP, presento qui un'analisi tipica. Ne ho preso uno se le ore più occupate e sviluppato un modello giornaliero. In un'analisi completa, tutte le 24 ore verrebbero sviluppate e anche un modello giornaliero al fine di conciliare le previsioni. Di seguito è riportato un elenco parziale del modello inserisci qui la descrizione dell'immagine. Oltre ai regressori significativi (si noti che l'attuale struttura di lead e lag è stata omessa) c'erano indicatori che riflettono la stagionalità, i cambiamenti di livello, gli effetti giornalieri, i cambiamenti negli effetti giornalieri e valori insoliti non coerenti con la storia. Le statistiche del modello sono inserisci qui la descrizione dell'immagine. Un diagramma delle previsioni per i prossimi 360 giorni è mostrato qui inserisci qui la descrizione dell'immagine. Il grafico Attuale / Adatta / Previsione riassume accuratamente i risultatiinserisci qui la descrizione dell'immagineDi fronte a un problema tremendamente complesso (come questo!) Bisogna presentarsi con molto coraggio, esperienza e aiuti alla produttività del computer. Avvisare il proprio management che il problema è risolvibile, ma non necessariamente utilizzando strumenti primitivi. Spero che questo ti incoraggi a continuare nei tuoi sforzi poiché i tuoi commenti precedenti sono stati molto professionali, orientati verso l'arricchimento e l'apprendimento personale. Aggiungerei che bisogna conoscere il valore atteso di questa analisi e usarlo come linea guida quando si considera un software aggiuntivo. Forse hai bisogno di una voce più forte per aiutare i tuoi "registi" verso una soluzione fattibile a questo compito impegnativo.

Dopo aver esaminato i totali giornalieri e ciascuno dei 24 modelli orari, rifletterei sicuramente che il numero di visite è in grave calo! Questo tipo di analisi da parte di un potenziale acquirente suggerirebbe un mancato acquisto, mentre un venditore sarebbe saggio raddoppiare i propri sforzi per vendere l'azienda sulla base di questa proiezione molto negativa.


Ciao Dave, grazie mille per aver dedicato del tempo a leggere la mia domanda e rispondere. Comprendo che il tuo software va ben oltre ogni alternativa ma sfortunatamente non è un'opzione per me per il momento. Conoscendo le capacità di R, puoi darmi qualche consiglio per migliorare ciò che ho già fatto? Cordiali saluti,
krcooke l'

@krcooke Puoi esaminare la correlazione incrociata tra visite e lead / ritardi alternativi intorno a ciascuno dei tuoi regressori al fine di identificare la risposta appropriata. Sono totalmente d'accordo con Nick sul fatto che alcuni regressori potrebbero essere utili per alcune ore ma non per altri. È possibile modellare ogni ora separatamente. Rilevare i 4 tipi di valori anomali (Pulse, Level Shift, Seasonal Pulse e Time Trends) non è disponibile in SAS quando si hanno causali e probabilmente non è disponibile in SPSS. Ho scaricato i dati e userò AUTOBOX Siamo sempre alla ricerca di "dati difficili" come i tuoi per rafforzare la nostra analisi.
IrishStat

Ciao Dave, vedrò cosa posso fare riguardo all'analisi dei regressori. Ho sentito che i regressori che ho usato erano molto "standard" e probabilmente avrebbero avuto un impatto su tutti questi negozi. Ho usato il fine settimana festivo giubilare come esempio nel commento di Nick; molto probabilmente trarrebbe beneficio dall'uso dei regressori, ma per ora non l'ho incluso. E sono molto interessato a vedere cosa puoi fare con i dati! Grazie ancora.
krcooke,

7
" Purtroppo la tua missione è destinata al fallimento poiché sei limitato a R e SPSS. " - questo commento purtroppo va troppo lontano; qualsiasi linguaggio completo di Turing può implementare qualsiasi algoritmo scritto in un altro, anche se è programmabile nel codice macchina solo premendo gli interruttori e è interamente implementato in Lego. Non esiste alcun calcolo che può essere implementato in uno che non può essere fatto in un altro. A meno che tu non stia rivendicando proprietà magiche per AUTOBOX, credo che ciò che probabilmente intendi dire qualcosa come "già disponibile come funzioni nella distribuzione vaniglia" come differenza.
Glen_b -Restate Monica

@Glen_b Quello che avrei potuto dire è che la potenza di fuoco nelle distribuzioni di vaniglia che stai usando non è sufficiente a risolvere il problema a meno che tu non abbia molto tempo a disposizione per scrivere nuove procedure.
IrishStat

10

Questo non è altro che un insieme di commenti ma sarà troppo lungo per quel formato. Non sono altro che un dilettante di serie storiche, ma ho alcuni semplici suggerimenti.

  1. Potresti avere degli ordini qui, ma penso che questo abbia bisogno di un po 'più acuto in termini di ciò che ti aspetti di ottenere e di ciò che è più importante per te. Purtroppo, le visite di previsione sono un obiettivo sfocato. Ad esempio, supponiamo che siano le 16:00 e che desideri prevedere le visite con un'ora di anticipo. Hai davvero bisogno di un super-modello che incorpori un trattamento dell'intera serie precedente? Ciò deve provenire da una certa considerazione dei reali obiettivi pratici e / o scientifici, che possono essere stabiliti dai vostri superiori o da un cliente o che possono essere i vostri stessi come ricercatore. Ho il sospetto che sia più probabile che siano necessari modelli diversi per scopi diversi.

  2. La separazione delle serie orarie sembra essere guidata dall'idea di ridurre il calcolo senza molta considerazione di quanto abbia senso. Quindi, l'implicazione è che non utilizzerai (non) le informazioni di oggi prima nel predire ciò che sta accadendo alle 16:00, solo tutte le precedenti osservazioni delle 16:00? Mi sembra che abbia bisogno di molte discussioni.

  3. Evidentemente sei uno studente in serie storiche (e mi sto mettendo alla pari) ma nessuno studente dovrebbe iniziare con un problema così grande. Veramente! Hai molti dati, periodicità su più scale, irregolarità negli orari di apertura e festivi, variabili esogene: hai riscontrato un problema molto difficile. (E anche le tendenze?) È facile da dire, ma evidentemente ti ha superato finora: potresti dover prima lavorare su versioni molto semplificate del problema e avere un'idea di come adattarsi a modelli più semplici. Evidenziare tutto in un grande modello complicato evidentemente non funziona bene, e qualcosa di radicalmente più semplice sembra essere richiesto, o una realizzazione che il progetto è forse troppo ambizioso.


Ciao Nick, 1- In effetti sono agli ordini! L'obiettivo è quello di tentare di costruire un modello in modo che non tenda a prevedere in modo significativo previsioni eccessive (con conseguente spreco di ore di personale) o sotto previsioni (in modo che il personale non sia sopraffatto). 2- L'avevo considerato, ma scaverò più a fondo per capire cosa guadagno / perdo in questo modo. La previsione come una serie sembrava simile a un "super modello" come lo hai messo. 3- Sono consapevole che questo è estremamente difficile e che al momento sto battendo sopra il mio peso, ma sono completamente aperto a una soluzione più semplice che funzionerà anche per me qui. Mille grazie per i tuoi pensieri, Nick.
krcooke,

In termini di soluzioni più semplici, non ho potuto lavorare con tecniche di livellamento esponenziale in modo tale che il fine settimana del giubileo dell'anno scorso causasse una previsione eccessiva di quest'anno (stesso periodo). A causa del tipo di valori anomali coinvolti, mi è sembrato di dover assolutamente utilizzare variabili esogene. Hai altre idee che potrei esplorare?
krcooke,

Tutto quello che posso dire è cosa farei se fossi sotto gli ordini e avessi esattamente le informazioni fornite qui. Il mio istinto sarebbe il primo ad aggregarsi ai totali giornalieri e lavorare con quelli. È abbastanza difficile. È molto più facile essere critici qui ....
Nick Cox

Ciao Nick, colpa mia, avrei già dovuto dire che ci ho provato. Con i totali giornalieri i risultati apparivano ragionevoli. Ragionevole è la parola chiave perché, come hai affermato sia tu che Dave, c'è molto di più da considerare qui. Se è interessante, posso rieseguire nuovamente i dati giornalieri e dimostrare che sta acquisendo la stagionalità settimanale, mensile e annuale. Ecco perché ho pensato quindi di prevedere ogni ora una serie giornaliera.
krcooke,

Uno dei problemi che ho avuto, come menzionato nel primo post, è che auto.arima raggiunge le massime iterazioni prima di convergere, motivo per cui sto usando parametri abbastanza generalizzati con Arima (). Qualsiasi consiglio su come posso superare questo sarebbe molto apprezzato!
krcooke,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.