In this chapter we can see the last component of the analysis “forecast” This includes approaches for training a forecasting model, performance evaluation, and benchmark methods. This will provide you with a set of tools for designing and building a forecasting model according to the goal of the analysis.
#TRAINING APROCHES La principal meta de estos procesos es formalizar la relación de la serie con otros factores, como patrones estacionales y patrones de tendencia, correlación con rezagos pasados y variables externas de una de forma predictiva
se trara en dividir la serie en particiones de entrenamiento y prueba (o particiones in.’sample y out-sample, respectivamente), entrenar el modelo en la partición de entrenamiento y probar su rendimiento en el conjunto de prueba:
Por ejemplo, si tenemos una serie mensual con 72 observaciones (o 6 años) y el objetivo es pronosticar el año siguiente (o 12 meses), tendría sentido utilizar las primeras 60 observaciones para el entrenamiento y probar el rendimiento utilizando las últimas 12 observaciones. La creación de particiones en R puede hacerse manualmente con la función wi ndow del paquete stats. Por ejemplo dividamos la serie USgas en particiones, dejando las últimas 12 observaciones de la serie como partición de prueba y el resto como partición de entrenamiento. como partición de prueba y el resto como entrenamiento:
library(TSstudio)
Podemos observar las principales características de la serie USgas con el ts_info función, podemos obetener la siguiente salida :
data(USgas)
ts_info(USgas)
## The USgas series is a ts object with 1 variable and 238 observations
## Frequency: 12
## Start time: 2000 1
## End time: 2019 10
Usemos la función de window para dividir la serie en entrenamiento y prueba particiones:
train <- window(USgas,
start = time(USgas)[1],
end = time(USgas)[length(USgas) - 12])
y a qui podemos observar la particion.
test <- window(USgas,
start = time(USgas)[length(USgas) - 12 + 1],
end = time(USgas)[length(USgas)])
Alternativamente, la función ts_Split del paquete TSstudio proporciona una forma personalizada de crear particiones de entrenamiento y prueba para datos de series temporales:
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
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 t s_Sp I i t del paquete TSstudio proporciona una forma personalizada de crear particiones de entrenamiento y prueba para datos de series temporales:
USgas_partitions <- ts_split(USgas, sample.out = 12)
train <- USgas_partitions$train
test <- USgas_partitions$test
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
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
El objetivo principal del paso de evaluación es evaluar la capacidad del modelo entrenado para pronosticar (o en base a otros criterios) las observaciones futuras de la serie con precisión.
El análisis residual comprueba hasta qué punto el modelo captó e identificó los patrones de la serie. En Además, proporciona información sobre la distribución de los residuos, necesaria para construir intervalos de confianza para la previsión.
Utilicemos la función Checkresidual para evaluar el rendimiento del modelo entrenado sobre la partición de entrenamiento
Obtenemos los siguientes residuos del modelo ARIMA:
library(forecast)
## Registered S3 method overwritten by 'quantmod':
## method from
## as.zoo.data.frame zoo
Entrenaremos el modelo con la función auto.arima del paquete de previsión:
md <- auto.arima(train)
Para examinar los residuos, usaremos la función checkresidual del pronóstico, sto es muy imoprtante poprque nos devuelve datos que son relevantes como Ljung-Box, que es un metodo estadistico para probar si la autocorrelacion de una serie es diferente de 0, de modo que se usan las siguientes hipotesis.
Ho: El nivel de correlación entre la serie y su rezago es igual a cero, y por lo tanto, las observaciones de la serie son independientes
H/: El nivel de correlación entre la serie y su rezago es diferente de cero # ——– Code Chank 4 ——–
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
#Anotando el pronóstico
Se debe probar la capacidad del modelo para predecir observaciones que el modelo no vio antes (a diferencia de los valores ajustados que el modelo visto durante todo el proceso de formación)
El método más común para evaluar el éxito del pronóstico para predecir los valores reales es usar métricas de precisión o error, predecir los valores reales
Por ejemplo, usemos el modelo que entrenamos anteriormente para pronosticar las 12 observaciones que dejamos para probar y calificar su desempeño. Usamos la función “forecast” del pronóstico paquete para pronosticar los siguientes 12 montajes (con respecto al punto final del entrenamiento dividir)
fc <- forecast(md, h = 12)
Ahora que hemos asignado el pronóstico al objeto fc, se usara a función de precisión del paquete de pronóstico para calificar el desempeño del modelo con respecto al real valores 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
La función de precisión, vuelve varias métricas de error tanto para los valores ajustados (la fila del conjunto de entrenamiento) como para el valor real pronóstico (la fila Conjunto de prueba). Notará que los resultados del modelo MAPE son 3.52% y 7.84% en las particiones de entrenamiento y prueba, respectivamente. Una mayor tasa de error en las pruebas.
Un enfoque alternativo para evaluar el ajuste del modelo tanto en el entrenamiento como en la prueba es con la función t e st_f o r e c a st del paquete TSstudio. Esta función visualiza la serie real, los valores ajustados en la partición de entrenamiento y los valores pronosticados en la conjunto de prueba Al pasar el cursor sobre los valores ajustados o pronosticados
test_forecast(actual = USgas,
forecast.obj = fc,
test = test)
En el caso del modelo ingenuo, no hay proceso de entrenamiento y los valores ajustados se establecen como los valores reales (como se puede ver en el gráfico anterior). Dado que el gas estadounidense tiene una fuerte patrón estacional, tendría sentido utilizar un modelo ingenuo estacional que tenga en cuenta la variación estacional. sna i ve_mode I del paquete de pronóstico usa el último punto estacional como un pronóstico de todas las observaciones estacionales correspondientes. Por ejemplo, si estamos usando serie mensual, el valor del mes de enero más reciente de la serie se utilizará como punto pronóstico para todos los meses de enero futuros:
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
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
Se recomienda el uso de algoritmos para automatizar el proceso de ajuste del modelo cuando el la capacidad del modelo para ajustar el modelo se prueba con backtesting. Esto le permite revisar si el algoritmo tiene la capacidad de ajustar los parámetros del modelo correctamente, en función de la resultados del backtesting. Por razones de simplicidad, seguiremos usando la función auto.arima un modelo arima para entrenar el modelo final
md_final <- auto.arima(USgas)
fc_final <- forecast(md_final, h = 12)
Usaremos la función plot_farecast del paquete TSstudio para trazar el resultado final. pronóstico: # ——– Code Chank 11 ——–
plot_forecast(fc_final,
title = "The US Natural Gas Consumption Forecast",
Xtitle = "Year",
Ytitle = "Billion Cubic Feet")
#Manejo de la incertidumbre del pronóstico
El objetivo principal del proceso de pronóstico, como vimos anteriormente, es minimizar el nivel de incertidumbre en torno a los valores futuros de la serie. Aunque no podemos completamente eliminar esta incertidumbre, podemos cuantificarla y proporcionar algún rango alrededor del punto estimación del pronóstico (que no es más que el valor esperado del modelo de cada punto en el futuro). Esto se puede hacer usando el intervalo de confianza (o un intervalo creíble, cuando se utiliza el modelo bayesiano) o mediante simulación.
#Intervalo de confianza
El intervalo de confianza es un método de aproximación estadística que se utiliza para expresar la rango de valores posibles que contienen el valor verdadero con algún grado de confianza (o probabilidad). Hay dos parámetros que determinan el rango del intervalo de confianza # ——– Code Chank 12 ——–
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")
Por defecto, la función de FORECAST genera un intervalo de predicción con un nivel de confianza de 80% y 95%, pero puede modificarlo usando el argumento de nivel. Por ejemplo, usemos el funciones md_final y forecast del modelo entrenado para los próximos 60 meses usando el intervalo de predicción con niveles de confianza del 80% y 90%
#Simulation
Un enfoque alternativo es usar el modelo de distribución para simular posibles caminos para el pronóstico. Este método solo se puede utilizar cuando la distribución del modelo está disponible. El La función forecast_sim del paquete TSstudio proporciona una función integrada para simular posibles caminos de pronóstico. Esta estimación se puede utilizar para calcular el pronóstico. estimación puntual (por ejemplo, utilizando la media o la mediana de todas las rutas), o para calcular probabilidades de obtener diferentes valores. Introduciremos el mismo modelo a la función y ejecutar 100 iteraciones:
fc_final3 <- forecast_sim(model = md_final,
h = 60,
n = 500)
#Aproximación a la carrera de caballo Por último, pero no menos importante, El enfoque de la carrera de caballos se basa en entrenar, probar y evaluar múltiples modelos de pronóstico y seleccionar el modelo que funciona mejor en las particiones de prueba. En el siguiente ejemplo, aplicaremos horse carreras entre siete modelos diferentes,usando seis períodos de backtesting La función ts_backte ting del paquete TSstudio dirige la diversión proceso de entrenamiento, prueba, evaluación y luego pronóstico, usando el modelo que se desempeñó mejor en las particiones de prueba de backtesting
set.seed(1234)
methods <- list(ets1 = list(method = "ets",
method_arg = list(opt.crit = "lik"),
notes = "ETS model with opt.crit = lik"),
ets2 = list(method = "ets",
method_arg = list(opt.crit = "amse"),
notes = "ETS model with opt.crit = amse"),
arima1 = list(method = "arima",
method_arg = list(order = c(2,1,0)),
notes = "ARIMA(2,1,0)"),
arima2 = list(method = "arima",
method_arg = list(order = c(2,1,2),
seasonal = list(order = c(1,1,1))),
notes = "SARIMA(2,1,2)(1,1,1)"),
hw = list(method = "HoltWinters",
method_arg = NULL,
notes = "HoltWinters Model"),
tslm = list(method = "tslm",
method_arg = list(formula = input ~ trend + season),
notes = "tslm model with trend and seasonal components"))
# Training the models with backtesting
md <- train_model(input = USgas,
methods = methods,
train_method = list(partitions = 6,
sample.out = 12,
space = 3),
horizon = 12,
error = "MAPE")
## # A tibble: 6 × 7
## model_id model notes avg_mape avg_rmse `avg_coverage_80%` `avg_coverage_95%`
## <chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl>
## 1 hw HoltWi… Holt… 0.0482 144. 0.792 0.931
## 2 ets1 ets ETS … 0.0526 156. 0.833 0.972
## 3 arima2 arima SARI… 0.0546 163. 0.583 0.819
## 4 ets2 ets ETS … 0.0650 185. 0.5 0.792
## 5 tslm tslm tslm… 0.0854 242. 0.319 0.611
## 6 arima1 arima ARIM… 0.163 539. 0.861 0.958
library(forecast)
plot_error(md)