Serie temporal - ARIMA

Ya hemos entendido que para una serie de tiempo estacionaria, una variable en el tiempo 't' es una función lineal de observaciones previas o errores residuales. Por lo tanto, es hora de que combinemos los dos y tengamos un modelo de media móvil autorregresiva (ARMA).

Sin embargo, a veces la serie de tiempo no es estacionaria, es decir, las propiedades estadísticas de una serie como la media, la varianza cambia con el tiempo. Y los modelos estadísticos que hemos estudiado hasta ahora asumen que la serie de tiempo es estacionaria, por lo tanto, podemos incluir un paso previo al procesamiento de diferenciar la serie de tiempo para hacerla estacionaria. Ahora bien, es importante que averigüemos si la serie de tiempo con la que estamos tratando es estacionaria o no.

Varios métodos para encontrar la estacionariedad de una serie de tiempo buscan la estacionalidad o tendencia en el gráfico de la serie de tiempo, verificando la diferencia en la media y la varianza para varios períodos de tiempo, prueba de Dickey-Fuller aumentada (ADF), prueba de KPSS, exponente de Hurst, etc. .

Veamos si la variable de 'temperatura' de nuestro conjunto de datos es una serie de tiempo estacionaria o no utiliza la prueba ADF.

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

Estadística ADF: -10.406056

valor p: 0,000000

Valores criticos:

1%: -3,431

5%: -2,862

10%: -2,567

Ahora que hemos ejecutado la prueba ADF, interpretemos el resultado. Primero compararemos el estadístico ADF con los valores críticos, un valor crítico más bajo nos dice que la serie probablemente no sea estacionaria. A continuación, vemos el valor p. Un valor de p superior a 0,05 también sugiere que la serie de tiempo no es estacionaria.

Alternativamente, el valor p menor o igual a 0.05, o la estadística ADF menor que los valores críticos sugieren que la serie de tiempo es estacionaria.

Por tanto, la serie de tiempo que estamos tratando ya es estacionaria. En el caso de series de tiempo estacionarias, establecemos el parámetro 'd' como 0.

También podemos confirmar la estacionariedad de las series de tiempo utilizando el exponente de Hurst.

En [75]:

import hurst

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

H = 0,1660, c = 5,0740

El valor de H <0,5 muestra un comportamiento antipersistente y H> 0,5 muestra un comportamiento persistente o una serie de tendencia. H = 0.5 muestra caminar aleatorio / movimiento browniano. El valor de H <0,5, lo que confirma que nuestra serie es estacionaria.

Para series de tiempo no estacionarias, establecemos el parámetro 'd' como 1. Además, el valor del parámetro de tendencia autorregresiva 'p' y el parámetro de tendencia de media móvil 'q', se calcula en la serie de tiempo estacionaria, es decir, trazando ACP y PACP después de diferenciar las series de tiempo.

El modelo ARIMA, que se caracteriza por 3 parámetros, (p, d, q), ahora está claro para nosotros, así que modelemos nuestra serie de tiempo y prediga los valores futuros de temperatura.

En [156]:

from statsmodels.tsa.arima_model import ARIMA

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

En [157]:

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

En [158]:

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

En [167]:

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

Prueba RMSE para ARIMA: 43.21252940234892