INTRODUCTION

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

Training with single training and testing partions

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

——– Code Chank 2 ——–

The sample.out argument set the size of the testing partition

(and therefore the training partition)

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

——– Code Chank 3 ——–

Evaluación de pronósticos

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.

ANALISIS RESIDUAL

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.

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)

——– Code Chank 5 ——–

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

——– Code Chank 6 ——–

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) 

Punto de referencia Forecast

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:

——– Code Chank 8 ——–

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

——– Code Chank 9 ——–

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

——– Code Chank 10 ——–

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:

——– Code Chank 13 ——–

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

——– Code Chank 14 ——–

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)