Auto.arima con dati giornalieri: come acquisire stagionalità / periodicità?


21

Sto montando un modello ARIMA su una serie storica giornaliera. I dati vengono raccolti quotidianamente dal 02-01-2010 al 30-07-2011 e riguardano le vendite di giornali. Poiché è possibile trovare un modello settimanale di vendite (la quantità media giornaliera di copie vendute è generalmente la stessa dal lunedì al venerdì, quindi aumenta il sabato e la domenica), sto cercando di catturare questa "stagionalità". Dati i "dati" dei dati di vendita, creo le serie temporali come segue:

salests<-ts(data,start=c(2010,1),frequency=365)

e quindi uso la funzione auto.arima (.) per selezionare il miglior modello ARIMA tramite criterio AIC. Il risultato è sempre un modello ARIMA non stagionale, ma se provo alcuni modelli SARIMA con la seguente sintassi come esempio:

sarima1<-arima(salests, order = c(2,1,2), seasonal = list(order = c(1, 0, 1), period = 7))

Posso ottenere risultati migliori. C'è qualcosa di sbagliato nelle specifiche del comando ts / arima? Il modello settimanale è molto forte, quindi non mi aspetterei così tante difficoltà nel catturarlo. Qualsiasi aiuto sarebbe molto utile. Grazie Giulia Deppieri

Aggiornare:

Ho già cambiato alcuni argomenti. Più precisamente, la procedura seleziona ARIMA (4,1,3) come modello migliore al momento dell'impostazione D=7, ma AIC e gli altri buoni indici e previsioni in forma) non migliorano affatto. Immagino che ci siano alcuni errori dovuti alla confusione tra stagionalità e periodicità ..?!

Chiamata Auto.arima utilizzata e output ottenuto:

modArima<-auto.arima(salests,D=7,max.P = 5, max.Q = 5)



 ARIMA(2,1,2) with drift         : 1e+20
 ARIMA(0,1,0) with drift         : 5265.543
 ARIMA(1,1,0) with drift         : 5182.772
 ARIMA(0,1,1) with drift         : 1e+20
 ARIMA(2,1,0) with drift         : 5137.279
 ARIMA(2,1,1) with drift         : 1e+20
 ARIMA(3,1,1) with drift         : 1e+20
 ARIMA(2,1,0)                    : 5135.382
 ARIMA(1,1,0)                    : 5180.817
 ARIMA(3,1,0)                    : 5117.714
 ARIMA(3,1,1)                    : 1e+20
 ARIMA(4,1,1)                    : 5045.236
 ARIMA(4,1,1) with drift         : 5040.53
 ARIMA(5,1,1) with drift         : 1e+20
 ARIMA(4,1,0) with drift         : 5112.614
 ARIMA(4,1,2) with drift         : 4953.417
 ARIMA(5,1,3) with drift         : 1e+20
 ARIMA(4,1,2)                    : 4960.516
 ARIMA(3,1,2) with drift         : 1e+20
 ARIMA(5,1,2) with drift         : 1e+20
 ARIMA(4,1,3) with drift         : 4868.669
 ARIMA(5,1,4) with drift         : 1e+20
 ARIMA(4,1,3)                    : 4870.92
 ARIMA(3,1,3) with drift         : 1e+20
 ARIMA(4,1,4) with drift         : 4874.095

 Best model: ARIMA(4,1,3) with drift        

Quindi presumo che la funzione arima dovrebbe essere usata come:

bestOrder <- cbind(modArima$arma[1],modArima$arma[5],modArima$arma[2])
sarima1<-arima(salests, order = c(4,1,3))

senza parametri dei componenti stagionali e specifiche del periodo. I dati e le analisi esplorative mostrano che lo stesso modello settimanale può essere approssimativamente considerato per ogni settimana, con la sola eccezione di agosto 2010 (quando si registra un consistente aumento delle vendite). Sfortunatamente non ho alcuna esperienza nella modellistica di timeseries, infatti sto provando questo approccio al fine di trovare una soluzione alternativa ad altri modelli parametrici e non parametrici che ho cercato di adattarmi a questi dati problematici. Ho anche molte variabili numeriche dipendenti ma hanno mostrato una bassa potenza nello spiegare la variabile di risposta: senza dubbio, la parte più difficile da modellare è la componente temporale. Inoltre, la costruzione di variabili fittizie per rappresentare mesi e giorni feriali si è rivelata non una soluzione solida.

Risposte:


28

In caso di stagionalità settimanale, impostare il periodo stagionale su 7.

salests <- ts(data,start=2010,frequency=7) 
modArima <- auto.arima(salests)

Si noti che la selezione del differenziamento stagionale non è stata molto efficace auto.arima()fino a poco tempo fa. Se si utilizza v2.xx del forecastpacchetto, impostare D=1nella chiamata auto.arima()per forzare la differenziazione stagionale. Se si utilizza v3.xx del forecastpacchetto, la selezione automatica di Dfunziona molto meglio (utilizzando un test OCSB invece di un test CH).

Non provare a confrontare l'AIC per i modelli con diversi livelli di differenziazione. Non sono direttamente comparabili. È possibile confrontare in modo affidabile l'AIC solo con modelli con gli stessi ordini di differenziazione.

Non è necessario riadattare il modello dopo aver chiamato auto.arima(). Restituirà un oggetto Arima, proprio come se avessi chiamato arima()con l'ordine del modello selezionato.


grazie per aver segnalato il mio stupido errore. Ritirerò la mia risposta.
mpiktas,

1
Grazie mille per i tuoi suggerimenti molto utili. Sto usando la versione 2.19 del pacchetto di previsione, quindi ho seguito il tuo consiglio e ho impostato il parametro D uguale a 1 nella chiamata auto.arima (). Ora il miglior modello selezionato per le serie di sali è un ARIMA (1,0,0) con media diversa da zero. Dovrei aspettarmi le specifiche della parte della stagionalità per il modello migliore restituito, intendo i valori di P, D, Q o almeno per D?
Giulia,

2
Finché i tuoi dati hanno una frequenza diversa da 1, verranno considerati i modelli ARIMA stagionali. Se viene restituito un modello non stagionale, la stagionalità è molto debole oppure i dati non si trovano in un oggetto ts con frequenza> 1.
Rob Hyndman,

15

Il problema con l'adattamento di ARIMA stagionale ai dati giornalieri è che la "componente stagionale" può funzionare solo nei fine settimana o forse solo nei giorni feriali, quindi nel complesso esiste una "componente stagionale" non significativa. Ora quello che devi fare è aumentare il tuo set di dati con 6 manichini che rappresentano i giorni della settimana e forse indicatori mensili per rappresentare gli effetti annuali. Ora considera l'incorporazione di eventi come le festività e includi qualsiasi effetto lead, contemplativo o di ritardo attorno a queste variabili conosciute. No, potrebbero esserci valori insoliti (impulsi) o variazioni di livello o andamenti dell'ora locale nei dati. Inoltre, gli effetti del giorno della settimana potrebbero essere cambiati nel tempo, ad esempio non vi è stato alcun effetto sabato per le prime 20 settimane ma un effetto sabato per le ultime 50 settimane.


In quel caso (IrishStat), non si tratterebbe di Tecnica di modellazione mista invece di ARIMA. I ritardi non vengono portati da nessuna parte in ARIMA, tranne Box Jlung Test. Auto.arima (recente) risolve tutto, incluso il ridimensionamento dei dati, le fluttuazioni della stagionalità (ecco perché trovo i migliori parametri p, d, q).
Wackyanil,

Si chiama funzione di trasferimento e riflette un approccio sinergico vedi autobox.com/pdfs/capable.pd a partire dalla diapositiva 42. Auto.arima può funzionare per casi semplici, ma non è abbastanza generale secondo me. Se hai in mente un set di dati, fai una nuova domanda e includila.
IrishStat,

@IrishStat intendevi ARIMA con intervento? giorno della settimana essendo variabili fittizie? e variabili fittizie simili per le vacanze?
Entusiasta

Sì ... sarebbe il mio approccio ai dati quotidiani
IrishStat

0

Per determinare l'ordine di stagionalità nei miei ts (dati giornalieri lungo 3 anni) ho usato questo codice in Matlab:

s = 0; min = 1e + 07; n = lunghezza (x); per i = 1: 400 diff = x (i + 1: n) -x (1: ni); s (i) = somma (abs (diff)); if (s (i)

Mi dà 365 che è logico.


1
Benvenuti nel sito. Non mi è chiaro come questo risponda alla domanda originale e non mi è chiaro cosa fa il codice che hai pubblicato semplicemente osservandolo. Forse potresti ampliare un po 'la risposta?
einar

1
In che modo la soluzione gestisce gli effetti fissi del giorno della settimana, gli effetti fissi del giorno del mese, gli effetti della settimana del mese, gli effetti del giorno del mese, gli effetti di piombo e ritardo delle vacanze , lunedì dopo una festività del venerdì, venerdì prima di una festività del lunedì, effetti mensili, effetti settimanali, variazioni degli effetti giorno per settimana nel corso del tempo, pulsazioni, cambiamenti di livello / step?
IrishStat,

il codice Matlab s = 0; min = 1e + 07; n = lunghezza (x); per i = 1: 400 diff = x (i + 1: n) -x (1: ni); s (i) = somma (abs (diff)); if (s (i) <min) min = s (i); i end end
nkabouche
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.