Previsione con modelli ARIMA
in R con il pacchetto TSA
ARIMA
ARIMA -> Media mobile integrata autoregressiva
Il vantaggio dell'utilizzo dei modelli ARIMA rispetto alla regressione lineare, al livellamento esponenziale, agli inverni freddi ecc... è che i modelli ARIMA possono ridurre una serie non stazionaria a una serie stazionaria utilizzando una sequenza di passaggi di differenziazione .
Per fare inferenze statistiche o previsioni di processi casuali basati su registrazioni osservate, è molto importante che l'assunzione di stazionarietà sia soddisfatta.
Cos'è una serie stazionaria ?
L'idea di base della stazionarietà è che la probabilità dei comportamenti del processo non cambia nel tempo e ci si aspetta che il processo sia in equilibrio statistico .
Un processo {Yt} si dice strettamente stazionario se la distribuzione congiunta di Yt1,Yt2,… Ytn è uguale alla distribuzione congiunta di Yt1 — k Yt2 — k,…, Ytn — k per tutte le scelte di punti temporali t1, t2,…, tn , e tutte le scelte di ritardo temporale k.
Alcune definizioni
- {Yt} è un processo di serie temporali di osservazioni nel tempo, t =1 , t =2 , t…
- Una distribuzione congiunta di Yt1,Yt2,... si riferisce agli spostamenti temporali nei processi di serie temporali che si riferiranno a periodi temporali di t(1-k), t(2-k),...
- l'intervallo di tempo k si riferisce all'intervallo di tempo ed è noto come intervallo di tempo.
- stazionario — Qualsiasi serie temporale senza una media costante nel tempo è non stazionaria
Differenza?
I valori delle serie temporali originali vengono sottratti dai valori delle serie temporali spostati di un certo numero di periodi temporali. Questa trasformazione rimuove la tendenza e la stagionalità nei dati, lasciando solo la componente casuale e stazionaria.
Diamo un'occhiata a un esempio:
library(tidyverse)
library(broom)
library(forecast)
library(scales)
data <- read.delim("C:/Data/oilspills.txt")
data %>% head()
data.ts <- ts(data$TotalSpills,freq=12,start=c(1970,1))
plot(data.ts, type='o',cex=0.5, main = "Time series plot", col = "steelblue")
Possiamo controllare l'autocorrelazione e i grafici di autocorrelazione parziale
par(mfrow = c(1,2))
acf(data.ts,main = "Autocorrealtion plot")
pacf(data.ts,main = "")
title(main = "Partial autocorrelation plot")
Le barre verticali nel grafico ACF mostrano un'autocorrelazione significativa perché si trovano sopra la linea tratteggiata blu.
Applicherò la differenziazione con la funzione diff()
diff=diff(data.ts)
plot(diff, ylab='Difference of internet users', type='b',cex=0.5, col = "darkcyan")
title(main = "Differenced time-series")
Dobbiamo trovare l'ordine del nostro modello ARIMA?
L'obiettivo della selezione del modello è trovare il modello ARIMA che meglio si adatta ai dati delle serie temporali.
p,d,q -> ARIMA (p,d,q) -> ARIMA (AR,d,MA)
Esistono diversi metodi per selezionare i valori pdq per un modello ARIMA:
- Ispezione dei grafici ACF e PACF: i grafici ACF e PACF possono essere utilizzati per identificare l'ordine dei componenti autoregressivi (AR) e della media mobile (MA) nel modello. Il ritardo in cui il grafico ACF o PACF "si interrompe" può suggerire l'ordine dei rispettivi componenti.
- Selezione automatica del modello:
auto.arima(). Questa funzione utilizza un approccio per stimare il miglior modello basato sul valore AIC. - Strumenti diagnostici: grafico EACF
- L'operatore di backshift (1 — phi * B) * (1 — B)² = (1 + theta * B)
Esistono diversi metodi che possono ottenere questi valori, ma è importante notare che la selezione del modello non è un processo una tantum. L'adeguatezza del modello selezionato dovrebbe essere valutata mediante test diagnostici e visualizzazioni.
Possiamo utilizzare un grafico eacf (Extended Auto Correlation Function) che è uno strumento grafico utilizzato per aiutare a determinare l'ordine di un modello ARIMA.
eacf(diff)
Sembra che questo modello potrebbe essere un modello AR = 1 e MA = 0.
Il grafico EACF è solo uno strumento per determinare l'ordine appropriato di un modello ARIMA e per trovare l'ordine del modello dovrebbero essere impiegati anche l'ispezione visiva e test statistici.
Creiamo il primo modello:
arima1 <- arima(data.ts, order=c(1,0,0))
arima1
- trama residua
- Shapiro Wilks
- Grafico QQ normale
trama residua
plot(arima1$res,xlab='Time',ylab='Residuals',main='')
abline(h=0,col='red')
shapiro.test(arima1$res)
In questo caso i residui del modello ARIMA non sono distribuiti normalmente.
Grafico QQ normale
qqnorm(arima1$res)
qqline(arima1$res)
Proverò un altro modello:
Posso eseguire auto.arima , questo potrebbe aiutare!
auto.arima(data.ts)
arima2 <-arima(x = diff, order = c(1, 1, 0))
shapiro.test(arima2$res)
qqnorm(arima2$res)
qqline(arima2$res)
Residui
plot(arima2$res,xlab='Time',ylab='Residuals',main='Arima2 model')
abline(h=0,col='red')
Prevediamo con il modello arima2:
pred <- predict(arima2,n.ahead=5)
pred
Conclusione
Gran parte della modellazione arima ci riguarda nel trovare la trasformazione corretta di cui i dati hanno bisogno. In questo esempio, abbiamo dovuto differenziare i dati perché il grafico ACF mostrava chiari segni del requisito. Ci sono casi in cui i dati potrebbero richiedere una trasformazione del registro, ma il concetto importante da tenere a mente è che dobbiamo eseguire alcuni test statistici. Dobbiamo esaminare le trame e determinare cosa sembra migliore.
La trama EACF non è affatto una trama facile da leggere, auto.arima sembra molto più semplice. Anche guardare i grafici dei residui è molto importante e, nel caso della modellazione arima, avere una serie temporale stazionaria in cui leggi di probabilità simili governano il processo nel tempo è un principio chiave. Dopo aver creato la stazionarietà mediante differenziazione, registrazione o entrambi, possiamo adattare il modello appropriato e creare alcune previsioni!
Spero che l'articolo ti sia piaciuto e che sia stato utile.
Seguimi per altri articoli su R, Julia, Python e statistiche applicate!

![Che cos'è un elenco collegato, comunque? [Parte 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































