Serie temporal: variaciones de ARIMA
En el capítulo anterior, hemos visto cómo funciona el modelo ARIMA y sus limitaciones de que no puede manejar datos estacionales o series de tiempo multivariadas y, por lo tanto, se introdujeron nuevos modelos para incluir estas características.
Aquí se da un vistazo a estos nuevos modelos:
Auto-regresión vectorial (VAR)
Es una versión generalizada del modelo de autoregresión para series de tiempo estacionarias multivariadas. Se caracteriza por el parámetro 'p'.
Media móvil vectorial (VMA)
Es una versión generalizada del modelo de media móvil para series de tiempo estacionarias multivariadas. Se caracteriza por el parámetro 'q'.
Media móvil de regresión automática vectorial (VARMA)
Es la combinación de VAR y VMA y una versión generalizada del modelo ARMA para series de tiempo estacionarias multivariadas. Se caracteriza por los parámetros 'p' y 'q'. Al igual que, ARMA es capaz de actuar como un modelo AR configurando el parámetro 'q' como 0 y como modelo MA configurando el parámetro 'p' como 0, VARMA también es capaz de actuar como un modelo VAR configurando el parámetro 'q' como 0 y como modelo VMA estableciendo el parámetro 'p' como 0.
En [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:]
En [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)
En [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)
En [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()
El código anterior muestra cómo se puede usar el modelo VARMA para modelar series de tiempo multivariadas, aunque este modelo puede no ser el más adecuado para nuestros datos.
VARMA con variables exógenas (VARMAX)
Es una extensión del modelo VARMA donde se utilizan variables extra llamadas covariables para modelar la variable primaria que nos interesa.
Media móvil integrada auto regresiva estacional (SARIMA)
Ésta es la extensión del modelo ARIMA para tratar con datos estacionales. Divide los datos en componentes estacionales y no estacionales y los modela de manera similar. Se caracteriza por 7 parámetros, para la parte no estacional (p, d, q) los mismos que para el modelo ARIMA y para la parte estacional (P, D, Q, m) parámetros donde 'm' es el número de períodos estacionales y P, D, Q son similares a los parámetros del modelo ARIMA. Estos parámetros se pueden calibrar mediante búsqueda de cuadrícula o algoritmo genético.
SARIMA con Variables Exógenas (SARIMAX)
Esta es la extensión del modelo SARIMA para incluir variables exógenas que nos ayudan a modelar la variable que nos interesa.
Puede ser útil hacer un análisis de correlación de las variables antes de ponerlas como variables exógenas.
En [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 correlación de Pearson muestra una relación lineal entre 2 variables, para interpretar los resultados, primero miramos el valor p, si es menor que 0.05 entonces el valor del coeficiente es significativo, de lo contrario el valor del coeficiente no es significativo. Para un valor p significativo, un valor positivo del coeficiente de correlación indica una correlación positiva y un valor negativo indica una correlación negativa.
Por lo tanto, para nuestros datos, 'temperatura' y 'C6H6' parecen tener una correlación muy positiva. Por lo tanto, lo haremos
En [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)
En [298]:
y_ = test_multi['C6H6(GT)'].values
predicted = model_fit.predict(exog=y_)
test_multi_ = pandas.DataFrame(test)
test_multi_['predictions'] = predicted[0:1871]
En [299]:
plt.plot(train_multi['T'])
plt.plot(test_multi_['T'])
plt.plot(test_multi_.predictions, '--')
Fuera [299]:
[<matplotlib.lines.Line2D at 0x1eab0191c18>]
Las predicciones aquí parecen tener mayores variaciones ahora en comparación con el modelado ARIMA univariado.
No hace falta decir que SARIMAX se puede utilizar como modelo ARX, MAX, ARMAX o ARIMAX configurando solo los parámetros correspondientes a valores distintos de cero.
Promedio móvil integrado fraccional auto regresivo (FARIMA)
A veces, puede suceder que nuestra serie no sea estacionaria, pero diferenciar con el parámetro 'd' tomando el valor 1 puede sobrediferenciarlo. Entonces, necesitamos diferenciar la serie de tiempo usando un valor fraccionario.
En el mundo de la ciencia de datos no existe un modelo superior, el modelo que funciona con sus datos depende en gran medida de su conjunto de datos. El conocimiento de varios modelos nos permite elegir uno que funcione con nuestros datos y experimentar con ese modelo para lograr los mejores resultados. Y los resultados deben verse como gráficos y como métricas de error, a veces un pequeño error también puede ser malo, por lo tanto, trazar y visualizar los resultados es esencial.
En el próximo capítulo, veremos otro modelo estadístico, el suavizado exponencial.