Serie storiche - Variazioni di ARIMA
Nel capitolo precedente, abbiamo visto come funziona il modello ARIMA e le sue limitazioni che non possono gestire dati stagionali o serie temporali multivariate e quindi sono stati introdotti nuovi modelli per includere queste caratteristiche.
Uno scorcio di questi nuovi modelli è dato qui -
Regressione automatica vettoriale (VAR)
È una versione generalizzata del modello di regressione automatica per serie temporali stazionarie multivariate. È caratterizzato dal parametro "p".
Media mobile vettoriale (VMA)
È una versione generalizzata del modello della media mobile per serie temporali stazionarie multivariate. È caratterizzato dal parametro "q".
Media mobile di regressione automatica vettoriale (VARMA)
È la combinazione di VAR e VMA e una versione generalizzata del modello ARMA per serie temporali stazionarie multivariate. È caratterizzato dai parametri "p" e "q". In modo molto simile, ARMA è in grado di agire come un modello AR impostando il parametro 'q' come 0 e come modello MA impostando il parametro 'p' come 0, VARMA è anche in grado di agire come un modello VAR impostando il parametro 'q' come 0 e come modello VMA impostando il parametro 'p' come 0.
In [209]:
df_multi = df[['T', 'C6H6(GT)']]
split = len(df) - int(0.2*len(df))
train_multi, test_multi = df_multi[0:split], df_multi[split:]
In [211]:
from statsmodels.tsa.statespace.varmax import VARMAX
model = VARMAX(train_multi, order = (2,1))
model_fit = model.fit()
c:\users\naveksha\appdata\local\programs\python\python37\lib\site-packages\statsmodels\tsa\statespace\varmax.py:152:
EstimationWarning: Estimation of VARMA(p,q) models is not generically robust,
due especially to identification issues.
EstimationWarning)
c:\users\naveksha\appdata\local\programs\python\python37\lib\site-packages\statsmodels\tsa\base\tsa_model.py:171:
ValueWarning: No frequency information was provided, so inferred frequency H will be used.
% freq, ValueWarning)
c:\users\naveksha\appdata\local\programs\python\python37\lib\site-packages\statsmodels\base\model.py:508:
ConvergenceWarning: Maximum Likelihood optimization failed to converge. Check mle_retvals
"Check mle_retvals", ConvergenceWarning)
In [213]:
predictions_multi = model_fit.forecast( steps=len(test_multi))
c:\users\naveksha\appdata\local\programs\python\python37\lib\site-packages\statsmodels\tsa\base\tsa_model.py:320:
FutureWarning: Creating a DatetimeIndex by passing range endpoints is deprecated. Use `pandas.date_range` instead.
freq = base_index.freq)
c:\users\naveksha\appdata\local\programs\python\python37\lib\site-packages\statsmodels\tsa\statespace\varmax.py:152:
EstimationWarning: Estimation of VARMA(p,q) models is not generically robust, due especially to identification issues.
EstimationWarning)
In [231]:
plt.plot(train_multi['T'])
plt.plot(test_multi['T'])
plt.plot(predictions_multi.iloc[:,0:1], '--')
plt.show()
plt.plot(train_multi['C6H6(GT)'])
plt.plot(test_multi['C6H6(GT)'])
plt.plot(predictions_multi.iloc[:,1:2], '--')
plt.show()
Il codice sopra mostra come il modello VARMA può essere utilizzato per modellare serie temporali multivariate, sebbene questo modello potrebbe non essere più adatto ai nostri dati.
VARMA con variabili esogene (VARMAX)
È un'estensione del modello VARMA in cui vengono utilizzate variabili extra chiamate covariate per modellare la variabile primaria che ci interessa.
Media mobile stagionale integrata con regressione automatica (SARIMA)
Questa è l'estensione del modello ARIMA per gestire i dati stagionali. Divide i dati in componenti stagionali e non stagionali e li modella in modo simile. È caratterizzato da 7 parametri, per i parametri della parte non stagionale (p, d, q) come per il modello ARIMA e per i parametri della parte stagionale (P, D, Q, m) dove 'm' è il numero di periodi stagionali e P, D, Q sono simili ai parametri del modello ARIMA. Questi parametri possono essere calibrati utilizzando la ricerca sulla griglia o l'algoritmo genetico.
SARIMA con variabili esogene (SARIMAX)
Questa è l'estensione del modello SARIMA per includere variabili esogene che ci aiutano a modellare la variabile che ci interessa.
Può essere utile fare un'analisi di correlazione sulle variabili prima di metterle come variabili esogene.
In [251]:
from scipy.stats.stats import pearsonr
x = train_multi['T'].values
y = train_multi['C6H6(GT)'].values
corr , p = pearsonr(x,y)
print ('Corelation Coefficient =', corr,'\nP-Value =',p)
Corelation Coefficient = 0.9701173437269858
P-Value = 0.0
La correlazione di Pearson mostra una relazione lineare tra 2 variabili, per interpretare i risultati, prima guardiamo il valore p, se è inferiore a 0,05, il valore del coefficiente è significativo, altrimenti il valore del coefficiente non è significativo. Per un valore p significativo, un valore positivo del coefficiente di correlazione indica una correlazione positiva e un valore negativo indica una correlazione negativa.
Quindi, per i nostri dati, "temperatura" e "C6H6" sembrano avere una correlazione altamente positiva. Pertanto, lo faremo
In [297]:
from statsmodels.tsa.statespace.sarimax import SARIMAX
model = SARIMAX(x, exog = y, order = (2, 0, 2), seasonal_order = (2, 0, 1, 1), enforce_stationarity=False, enforce_invertibility = False)
model_fit = model.fit(disp = False)
c:\users\naveksha\appdata\local\programs\python\python37\lib\site-packages\statsmodels\base\model.py:508:
ConvergenceWarning: Maximum Likelihood optimization failed to converge. Check mle_retvals
"Check mle_retvals", ConvergenceWarning)
In [298]:
y_ = test_multi['C6H6(GT)'].values
predicted = model_fit.predict(exog=y_)
test_multi_ = pandas.DataFrame(test)
test_multi_['predictions'] = predicted[0:1871]
In [299]:
plt.plot(train_multi['T'])
plt.plot(test_multi_['T'])
plt.plot(test_multi_.predictions, '--')
Fuori [299]:
[<matplotlib.lines.Line2D at 0x1eab0191c18>]
Le previsioni qui sembrano prendere variazioni maggiori ora rispetto alla modellazione ARIMA univariata.
Inutile dire che SARIMAX può essere utilizzato come modello ARX, MAX, ARMAX o ARIMAX impostando solo i parametri corrispondenti su valori diversi da zero.
Media mobile integrata con regressione automatica frazionaria (FARIMA)
A volte, può accadere che la nostra serie non sia stazionaria, ma la differenza con il parametro 'd' che assume il valore 1 può sovrascriverlo. Quindi, dobbiamo differenziare le serie temporali utilizzando un valore frazionario.
Nel mondo della scienza dei dati non esiste un modello superiore, il modello che funziona sui tuoi dati dipende molto dal tuo set di dati. La conoscenza di vari modelli ci consente di sceglierne uno che funzioni sui nostri dati e di sperimentare con quel modello per ottenere i migliori risultati. E i risultati dovrebbero essere visti come grafici e metriche di errore, a volte anche un piccolo errore può essere negativo, quindi tracciare e visualizzare i risultati è essenziale.
Nel prossimo capitolo esamineremo un altro modello statistico, il livellamento esponenziale.