#Estrategias de pronóstico
En los capitulos anteriores, el enfoque ha sido en el preprocesamiento de datos y el análisis descriptivo. A partir de este capítulo, se enfocarán en el último componente del análisis: el pronóstico. Antes de explorar modelos de pronóstico, se presentarán los elementos clave del flujo de trabajo de pronóstico, incluyendo métodos de entrenamiento, evaluación de desempeño y métodos de referencia, proporcionando herramientas para diseñar modelos de pronóstico según los objetivos del análisis.
instalar los paquetes: forecast, TSstudio y plotly
El pronóstico tradicional de series temporales sigue un flujo de trabajo similar al de la mayoría de los campos de análisis predictivo, como regresión o clasificación, e incluye los siguientes pasos: 1. Preparación de datos: Se preparan los datos para entrenar y probar el modelo, dividiendo la serie en entrenamiento y prueba, creando nuevas características y aplicando transformaciones si es necesario. 2. Entrenamiento del modelo: Se entrena un modelo estadístico usando el conjunto de entrenamiento, ajustando y estimando los coeficientes que minimicen el criterio de error seleccionado. 3. Prueba del modelo: Se utiliza el modelo entrenado para pronosticar observaciones de la partición de prueba y evaluar su rendimiento con datos nuevos. 4. Evaluación del modelo: Se evalúa el rendimiento general del modelo en las particiones de entrenamiento y prueba.
Uno de los elementos clave del flujo de trabajo de pronóstico es el proceso de entrenamiento del modelo. La calidad del entrenamiento impacta directamente en el resultado del pronóstico. Los objetivos principales son:
Formalizar la relación de la serie con factores como patrones estacionales, de tendencia, correlación con rezagos y variables externas. Ajustar los parámetros del modelo. Garantizar que el modelo sea escalable con nuevos datos, evitando el sobreajuste. Antes del entrenamiento, se divide la serie en particiones de entrenamiento y prueba, manteniendo el orden cronológico. Esto es importante porque los modelos de series temporales establecen relaciones matemáticas con base en sus rezagos y errores pasados.
#cargar la serie USgas del paquete TSstudio
library (TSstudio)
data (USgas)
#Usemos la función de ventana para dividir la serie en entrenamiento y prueba particiones:
train <- window (USgas,
start = time (USgas) [1],
end = time (USgas) [length (USgas) - 121])
test <- window(USgas,
start = time (USgas) [length(USgas) - 12 + 1],
end = time(USgas) [length (USgas)])
ts_info(train)
## The train series is a ts object with 1 variable and 117 observations
## Frequency: 12
## Start time: 2000 1
## End time: 2009 9
# Ahora, echemos un vistazo a la partición de prueba:
ts_info(test)
## The test series is a ts object with 1 variable and 12 observations
## Frequency: 12
## Start time: 2018 11
## End time: 2019 10
#Alternativamente, la función ts_split del paquete TSstudio proporciona una forma personalizada para crear particiones de entrenamiento y prueba para datos de series de tiempo:
USgas_partitions <- ts_split (USgas, sample.out = 12)
train <- USgas_partitions$train
test <- USgas_partitions$test
#Puede observar en el siguiente resultado que recibimos la misma ejecución resultados que recibimos anteriormente:
ts_info(train)
## The train series is a ts object with 1 variable and 226 observations
## Frequency: 12
## Start time: 2000 1
## End time: 2018 10
#Ahora, veamos la partición de prueba:
ts_info(test)
## The test series is a ts object with 1 variable and 12 observations
## Frequency: 12
## Start time: 2018 11
## End time: 2019 10
La simplicidad de este método es su principal ventaja, ya que permite entrenar y probar un modelo rápidamente usando potencia de cómputo (relativamente) económica. Sin embargo, no es posible concluir la estabilidad y escalabilidad del rendimiento del modelo basándose en una sola prueba. Es posible que un modelo tenga buen rendimiento en el conjunto de prueba por casualidad, pero sea inestable con el tiempo y falle en el pronóstico real. Una forma de mitigar este riesgo es mediante el enfoque de backtesting, que se basa en entrenar un modelo con múltiples particiones de entrenamiento y prueba.
El enfoque de backtesting para entrenar un modelo de pronóstico es una versión avanzada del método de una única muestra fuera de muestra que vimos anteriormente. Se basa en el uso de una ventana móvil para dividir la serie en múltiples pares de particiones de entrenamiento y prueba. Un proceso básico de entrenamiento con backtesting incluye los siguientes pasos:
El uso de la metodología de puntuación nos permite evaluar la estabilidad del modelo al examinar su tasa de error en los diferentes conjuntos de prueba. Consideramos un modelo como estable cuando la distribución del error en los conjuntos de prueba es bastante estrecha. En este caso, la tasa de error del pronóstico real debería estar dentro del mismo rango que los conjuntos de prueba (asumiendo que no haya eventos anormales que afecten la tasa de error del pronóstico).
Los principales parámetros de configuración de un modelo de entrenamiento de backtesting son los siguientes: * La longitud de las particiones de entrenamiento: la establece la configuración de la ventana. Hay dos tipos comunes de ventanas enrollables: * Ventana en expansión: utilizando las primeras N observaciones como partición inicial de entrenamiento, agregue las siguientes n observaciones para crear la siguiente partición de entrenamiento. La longitud de la partición de entrenamiento crece a medida que la ventana pasa sobre la serie. * Ventana deslizante: establece las primeras N observaciones como entrenamiento inicial particionar y cambiar la ventana en 1 observaciones para crear la siguiente partición de entrenamiento. La longitud de las particiones de entrenamiento permanece igual a medida que la ventana pasa sobre la serie: * La longitud de las particiones de prueba: una constante valor, normalmente alineado con la longitud del horizonte de previsión (bajo la limitación del Número mínimo de observaciones necesarias para entrenar. el modelo) * El espacio entre cada partición de entrenamiento—define el ritmo de la ventana rodante * El número de particiones de entrenamiento y prueba.
Tiene más sentido usar la ventana deslizante cuando la serie de entrada tiene cambios estructurales o alta volatilidad, o cuando la mayor parte del poder predictivo está relacionado con la historia más reciente (o una alta correlación con los rezagos más recientes de la serie). Por ejemplo, como vimos en el capítulo anterior, los precios mensuales del petróleo crudo tienen una fuerte relación con los rezagos más recientes de la serie, y la historia lejana no contiene información predictiva poderosa sobre la dirección futura de la serie.
Si bien el enfoque de backtesting nos brinda información intuitiva sobre la estabilidad y escalabilidad del modelo, conlleva un costo de computación más alto en comparación con el método de una sola partición de entrenamiento y prueba. Por lo tanto, se debe tener en cuenta este equilibrio entre los dos enfoques al seleccionar el método de entrenamiento.
El objetivo principal del paso de evaluación es evaluar la capacidad del modelo entrenado para pronosticar (o basándose en otros criterios) las observaciones futuras de la serie con precisión. El proceso incluye hacer lo siguiente:
Análisis residual: se centra en la calidad del modelo, con valores ajustados en la partición de entrenamiento Puntuación del pronóstico: se basa en la capacidad del modelo para pronosticar valores reales del conjunto de prueba
El análisis de residuos prueba qué tan bien el modelo capturó e identificó los patrones de la serie. Además, proporciona información sobre la distribución de los residuos, lo cual es necesario para construir intervalos de confianza para el pronóstico. La definición matemática de un residuo es la diferencia entre la observación real y el valor ajustado correspondiente del modelo, que se observó en el proceso de entrenamiento, o como se expresa en la siguiente ecuación: ft = Yf - Yt (valores residuales, reales y ajustados, respectivamente, en el momento t)
Este proceso incluye el uso de herramientas de visualización de datos y pruebas estadísticas para evaluar lo siguiente:
Evaluar la bondad del ajuste en comparación con los valores reales: Esto se hace trazando los valores residuales a lo largo del tiempo en orden cronológico. El gráfico indica qué tan bien el modelo capturó las oscilaciones de la serie en la partición de entrenamiento. Residuales con oscilaciones aleatorias alrededor de cero y con variación constante (ruido blanco) indican que el modelo logra capturar la mayoría de las variaciones de la serie. Por otro lado, si la oscilación de los residuales no tiene las características de ruido blanco, es un indicativo de que el modelo no logró capturar los patrones de la serie. Algunas posibles interpretaciones del resultado son:
Autocorrelación de los residuales: Esto indica qué tan bien el modelo logró capturar los patrones de la serie. Lags no correlacionados indican que no hay patrones que el modelo no haya capturado. Por otro lado, la existencia de lags correlacionados sugiere patrones que el modelo no logró capturar.
*Distribución de los residuales: Esto es necesario para concluir sobre la confiabilidad del intervalo de confianza del pronóstico. Si los residuales no siguen una distribución normal, no podemos usarlos para crear intervalos de confianza, ya que se basan en la suposición de que los residuales se distribuyen normalmente.
Para demostrar el proceso de análisis de residuos, entrenaremos un modelo ARIMA en la partición de entrenamiento que creamos anteriormente para la serie USgas. No te preocupes si no estás familiarizado con el modelo ARIMA; lo discutiremos en detalle en el Capítulo 11, Pronóstico con el modelo ARIMA. Entrenaremos el modelo con la función auto.arima del paquete forecast:
library (forecast)
## Registered S3 method overwritten by 'quantmod':
## method from
## as.zoo.data.frame zoo
md <- auto.arima(train)
# Utilicemos la función checkresiduals para evaluar el rendimiento del modelo entrenado en la partición de entrenamiento:
checkresiduals (md)
##
## Ljung-Box test
##
## data: Residuals from ARIMA(2,1,1)(2,1,1)[12]
## Q* = 24.949, df = 18, p-value = 0.1263
##
## Model df: 6. Total lags used: 24
El resultado de la prueba de Ljung-Box muestra que, según los resultados del valor p, podemos rechazar la hipótesis nula con un nivel de significancia de 0.01. Esto indica que la correlación entre la serie de residuos y sus rezagos es diferente de cero. El gráfico de ACP también respalda esta conclusión. Esto sugiere que el modelo no capturó completamente todos los patrones de la serie, por lo que podrías considerar modificar los parámetros de ajuste del modelo.
El gráfico de la serie temporal de residuos muestra oscilaciones alrededor del eje x, con excepción de algunos residuos que cruzan el valor de +250. Esto podría indicar la presencia de valores atípicos en esos periodos, por lo que deberías revisar esos puntos de datos en la serie. Más adelante en este capítulo, veremos un método más intuitivo para comparar los valores ajustados con los valores reales utilizando la función test_forecast del paquete TSstudio.
Por último, el gráfico de distribución de los residuos parece representar adecuadamente una distribución normal.
Una vez que finalices el ajuste del modelo, es momento de probar la capacidad del modelo para predecir observaciones que el modelo no ha visto antes (a diferencia de los valores ajustados que el modelo vio durante el proceso de entrenamiento). El método más común para evaluar el éxito del pronóstico al predecir los valores reales es utilizar métricas de precisión o error.
El método más común para evaluar el éxito del pronóstico es predecir los valores reales utilizando una métrica de error para cuantificar la precisión general del pronóstico. La elección de una métrica de error específica depende de los objetivos de precisión del pronóstico. Un ejemplo de métricas de error comunes es el siguiente:
*Error Cuadrático Medio (MSE, por sus siglas en inglés): Cuantifica la distancia promedio al cuadrado entre los valores reales y los pronosticados. El efecto cuadrático del error evita que los valores positivos y negativos se cancelen entre sí y penaliza la puntuación de error a medida que aumenta la tasa de error.
Raíz del Error Cuadrático Medio (RMSE, por sus siglas en inglés): Es la raíz de la distancia promedio al cuadrado entre los valores reales y los pronosticados. Al igual que el MSE, el RMSE tiene una alta tasa de error debido al efecto cuadrático y, por lo tanto, es sensible a los valores atípicos.
Error Absoluto Medio (MAE, por sus siglas en inglés): Mide la tasa de error absoluto del pronóstico. Al igual que MSE y RMSE, este método solo puede tener valores positivos. Esto evita la cancelación de valores positivos y negativos. Por otro lado, no hay penalización por error, por lo que este método no es sensible a los valores atípicos.
Error Absoluto Porcentual Medio (MAPE, por sus siglas en inglés): Mide el error absoluto porcentual promedio. Es más fácil comparar, evaluar o comunicarse con personas no técnicas debido a la representación porcentual.
Por ejemplo, utilicemos el modelo que entrenamos anteriormente para pronosticar las 12 observaciones que dejamos para pruebas y evaluar su rendimiento. Usaremos la función forecast del paquete forecast para pronosticar los siguientes 12 meses (con respecto al punto final de la partición de entrenamiento).
fc <- forecast (md, h = 12)
# Ahora que hemos asignado el pronóstico al objeto fc, usaremos la función accuracy del paquete forecast para evaluar el rendimiento del modelo con respecto a los valores reales en la partición de prueba.
accuracy (fc, test)
## ME RMSE MAE MPE MAPE MASE
## Training set 5.843706 97.81628 73.42676 0.1170431 3.522362 0.6376877
## Test set 37.838606 103.22567 81.46281 1.3104256 3.261542 0.7074783
## ACF1 Theil's U
## Training set -0.004164654 NA
## Test set -0.046706738 0.340398
#Asignamos el pronóstico al objeto fc y utilizamos la función accuracy del paquete forecast para evaluar el rendimiento del modelo en la partición de prueba.
test_forecast (actual = USgas,
forecast.obj = fc,
test = test)
Es más fácil y rápido identificar información sobre la calidad del ajuste de los valores ajustados y pronosticados al graficar esos valores contra los valores reales de la serie. Por ejemplo, notarás de inmediato que el pico de residuos durante 2006 se debe a valores atípicos (o menor consumo que el patrón normal de la serie). Además, el pronóstico real no captó el pico anual de 2018. Estas ideas no pueden observarse con métricas de error.
Según las métricas de error, el modelo entrenado obtuvo un MAPE de 7.84% y un RMSE de 208.01. ¿Cómo podemos evaluar si estos resultados son demasiado altos o bajos? El método más común es comparar el rendimiento del modelo con algún pronóstico de referencia o con algún método anterior que deseamos reemplazar. Un enfoque popular es utilizar un método de pronóstico simple como base de comparación.
Por ejemplo, podemos pronosticar la serie con un enfoque ingenuo y usarlo como referencia para el pronóstico anterior que creamos con el modelo ARIMA. Un enfoque ingenuo asume que el valor observado más reciente es el verdadero representante del futuro, por lo que continuará con el último valor hasta el infinito (o hasta el horizonte del pronóstico). Podemos crear un pronóstico ingenuo con la función naive del paquete forecast y usar el conjunto de entrenamiento como entrada del modelo.
library (forecast)
naive_model <- naive(train, h = 12)
test_forecast (actual = USgas,
forecast.obj = naive_model,
test = test)
accuracy (naive_model, test)
## ME RMSE MAE MPE MAPE MASE
## Training set -1.028444 285.6607 228.5084 -0.9218463 10.97123 1.984522
## Test set 301.891667 499.6914 379.1417 9.6798015 13.28187 3.292723
## ACF1 Theil's U
## Training set 0.3761105 NA
## Test set 0.7002486 1.499679
En el caso del modelo ingenuo, no hay un proceso de entrenamiento, y los valores ajustados se establecen como los valores reales (como se puede ver en el gráfico anterior). Dado que Usgas tiene un fuerte patrón estacional, tiene sentido usar un modelo ingenuo estacional que tome en cuenta la variación estacional. El modelo snaive del paquete forecast utiliza el último punto estacional como pronóstico para todas las observaciones estacionales correspondientes. Por ejemplo, si estamos usando una serie mensual, el valor del enero más reciente en la serie se usará como pronóstico para todos los futuros meses de enero.
snaive_model <- snaive(train, h = 12)
test_forecast (actual = USgas,
forecast.obj = snaive_model,
test = test)
accuracy (snaive_model, test)
## ME RMSE MAE MPE MAPE MASE ACF1
## Training set 33.99953 148.7049 115.1453 1.379869 5.494048 1.000000 0.4859501
## Test set 96.45000 164.6967 135.8833 3.612060 5.220458 1.180103 -0.2120929
## Theil's U
## Training set NA
## Test set 0.4289964
Parece que el modelo ingenuo estacional tiene un mejor ajuste para el tipo de serie que estamos pronosticando, es decir, USgas, debido a su fuerte patrón estacional (en comparación con el modelo ingenuo). Por lo tanto, lo utilizaremos como referencia para el modelo ARIMA. Al comparar tanto el MAPE como el RMSE de los dos modelos en la partición de prueba, está claro que el modelo ARIMA ofrece una mejora (en términos de precisión) con respecto al modelo de referencia.
Una vez que el modelo ha sido entrenado, probado, ajustado (si es necesario) y evaluado con éxito, podemos avanzar al último paso y finalizar el pronóstico. Este paso se basa en recalibrar los pesos o coeficientes del modelo con toda la serie. Hay dos enfoques para utilizar la configuración de los parámetros del modelo:
*Si el modelo fue ajustado manualmente, debes usar los parámetros de ajuste exactos que se utilizaron en el modelo entrenado.
Si el modelo fue ajustado automáticamente por un algoritmo (como la función auto.arima que utilizamos anteriormente), puedes hacer lo siguiente: Extraer la configuración de parámetros que se usó con la partición de entrenamiento. *Permitir que el algoritmo ajuste nuevamente los parámetros del modelo usando toda la serie, bajo la suposición de que el algoritmo tiene la capacidad de ajustar los parámetros del modelo correctamente cuando se entrena el modelo con datos nuevos.
Se recomienda el uso de algoritmos para automatizar el proceso de ajuste del modelo cuando se prueba la capacidad del modelo para ajustar el modelo con pruebas retrospectivas. Esto te permite revisar si el algoritmo tiene la capacidad de ajustar los parámetros del modelo correctamente, basándose en los resultados de las pruebas retrospectivas. Por razones de simplicidad, seguiremos utilizando el modelo auto.arima para entrenar el modelo final.
El objetivo principal del proceso de pronóstico es minimizar la incertidumbre alrededor de los valores futuros de la serie. Aunque no podemos eliminar por completo esta incertidumbre, podemos cuantificarla y proporcionar un rango alrededor de la estimación puntual del pronóstico. Esto se puede hacer utilizando un intervalo de confianza o un intervalo creíble (cuando se usa un modelo bayesiano), o mediante simulación.
El intervalo de confianza es un método de aproximación estadística que se utiliza para expresar el rango de valores posibles que contiene el valor verdadero con cierto grado de confianza (o probabilidad). Hay dos parámetros que determinan el rango del intervalo de confianza:
El nivel de confianza o la probabilidad de que el valor verdadero esté dentro de ese rango. Cuanto mayor sea el nivel de confianza, más amplio será el intervalo.
La desviación estándar estimada del pronóstico en el tiempo T+i, donde T representa la longitud de la serie e i representa el valor i pronosticado. Cuanto menor sea la tasa de error, más corto será el rango del intervalo de predicción.
Por defecto, la función forecast genera un intervalo de predicción con un nivel de confianza del 80% y 95%, pero se puede modificar usando el argumento level. Por ejemplo, usemos las funciones md_final y forecast del modelo entrenado para los próximos 60 meses utilizando un intervalo de predicción con niveles de confianza del 80% y 90%.
Una forma alternativa es usar la distribución del modelo para simular posibles trayectorias para el pronóstico. Este método solo se puede usar cuando se dispone de la distribución del modelo. La función forecast_sim del paquete TSstudio ofrece una función incorporada para simular posibles trayectorias de pronóstico. Esta estimación se puede usar para calcular la estimación puntual del pronóstico (por ejemplo, usando la media o la mediana de todas las trayectorias), o para calcular probabilidades de obtener diferentes valores. Alimentaremos el mismo modelo a la función y ejecutaremos 100 iteraciones.
El enfoque de “carrera de caballos” es una estrategia de pronóstico robusta que combina lo aprendido en este capítulo. Consiste en entrenar, probar y evaluar múltiples modelos de pronóstico y seleccionar el modelo con el mejor rendimiento en las particiones de prueba. En el siguiente ejemplo, aplicaremos una carrera de caballos entre siete modelos diferentes utilizando seis períodos de pruebas retrospectivas. La función ts_backtesting del paquete TSstudio realiza todo el proceso de entrenamiento, prueba, evaluación y luego pronostica usando el modelo que tuvo el mejor rendimiento en las particiones de prueba retrospectivas. Por defecto, la función probará los siguientes modelos: * auto.arima: Automated ARIMA model * bsts: Bayesian structural time series model * ets: Exponential smoothing state space model * hybrid: An ensemble of multiple models * nnetar: Neural network time series model * tbats: Exponential smoothing state space model, along with Box-Cox transformation, trend, ARMA errors, and seasonal components * HoltWinters: Holt-Winters filtering
# Antes de ejecutar la función, configuremos el valor de la semilla con la función set.seed para poder reproducir los resultados.
set.seed(1234)
#USgas_forecast <- ts_backtesting(ts.obj = Usgas,
#periods = 6,
#models = "abehntw",
#error = "MAPE",
#window_size = 12,
#h = 60,
#plot = FALSE)
#El codigo propuesto no funciona pues dice que la función "ts_backtesting" no fue encontrada, segun leí en internet esta función ya no estaá disponible.
El modelo ofrece un cuadro de clasificación (como podemos ver en la salida anterior) ordenado según el criterio de error establecido. En este caso, el modelo bst s tuvo la tasa de error más baja, por lo que la función recomienda su uso (aunque todos los modelos y sus pronósticos están disponibles para extracción a partir de la salida de la función). Podemos graficar la tasa de error y el pronóstico sugerido utilizando el modelo almacenado en el objeto de salida.
#USgas_forecast$summary_plot
#esta parte del codigo tampoco funciona pues depende de la parte enterior
El proceso de entrenamiento de un modelo de pronóstico es el paso final del análisis de series temporales. El enfoque de este capítulo fue introducir el principio del flujo de trabajo de pronóstico. Como vimos, existen varios métodos que podemos utilizar para entrenar un modelo de pronóstico, y la elección del método debe estar alineada con los objetivos de pronóstico y los recursos disponibles. En los siguientes capítulos, veremos estas aplicaciones en la práctica.
En el próximo capítulo, utilizaremos las aplicaciones del modelo de regresión lineal para pronosticar datos de series temporales.
#Nota final
#md_final <- auto.arima (USgas) fc_final <- forecast (md_final, h = 12) #graficar el pronostico final plot_forecast (fc_final, title = "The US Natural Gas Consumption Forecast", Xtitle = "Year", Ytitle = "Billion Cubic Feet")
#fc_final2 <- forecast (md_final, h = 60, level = c(80, 90)) plot_forecast (fc_final2, title = "The US Natural Gas Consumption Forecast", Xtitle = "Year", Ytitle = "Billion Cubic Feet")
#fc_final3 <- forecast_sim(model = md_final, h = 60, n = 500) library (plotly) fc_final3$plot %>% layout (title = "US Natural Gas Consumption - Forecasting Simulation", yaxis = list(title = "Billion Cubic Feet"), xaxis = list(title = "Year"))
#Estos codigos no pudieron ejecutarse pues funcionan con la libreria "plotly", que, tal como la vez pasada, al momento de publicarlos a RPubs genera un error "pandoc"