Analisi delle serie storiche giornaliere


25

Sto cercando di fare analisi delle serie storiche e sono nuovo in questo campo. Ho un conteggio giornaliero di un evento dal 2006 al 2009 e voglio adattarlo ad un modello di serie storica. Ecco i progressi che ho fatto:

timeSeriesObj = ts(x,start=c(2006,1,1),frequency=365.25)
plot.ts(timeSeriesObj)

La trama risultante che ottengo è:

Grafico delle serie storiche

Al fine di verificare se vi è stagionalità e tendenza nei dati o meno, seguo i passaggi indicati in questo post :

ets(x)
fit <- tbats(x)
seasonal <- !is.null(fit$seasonal)
seasonal

e nel blog di Rob J Hyndman :

library(fma)
fit1 <- ets(x)
fit2 <- ets(x,model="ANN")

deviance <- 2*c(logLik(fit1) - logLik(fit2))
df <- attributes(logLik(fit1))$df - attributes(logLik(fit2))$df 
#P value
1-pchisq(deviance,df)

Entrambi i casi indicano che non c'è stagionalità.

Quando traccio ACF e PACF della serie, ecco cosa ottengo:

ACF PACF

Le mie domande sono:

  1. È questo il modo di gestire i dati delle serie temporali quotidiane? Questa pagina suggerisce che dovrei esaminare i modelli settimanali e annuali, ma l'approccio non mi è chiaro.

  2. Non so come procedere una volta che ho i grafici ACF e PACF.

  3. Posso semplicemente usare la funzione auto.arima?

    fit <- arima (myts, order = c (p, d, q)

***** Risultati Auto.Arima aggiornati ******

Quando cambio la frequenza dei dati su 7 secondo i commenti di Rob Hyndman qui , auto.arima seleziona un modello ARIMA stagionale e produce:

Series: timeSeriesObj 
ARIMA(1,1,2)(1,0,1)[7]                    

Coefficients:
       ar1      ma1     ma2    sar1     sma1
      0.89  -1.7877  0.7892  0.9870  -0.9278
s.e.   NaN      NaN     NaN  0.0061   0.0162

sigma^2 estimated as 21.72:  log likelihood=-4319.23
AIC=8650.46   AICc=8650.52   BIC=8682.18 

****** Controllo della stagionalità aggiornato ******

Quando provo la stagionalità con la frequenza 7, produce True ma con la stagionalità 365,25, produce false. È abbastanza per concludere una mancanza di stagionalità annuale?

timeSeriesObj = ts(x,start=c(2006,1,1),frequency=7)
fit <- tbats(timeSeriesObj)
seasonal <- !is.null(fit$seasonal)
seasonal

ritorna:

True

mentre

timeSeriesObj = ts(x,start=c(2006,1,1),frequency=365.25)
fit <- tbats(timeSeriesObj)
seasonal <- !is.null(fit$seasonal)
seasonal

ritorna:

False

Quale output str(x)produce?
S. Kolassa - Ripristina Monica

Produce num [1: 1460] 17 12 12 17 13 14 14 5 12 21 ...
statBeginner

Potresti pubblicare i dati?
meteorologo

Sfortunatamente, non posso.
statBeginner

3
OK, farei affidamento sull'ispezione visiva e sulla conoscenza del dominio oltre ai test statistici per rilevare la stagionalità. Alla tua domanda se arima può gestire la stagionalità multipla - Sicuramente ARIMA gestirà qualsiasi tipo di stagionalità, Rsemplice non ha la capacità di gestirla. Vorrei cercare soluzioni commerciali in caso di costi di inventario / produzione elevati per il prodotto che si sta tentando di prevedere. Rpresenta gravi limitazioni per le attività di previsione come la tua. Guarda le domande sulle previsioni giornaliere dove in questo sito.
previsioni

Risposte:


25

Il tuo ACF e PACF indicano che hai almeno una stagionalità settimanale, che è mostrata dai picchi in ritardo 7, 14, 21 e così via.

Potresti anche avere una stagionalità annuale, anche se non è ovvio dalle tue serie storiche.

La tua scommessa migliore, date le stagionalità potenzialmente multiple, può essere un tbatsmodello, che modella esplicitamente più tipi di stagionalità. Carica il forecastpacchetto:

library(forecast)

L'output di str(x)indica che xnon contiene ancora informazioni sulla potenziale presenza di più stagionalità. Guarda ?tbatse confronta l'output di str(taylor). Assegna le stagionalità:

x.msts <- msts(x,seasonal.periods=c(7,365.25))

Ora puoi adattare un tbatsmodello. (Sii paziente, questo potrebbe richiedere del tempo.)

model <- tbats(x.msts)

Infine, puoi prevedere e tracciare:

plot(forecast(model,h=100))

Si consiglia di non utilizzare arima()o auto.arima(), dal momento che questi possono gestire solo un unico tipo di stagionalità: o settimanale o annuale. Non chiedermi cosa auto.arima()farebbe sui tuoi dati. Può scegliere una delle stagionalità o ignorarle del tutto.


MODIFICA per rispondere ad ulteriori domande da un commento:

  1. Come posso verificare se i dati hanno una stagionalità annuale o no? Posso creare un'altra serie di numero totale di eventi al mese e usare il suo ACF per decidere?

Il calcolo di un modello su dati mensili potrebbe essere una possibilità. Quindi è possibile, ad esempio, confrontare gli AIC tra modelli con e senza stagionalità.

Tuttavia, preferirei utilizzare un campione di controllo per valutare i modelli di previsione. Tieni gli ultimi 100 punti dati. Adatta un modello con stagionalità annuale e settimanale al resto dei dati (come sopra), quindi inseriscilo con una sola stagionalità settimanale, ad es. Usando auto.arima()su tscon frequency=7. Previsione utilizzando entrambi i modelli nel periodo di controllo. Verifica quale ha un errore inferiore, utilizzando MAE, MSE o qualsiasi altra cosa sia più rilevante per la tua funzione di perdita. Se c'è poca differenza tra gli errori, vai con il modello più semplice; in caso contrario, utilizzare quello con l'errore inferiore.

La prova del budino sta nel mangiare e la prova del modello delle serie storiche è nelle previsioni.

Per migliorare le cose, non utilizzare un singolo campione di controllo (che può essere fuorviante, dato il miglioramento alla fine della serie), ma utilizzare le previsioni sull'origine mobile, noto anche come "convalida incrociata delle serie temporali" . (Consiglio vivamente l' intero manuale di previsioni online gratuito .

  1. Quindi i modelli ARIMA stagionali di solito non possono gestire più stagionalità? È una proprietà del modello stesso o è solo il modo in cui sono scritte le funzioni in R?

I modelli ARIMA standard gestiscono la stagionalità mediante differenze stagionali. Per i dati mensili stagionali, non modellereste le serie storiche non elaborate, ma le serie temporali di differenze tra marzo 2015 e marzo 2014, tra febbraio 2015 e febbraio 2014 e così via. (Per ottenere previsioni sulla scala originale, dovresti ovviamente ripetere la differenza.)

Non esiste un modo immediatamente ovvio per estendere questa idea a più stagionalità.

Naturalmente, puoi fare qualcosa usando ARIMAX, ad esempio includendo i manichini mensili per modellare la stagionalità annuale, quindi modellare i residui usando ARIMA stagionale settimanale. Se vuoi farlo in R, usa ts(x,frequency=7), crea una matrice di manichini mensili e inseriscilo nel xregparametro di auto.arima().

Non ricordo alcuna pubblicazione che estenda in modo specifico ARIMA a più stagionalità, anche se sono sicuro che qualcuno ha fatto qualcosa del genere nel mio paragrafo precedente.


Ecco alcune domande che ho basato sulla tua risposta: 1. Come posso verificare se i dati hanno una stagionalità annuale o no? Posso creare un'altra serie di numero totale di eventi al mese e usare il suo acf per decidere? 2. Quindi i modelli ARIMA stagionali di solito non possono gestire più stagionalità? È una proprietà del modello stesso o è solo il modo in cui sono scritte le funzioni in R?
statBeginner

Post aggiornato con i risultati di Auto.Arima con stagionalità settimanale
statBeginner

1
@StephanKolassa, ho trovato questo articolo da AT&T qualche tempo fa che utilizza più ARIMA stagionali. Modello come quello in articolo non è possibile in R, dal momento Rche non ha la capacità di gestire ARIMA multiseasonale.
previsioni

2
@forecaster: fantastico, grazie! Sembra che facciano una doppia differenza nell'equazione 3.1. Sono un po 'preoccupato di perdere molti dati in quel modo. Sfortunatamente, non confrontano i loro risultati con un semplice benchmark, ad esempio le richieste della scorsa settimana. Quello che mi piace è come studiano anche le combinazioni di previsioni tra il loro DSARIMA e un tbatsmodello simile.
S. Kolassa - Ripristina Monica il

3
@StephanKolassa Sono d'accordo, sono un grande sostenitore dell'utilizzo della previsione ingenua come punto di riferimento come supportato nei Principi di previsione di Armstrong e aggiungo complessità solo se migliora la precisione. Ho finito tra i primi 2 percentili in alcune competizioni kaggle usando metodi ingenui nei miei gruppi.
previsioni

4

Il modo migliore per decomporre i dati stagionali usando i pacchetti R esistenti è ceemdan () in Rlibeemd. Questa tecnica estrae la stagionalità di più periodi. Le impostazioni predefinite funzionano bene. Usa la trasformata di Hilbert-Huang invece della trasformata di Fourier. La trasformata di Fourier ha un grave svantaggio in quanto può gestire dati fissi e lineari solo se la maggior parte delle serie di interesse non lo sono. Ad esempio, la camminata casuale y_t = y_ {t-1} + e_t è la camminata casuale più semplice e frequente. Altri metodi mantengono fissa l'ampiezza della variazione stagionale quando spesso varia nella pratica.


1
Si prega di consultare il tutorial di base MathJax e il riferimento per assistenza su come mettere la matematica nelle risposte. Per favore, offri anche qualche giustificazione del reclamo del " migliore " (o considera la modifica del reclamo) - dovrebbe essere almeno buono come ogni altra opzione, non solo la maggior parte di essi.
Glen_b

2
Vale la pena ricordare che questo pacchetto è su CRAN
Glen_b -Reinstate Monica,

3

Le domande che poni sono state trattate nelle previsioni di serie storiche R: domande riguardanti il ​​mio risultato . Per favore, osserva attentamente la mia risposta dettagliata e tutti i commenti nella discussione, compresi quelli alla domanda originale, poiché ritengo siano rilevanti per il tuo problema. Potresti effettivamente prendere i dati forniti nel post e usarli come momento di insegnamento per te stesso. Usa l'intera discussione come primer per ciò che dovresti fare.


1
Molte grazie! Userò i dati di quel post per provare le cose.
statBeginner
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.