Séries Temporais - Variações de ARIMA

No capítulo anterior, vimos como o modelo ARIMA funciona e suas limitações de não poder lidar com dados sazonais ou séries temporais multivariadas e, portanto, novos modelos foram introduzidos para incluir esses recursos.

Um vislumbre desses novos modelos é dado aqui -

Auto-regressão vetorial (VAR)

É uma versão generalizada do modelo de auto regressão para séries temporais estacionárias multivariadas. É caracterizado pelo parâmetro 'p'.

Média móvel vetorial (VMA)

É uma versão generalizada do modelo de média móvel para séries temporais estacionárias multivariadas. É caracterizado pelo parâmetro 'q'.

Média móvel de regressão automática vetorial (VARMA)

É a combinação de VAR e VMA e uma versão generalizada do modelo ARMA para séries temporais estacionárias multivariadas. É caracterizado pelos parâmetros 'p' e 'q'. Muito parecido, ARMA é capaz de agir como um modelo AR definindo o parâmetro 'q' como 0 e como um modelo MA definindo o parâmetro 'p' como 0, VARMA também é capaz de agir como um modelo VAR definindo o parâmetro 'q' como 0 e como um modelo VMA, definindo o parâmetro 'p' como 0.

Em [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:]

Em [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)

Em [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)

Em [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()

O código acima mostra como o modelo VARMA pode ser usado para modelar séries temporais multivariadas, embora esse modelo possa não ser o mais adequado em nossos dados.

VARMA com variáveis ​​exógenas (VARMAX)

É uma extensão do modelo VARMA em que variáveis ​​extras chamadas covariáveis ​​são usadas para modelar a variável primária em que estamos interessados.

Média Móvel Sazonal Auto Regressiva Integrada (SARIMA)

Esta é a extensão do modelo ARIMA para lidar com dados sazonais. Ele divide os dados em componentes sazonais e não sazonais e os modela de maneira semelhante. É caracterizado por 7 parâmetros, para os parâmetros da parte não sazonal (p, d, q) iguais aos do modelo ARIMA e para os parâmetros da parte sazonal (P, D, Q, m) onde 'm' é o número de períodos sazonais e P, D, Q são semelhantes aos parâmetros do modelo ARIMA. Esses parâmetros podem ser calibrados usando busca em grade ou algoritmo genético.

SARIMA com variáveis ​​exógenas (SARIMAX)

Esta é a extensão do modelo SARIMA para incluir variáveis ​​exógenas que nos ajudam a modelar a variável que nos interessa.

Pode ser útil fazer uma análise de correlação nas variáveis ​​antes de colocá-las como variáveis ​​exógenas.

Em [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

A correlação de Pearson mostra uma relação linear entre 2 variáveis, para interpretar os resultados, olhamos primeiro para o valor p, se for menor que 0,05 então o valor do coeficiente é significativo, caso contrário, o valor do coeficiente não é significativo. Para um valor p significativo, um valor positivo do coeficiente de correlação indica uma correlação positiva e um valor negativo indica uma correlação negativa.

Portanto, para nossos dados, 'temperatura' e 'C6H6' parecem ter uma correlação altamente positiva. Portanto, vamos

Em [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)

Em [298]:

y_ = test_multi['C6H6(GT)'].values
predicted = model_fit.predict(exog=y_)
test_multi_ = pandas.DataFrame(test)
test_multi_['predictions'] = predicted[0:1871]

Em [299]:

plt.plot(train_multi['T'])
plt.plot(test_multi_['T'])
plt.plot(test_multi_.predictions, '--')

Fora [299]:

[<matplotlib.lines.Line2D at 0x1eab0191c18>]

As previsões aqui parecem ter variações maiores agora, em oposição à modelagem ARIMA univariada.

Não é preciso dizer que o SARIMAX pode ser usado como um modelo ARX, MAX, ARMAX ou ARIMAX, definindo apenas os parâmetros correspondentes para valores diferentes de zero.

Média Móvel Fracionada Auto Regressiva Integrada (FARIMA)

Às vezes, pode acontecer que nossa série não seja estacionária, mas diferenciar com o parâmetro 'd' tomando o valor 1 pode superá-la. Portanto, precisamos diferenciar a série temporal usando um valor fracionário.

No mundo da ciência de dados, não existe um modelo superior, o modelo que funciona com seus dados depende muito do seu conjunto de dados. O conhecimento de vários modelos nos permite escolher um que funcione em nossos dados e fazer experiências com esse modelo para obter os melhores resultados. E os resultados devem ser vistos como gráfico, bem como métricas de erro, às vezes um pequeno erro também pode ser ruim, portanto, traçar e visualizar os resultados é essencial.

No próximo capítulo, veremos outro modelo estatístico, suavização exponencial.