Série Temporal - ARIMA

Já entendemos que, para uma série temporal estacionária, uma variável no tempo 't' é uma função linear de observações anteriores ou erros residuais. Portanto, é hora de combinarmos os dois e ter um modelo de média móvel auto-regressiva (ARMA).

No entanto, às vezes a série temporal não é estacionária, ou seja, as propriedades estatísticas de uma série como a média, a variância muda ao longo do tempo. E os modelos estatísticos que estudamos até agora assumem que as séries temporais são estacionárias, portanto, podemos incluir uma etapa de pré-processamento de diferenciação das séries temporais para torná-las estacionárias. Agora, é importante descobrirmos se a série temporal com a qual estamos lidando é estacionária ou não.

Vários métodos para encontrar a estacionariedade de uma série temporal procuram sazonalidade ou tendência no gráfico das séries temporais, verificando a diferença na média e variância para vários períodos de tempo, teste Dickey-Fuller aumentado (ADF), teste KPSS, expoente de Hurst etc. .

Vamos ver se a variável de 'temperatura' de nosso conjunto de dados é uma série temporal estacionária ou não usando o teste ADF.

Em [74]:

from statsmodels.tsa.stattools import adfuller

result = adfuller(train)
print('ADF Statistic: %f' % result[0])
print('p-value: %f' % result[1])
print('Critical Values:')
for key, value In result[4].items()
   print('\t%s: %.3f' % (key, value))

Estatística ADF: -10,406056

valor p: 0,000000

Valores Críticos:

1%: -3,431

5%: -2.862

10%: -2.567

Agora que executamos o teste ADF, vamos interpretar o resultado. Primeiro, compararemos a estatística ADF com os valores críticos; um valor crítico inferior nos diz que a série provavelmente é não estacionária. A seguir, vemos o valor p. Um valor de p maior que 0,05 também sugere que a série temporal não é estacionária.

Como alternativa, o valor de p menor ou igual a 0,05 ou a estatística ADF menor que os valores críticos sugerem que a série temporal é estacionária.

Portanto, a série temporal com a qual estamos lidando já é estacionária. No caso de séries temporais estacionárias, definimos o parâmetro 'd' como 0.

Também podemos confirmar a estacionariedade das séries temporais usando o expoente de Hurst.

Em [75]:

import hurst

H, c,data = hurst.compute_Hc(train)
print("H = {:.4f}, c = {:.4f}".format(H,c))

H = 0,1660, c = 5,0740

O valor de H <0,5 mostra comportamento anti-persistente, e H> 0,5 mostra comportamento persistente ou uma série de tendências. H = 0,5 mostra passeio aleatório / movimento browniano. O valor de H <0,5, confirmando que nossa série é estacionária.

Para séries temporais não estacionárias, definimos o parâmetro 'd' como 1. Além disso, o valor do parâmetro de tendência auto-regressiva 'p' e o parâmetro de tendência média móvel 'q' é calculado na série temporal estacionária, ou seja, plotando ACP e PACP após diferenciação das séries temporais.

O modelo ARIMA, que é caracterizado por 3 parâmetros, (p, d, q) está claro para nós, então vamos modelar nossa série temporal e prever os valores futuros de temperatura.

Em [156]:

from statsmodels.tsa.arima_model import ARIMA

model = ARIMA(train.values, order=(5, 0, 2))
model_fit = model.fit(disp=False)

Em [157]:

predictions = model_fit.predict(len(test))
test_ = pandas.DataFrame(test)
test_['predictions'] = predictions[0:1871]

Em [158]:

plt.plot(df['T'])
plt.plot(test_.predictions)
plt.show()

Em [167]:

error = sqrt(metrics.mean_squared_error(test.values,predictions[0:1871]))
print ('Test RMSE for ARIMA: ', error)

Teste RMSE para ARIMA: 43.21252940234892