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
md_final <- auto.arima(USgas)
fc_final <- forecast(md_final, h = 12)
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)
## Loading required package: ggplot2
##
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
##
## last_plot
## The following object is masked from 'package:stats':
##
## filter
## The following object is masked from 'package:graphics':
##
## layout