Serie de tiempo multivariante | Regresión automática vectorial (VAR)

Contenidos

Introducción

El tiempo es el factor más crítico que decide si una empresa subirá o bajará. Es por eso que vemos que las ventas en las tiendas y las plataformas de comercio electrónico se alinean con los festivales. Estas empresas analizan años de datos de gasto para comprender cuál es el mejor momento para abrir las puertas y ver un aumento en el gasto de los consumidores.

Pero, ¿cómo puede usted, como científico de datos, realizar este análisis? ¡No te preocupes, no necesitas construir una máquina del tiempo! El modelado de series de tiempo es una técnica poderosa que actúa como una puerta de entrada para comprender y pronosticar tendencias y patrones.

mts-6650631

Pero incluso un modelo de serie temporal tiene diferentes facetas. La mayoría de los ejemplos que vemos en la web tratan con series de tiempo univariadas. Desafortunadamente, los casos de uso del mundo real no funcionan así. Hay múltiples variables en juego, y manejarlas todas al mismo tiempo es donde un científico de datos ganará su valor.

En este artículo, entenderemos qué es una serie de tiempo multivariante y cómo lidiar con ella. También tomaremos un estudio de caso y lo implementaremos en Python para brindarle una comprensión práctica del tema.

Tabla de contenido

  1. Series de tiempo univariadas versus multivariadas
    1. Serie de tiempo univariante
    2. Serie de tiempo multivariante
  2. Manejo de una serie temporal multivariante: regresión automática vectorial (VAR)
  3. ¿Por qué necesitamos VAR?
  4. Estacionariedad en una serie de tiempo multivariante
  5. División de validación de tren
  6. Implementación de Python

1. Series de tiempo univariadas versus multivariadas

Este artículo asume cierta familiaridad con las series de tiempo univariadas, sus propiedades y las diversas técnicas utilizadas para la predicción. Dado que este artículo se centrará en series de tiempo multivariadas, le sugiero que revise los siguientes artículos que sirven como una buena introducción a las series de tiempo univariadas:

Pero le daré un repaso rápido de lo que es una serie de tiempo univariante, antes de entrar en los detalles de una serie de tiempo multivariante. Veámoslos uno por uno para comprender la diferencia.

1.1 Serie de tiempo univariante

Una serie de tiempo univariante, como sugiere su nombre, es una serie con una única variable dependiente del tiempo.

Por ejemplo, eche un vistazo al conjunto de datos de muestra a continuación que consta de los valores de temperatura (cada hora), durante los últimos 2 años. Aquí, la temperatura es la variable dependiente (dependiente del tiempo).

var_3-3826376

Si se nos pide que pronostiquemos la temperatura para los próximos días, observaremos los valores pasados ​​e intentaremos medir y extraer un patrón. Notaríamos que la temperatura es más baja por la mañana y por la noche, mientras que alcanza su punto máximo por la tarde. Además, si tiene datos de los últimos años, observará que hace más frío durante los meses de noviembre a enero, mientras que es comparativamente más caluroso en abril a junio.

Tales observaciones nos ayudarán a predecir valores futuros. ¿Notó que usamos solo una variable (la temperatura de los últimos 2 años)? Por lo tanto, esto se denomina Análisis / Pronóstico de series de tiempo univariantes.

1.2 Serie de tiempo multivariante (MTS)

Una serie de tiempo multivariante tiene más de una variable dependiente del tiempo. Cada variable depende no solo de sus valores pasados, sino que también tiene cierta dependencia de otras variables. Esta dependencia se utiliza para pronosticar valores futuros. ¿Suena complicado? Dejame explicar.

Considere el ejemplo anterior. Ahora suponga que nuestro conjunto de datos incluye el porcentaje de transpiración, el punto de rocío, la velocidad del viento, el porcentaje de cobertura de nubes, etc. junto con el valor de temperatura de los últimos dos años. En este caso, hay que considerar múltiples variables para predecir la temperatura de manera óptima. Una serie como esta entraría en la categoría de series de tiempo multivariadas. A continuación se muestra una ilustración de esto:

var_4-4710969

Ahora que entendemos cómo es una serie de tiempo multivariante, comprendamos cómo podemos usarla para construir un pronóstico.

2. Manejo de una serie temporal multivariante – VAR

En esta sección, le presentaré uno de los métodos más utilizados para el pronóstico de series de tiempo multivariante: Regresión automática vectorial (VAR).

En un modelo VAR, cada variable es una función lineal de los valores pasados ​​de sí misma y los valores pasados ​​de todas las demás variables. Para explicar esto de una mejor manera, voy a usar un ejemplo visual simple:

Tenemos dos variables, y1 e y2. Necesitamos pronosticar el valor de estas dos variables en el tiempo t, a partir de los datos dados para los n valores pasados. Para simplificar, he considerado que el valor de retraso es 1.

var_12-6941593 var_21-7431126

Para calcular y1

1-3391035

2-2155452

Aquí,

  • a1 y a2 son los términos constantes,
  • w11, w12, w21 y w22 son los coeficientes,
  • e1 y e2 son los términos de error

Estas ecuaciones son similares a la ecuación de un proceso AR. Dado que el proceso AR se utiliza para datos de series de tiempo univariantes, los valores futuros son combinaciones lineales de sus propios valores pasados ​​únicamente. Considere el proceso AR (1):

y

En este caso, tenemos solo una variable – y, un término constante – a, un término de error – e, y un coeficiente – w. Para acomodar los términos de múltiples variables en cada ecuación para VAR, usaremos vectores. Podemos escribir las ecuaciones (1) y (2) de la siguiente forma:

vector_eqn1-5027998

Las dos variables son y1 e y2, seguidas de una constante, una métrica de coeficiente, un valor de retraso y una métrica de error. Ésta es la ecuación vectorial para un proceso VAR (1). Para un proceso VAR (2), se agregará otro término vectorial para el tiempo (t-2) a la ecuación para generalizar para p rezagos:

vector_eqn2-2135928

La ecuación anterior representa un proceso VAR (p) con variables y1, y2… yk. Lo mismo se puede escribir como:

vector_eqn3-6014342

3-7711571

El término εt en la ecuación representa el ruido blanco vectorial multivariado. Para una serie de tiempo multivariante, εt debe ser un vector aleatorio continuo que satisfaga las siguientes condiciones:

  1. E (εt) = 0
    El valor esperado para el vector de error es 0
  2. E (εt1, εt2‘) = σ12
    Valor esperado de εt y εt‘es la desviación estándar de la serie

3. ¿Por qué necesitamos VAR?

Recuerde el ejemplo de pronóstico de temperaturas templadas que vimos anteriormente. Se puede argumentar que se tratará como una serie univariante múltiple. Podemos resolverlo usando métodos simples de pronóstico univariante como AR. Dado que el objetivo es predecir la temperatura, podemos simplemente eliminar las otras variables (excepto la temperatura) y ajustar un modelo a las series univariadas restantes.

Otra idea sencilla es pronosticar los valores de cada serie de forma individual utilizando las técnicas que ya conocemos. ¡Esto haría que el trabajo fuera extremadamente sencillo! Entonces, ¿por qué debería aprender otra técnica de pronóstico? ¿No es este tema lo suficientemente complicado ya?

De las ecuaciones anteriores (1) y (2), está claro que cada variable está usando los valores pasados ​​de cada variable para hacer las predicciones. A diferencia de AR, VAR es capaz de comprender y utilizar la relación entre varias variables.. Esto es útil para describir el comportamiento dinámico de los datos y también proporciona mejores resultados de pronóstico. Además, implementar VAR es tan simple como usar cualquier otra técnica univariante (que verá en la última sección).

4. Estacionariedad de una serie temporal multivariante

Sabemos por el estudio del concepto univariado que una serie de tiempo estacionaria nos dará, en la mayoría de los casos, un mejor conjunto de predicciones. Si no está familiarizado con el concepto de estacionariedad, lea primero este artículo: Una introducción suave al manejo de series temporales no estacionarias.

Para resumir, para una serie de tiempo univariante dada:

y

Se dice que la serie es estacionaria si el valor de | c | <1. Ahora, recuerde la ecuación de nuestro proceso VAR:

4-2968103

Nota: I es la matriz de identidad.

Representar la ecuación en términos de Operadores de retraso, tenemos:

5-2014328

Tomando todos los términos y

6-7179525

7-4583933

El coeficiente de y

codecogseqn-6620479

codecogseqn1-4388314

Para que una serie sea estacionaria, los valores propios de | Φ (L)-1| debe ser menor que 1 en módulo. Esto puede parecer complicado dado el número de variables en la derivación. Esta idea se ha explicado mediante un simple ejemplo numérico en el siguiente video. Le recomiendo que lo vea para solidificar su comprensión:

Similar a la prueba de Dickey-Fuller aumentada para series univariadas, tenemos la prueba de Johansen para verificar la estacionariedad de cualquier dato de series de tiempo multivariante. Veremos cómo realizar la prueba en el último apartado de este artículo.

5. División de validación de tren

Si ha trabajado anteriormente con datos de series de tiempo univariantes, conocerá los conjuntos de validación de trenes. La idea de crear un conjunto de validación es analizar el rendimiento del modelo antes de usarlo para hacer predicciones.

Crear un conjunto de validación para problemas de series de tiempo es complicado porque tenemos que tener en cuenta el componente de tiempo. Uno no puede usar directamente el train_test_split o k-fold validación, ya que esto interrumpirá el patrón en la serie. El conjunto de validación debe crearse teniendo en cuenta los valores de fecha y hora.

Suponga que tenemos que pronosticar la temperatura, el punto de rocío, el porcentaje de nubes, etc. para los próximos dos meses utilizando datos de los últimos dos años. Un método posible es mantener a un lado los datos de los últimos dos meses y entrenar el modelo en los 22 meses restantes.

Una vez que se ha entrenado el modelo, podemos usarlo para hacer predicciones sobre el conjunto de validación. Con base en estas predicciones y los valores reales, podemos verificar qué tan bien se desempeñó el modelo y las variables para las cuales el modelo no lo hizo tan bien. Y para hacer la predicción final, use el conjunto de datos completo (combine el tren y los conjuntos de validación).

6. Implementación de Python

En esta sección, implementaremos el modelo Vector AR en un conjunto de datos de juguetes. He utilizado el conjunto de datos de calidad del aire para esto y puede descargarlo de aquí.

#import required packages
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline

#read the data
df = pd.read_csv("AirQualityUCI.csv", parse_dates=[['Date', 'Time']])

#check the dtypes
df.dtypes

Date_Time        object
CO(GT)            int64
PT08.S1(CO)       int64
NMHC(GT)          int64
C6H6(GT)          int64
PT08.S2(NMHC)     int64
NOx(GT)           int64
PT08.S3(NOx)      int64
NO2(GT)           int64
PT08.S4(NO2)      int64
PT08.S5(O3)       int64
T                 int64
RH                int64
AH                int64
dtype: object

El tipo de datos del Fecha y hora la columna es objeto y tenemos que cambiarlo a fecha y hora. Además, para preparar los datos, necesitamos que el índice tenga fecha y hora. Siga los siguientes comandos:

df['Date_Time'] = pd.to_datetime(df.Date_Time , format="%d/%m/%Y %H.%M.%S")
data = df.drop(['Date_Time'], axis=1)
data.index = df.Date_Time

El siguiente paso es lidiar con los valores perdidos. Dado que los valores perdidos en los datos se reemplazan con un valor -200, tendremos que imputar el valor faltante con un número mejor. Considere esto: si falta el valor actual del punto de rocío, podemos asumir con seguridad que estará cerca del valor de la hora anterior. Tiene sentido, ¿verdad? Aquí, imputaré -200 con el valor anterior.

Puede optar por sustituir el valor utilizando el promedio de algunos valores anteriores, o el valor a la misma hora el día anterior (puede compartir su (s) idea (s) de imputar valores faltantes en la sección de comentarios a continuación).

#missing value treatment
cols = data.columns
for j in cols:
    for i in range(0,len(data)):
       if data[j][i] == -200:
           data[j][i] = data[j][i-1]

#checking stationarity
from statsmodels.tsa.vector_ar.vecm import coint_johansen
#since the test works for only 12 variables, I have randomly dropped
#in the next iteration, I would drop another and check the eigenvalues
johan_test_temp = data.drop([ 'CO(GT)'], axis=1)
coint_johansen(johan_test_temp,-1,1).eig

A continuación se muestra el resultado de la prueba:

array([ 0.17806667,  0.1552133 ,  0.1274826 ,  0.12277888,  0.09554265,
        0.08383711,  0.07246919,  0.06337852,  0.04051374,  0.02652395,
        0.01467492,  0.00051835])

Ahora podemos seguir adelante y crear el conjunto de validación para que se ajuste al modelo y probar el rendimiento del modelo:

#creating the train and validation set
train = data[:int(0.8*(len(data)))]
valid = data[int(0.8*(len(data))):]

#fit the model
from statsmodels.tsa.vector_ar.var_model import VAR

model = VAR(endog=train)
model_fit = model.fit()

# make prediction on validation
prediction = model_fit.forecast(model_fit.y, steps=len(valid))

Las predicciones tienen la forma de una matriz, donde cada lista representa las predicciones de la fila. Transformaremos esto en un formato más presentable.

#converting predictions to dataframe
pred = pd.DataFrame(index=range(0,len(prediction)),columns=[cols])
for j in range(0,13):
    for i in range(0, len(prediction)):
       pred.iloc[i][j] = prediction[i][j]

#check rmse
for i in cols:
    print('rmse value for', i, 'is : ', sqrt(mean_squared_error(pred[i], valid[i])))

Salida del código anterior:

rmse value for CO(GT) is :  1.4200393103392812
rmse value for PT08.S1(CO) is :  303.3909208229375
rmse value for NMHC(GT) is :  204.0662895081472
rmse value for C6H6(GT) is :  28.153391799471244
rmse value for PT08.S2(NMHC) is :  6.538063846286176
rmse value for NOx(GT) is :  265.04913993413805
rmse value for PT08.S3(NOx) is :  250.7673347152554
rmse value for NO2(GT) is :  238.92642219826683
rmse value for PT08.S4(NO2) is :  247.50612831072633
rmse value for PT08.S5(O3) is :  392.3129907890131
rmse value for T is :  383.1344361254454
rmse value for RH is :  506.5847387424092
rmse value for AH is :  8.139735443605728

Después de la prueba en el conjunto de validación, ajustemos el modelo en el conjunto de datos completo

#make final predictions
model = VAR(endog=data)
model_fit = model.fit()
yhat = model_fit.forecast(model_fit.y, steps=1)
print(yhat)

Notas finales

Antes de comenzar este artículo, la idea de trabajar con una serie de tiempo multivariante parecía desalentadora en su alcance. Es un tema complejo, así que tómate tu tiempo para comprender los detalles. La mejor manera de aprender es practicar, por lo que espero que la implementación de Python anterior le sea útil.

Le recomiendo que utilice este enfoque en un conjunto de datos de su elección. Esto consolidará aún más su comprensión de este tema complejo pero muy útil. Si tiene alguna sugerencia o consulta, compártala en la sección de comentarios.

Suscribite a nuestro Newsletter

No te enviaremos correo SPAM. Lo odiamos tanto como tú.