library(tidyverse)
library(tsibble)
library(feasts)
library(fable)
library(tsibbledata)
library(fpp3)
library(plotly)
library(dplyr)Tarea - Suavización exponencial
Tarea
Seleccionar dos series de tiempo vistas en clase y realizar lo siguiente:
De preferencia, que una serie de tiempo tenga un patrón estacional y la otra sin estacionalidad.
Selección de series de tiempo
tabaco <- aus_production |>
select(Tobacco) |>
filter_index(. ~ "2004 Q2")
tabaco# A tsibble: 194 x 2 [1Q]
Tobacco Quarter
<dbl> <qtr>
1 5225 1956 Q1
2 5178 1956 Q2
3 5297 1956 Q3
4 5681 1956 Q4
5 5577 1957 Q1
6 5651 1957 Q2
7 5317 1957 Q3
8 6152 1957 Q4
9 5758 1958 Q1
10 5641 1958 Q2
# ℹ 184 more rows
autoplot(tabaco)Plot variable not specified, automatically selected `.vars = Tobacco`
gdp_españa <- global_economy |>
filter(Country == "Spain") |>
select(GDP)
gdp_españa# A tsibble: 58 x 2 [1Y]
GDP Year
<dbl> <dbl>
1 12072126075. 1960
2 13834300571. 1961
3 16138545209. 1962
4 19074913948. 1963
5 21343844644. 1964
6 24756958695. 1965
7 28721062242. 1966
8 31647119228. 1967
9 31475548481. 1968
10 36038711600. 1969
# ℹ 48 more rows
autoplot(gdp_españa)Plot variable not specified, automatically selected `.vars = GDP`
Selección de datos de entrenamiento
tabaco_train <- tabaco |>
filter_index("1975 Q1" ~ "2001 Q4")
tabaco_train# A tsibble: 108 x 2 [1Q]
Tobacco Quarter
<dbl> <qtr>
1 6971 1975 Q1
2 8021 1975 Q2
3 8133 1975 Q3
4 8349 1975 Q4
5 6687 1976 Q1
6 7991 1976 Q2
7 6900 1976 Q3
8 7119 1976 Q4
9 7156 1977 Q1
10 8671 1977 Q2
# ℹ 98 more rows
autoplot(tabaco_train)Plot variable not specified, automatically selected `.vars = Tobacco`
españa_train <- gdp_españa |>
filter_index("1960" ~ "2012")
españa_train# A tsibble: 53 x 2 [1Y]
GDP Year
<dbl> <dbl>
1 12072126075. 1960
2 13834300571. 1961
3 16138545209. 1962
4 19074913948. 1963
5 21343844644. 1964
6 24756958695. 1965
7 28721062242. 1966
8 31647119228. 1967
9 31475548481. 1968
10 36038711600. 1969
# ℹ 43 more rows
autoplot(españa_train)Plot variable not specified, automatically selected `.vars = GDP`
Gráfica de las series de entrenamiento
t <- tabaco_train |>
autoplot(Tobacco) +
labs(
title = "Serie de tiempo del Tabaco",
y = "Tobacco"
)
ggplotly(t, dynamicTicks = TRUE) |>
rangeslider()tabaco_train |>
gg_season(Tobacco) |>
ggplotly() |>
layout(title = "Estacionalidad de la serie de tiempo del Tabaco")e <- españa_train |>
autoplot(GDP) +
labs(
title = "Serie de tiempo del GDP de España",
y = "GDP"
)
ggplotly(e, dynamicTicks = TRUE) |>
rangeslider()Descomposición de las series de tiempo
#Gráfica con logaritmo
españa_train |>
autoplot(log(GDP)) +
ggtitle("Serie de tiempo del GDP de España con transformación logarítmica")#Descomposición con logaritmo de españa
españa_train |>
model(stl = STL(log(GDP), robust = TRUE)) |>
components() |>
autoplot() |>
ggplotly() |>
layout(title = "Descomposición STL del GDP de españa con transformación log")#Descomposición del tabaco
tabaco_train |>
model(stl = STL(Tobacco, robust = TRUE)) |>
components() |>
autoplot() |>
ggplotly() |>
layout(title = "Descomposición STL del Tabaco")Seleccionar el método de referencia que mejores resultados haya dado para cada serie.
Creación de modelos (fit)
españa_fit_l <- españa_train |>
model(
mean = MEAN(log(GDP)),
naive = NAIVE(log(GDP)),
drift = RW(log(GDP) ~ drift())
)
tabaco_fit <- tabaco_train |>
model(
mean = MEAN(Tobacco),
naive = NAIVE(Tobacco),
snaive = SNAIVE(Tobacco),
drift = RW(Tobacco ~ drift())
)
españa_fit_l# A mable: 1 x 3
mean naive drift
<model> <model> <model>
1 <MEAN> <NAIVE> <RW w/ drift>
tabaco_fit# A mable: 1 x 4
mean naive snaive drift
<model> <model> <model> <model>
1 <MEAN> <NAIVE> <SNAIVE> <RW w/ drift>
Análisis de residuos del log(GDP) de España
españa_fit_l |>
select(drift) |>
gg_tsresiduals() +
ggtitle("Residuals Diagnostics for the Drift Model")Warning: Removed 1 row containing missing values (`geom_line()`).
Warning: Removed 1 rows containing missing values (`geom_point()`).
Warning: Removed 1 rows containing non-finite values (`stat_bin()`).
españa_fit_l |>
select(mean) |>
gg_tsresiduals() +
ggtitle("Residuals Diagnostics for the Mean Model")españa_fit_l |>
select(naive) |>
gg_tsresiduals() +
ggtitle("Residuals Diagnostics for the Naive Model")Warning: Removed 1 row containing missing values (`geom_line()`).
Warning: Removed 1 rows containing missing values (`geom_point()`).
Warning: Removed 1 rows containing non-finite values (`stat_bin()`).
españa_accuracy_l <- accuracy(españa_fit_l) |>
arrange(MAPE)
españa_accuracy_l# A tibble: 3 × 10
.model .type ME RMSE MAE MPE MAPE MASE RMSSE ACF1
<chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 drift Training -1.74e10 7.98e10 4.42e10 -0.669 9.12 0.901 1.09 0.393
2 naive Training 2.55e10 7.31e10 4.90e10 8.04 11.7 1 1 0.361
3 mean Training 2.49e11 5.36e11 3.73e11 -182. 249. 7.62 7.33 0.948
#El modelo con mejor error MAPE es el DRIFT con 9.11Análisis de residuos del Tabaco
tabaco_fit |>
select(drift) |>
gg_tsresiduals() +
ggtitle("Residuals Diagnostics for the Drift Model")Warning: Removed 1 row containing missing values (`geom_line()`).
Warning: Removed 1 rows containing missing values (`geom_point()`).
Warning: Removed 1 rows containing non-finite values (`stat_bin()`).
tabaco_fit |>
select(mean) |>
gg_tsresiduals() +
ggtitle("Residuals Diagnostics for the Mean Model")tabaco_fit |>
select(naive) |>
gg_tsresiduals() +
ggtitle("Residuals Diagnostics for the Naive Model")Warning: Removed 1 row containing missing values (`geom_line()`).
Warning: Removed 1 rows containing missing values (`geom_point()`).
Warning: Removed 1 rows containing non-finite values (`stat_bin()`).
tabaco_fit |>
select(snaive) |>
gg_tsresiduals() +
ggtitle("Residuals Diagnostics for the Seasonal Naive Model")Warning: Removed 4 rows containing missing values (`geom_line()`).
Warning: Removed 4 rows containing missing values (`geom_point()`).
Warning: Removed 4 rows containing non-finite values (`stat_bin()`).
tabaco_accuracy <- accuracy(tabaco_fit) |>
arrange(MAPE)
tabaco_accuracy# A tibble: 4 × 10
.model .type ME RMSE MAE MPE MAPE MASE RMSSE ACF1
<chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 snaive Training -1.21e+ 2 587. 453. -2.44 7.40 1 1 0.306
2 drift Training -3.31e-13 815. 655. -0.883 10.4 1.45 1.39 -0.321
3 naive Training -2.29e+ 1 815. 656. -1.25 10.4 1.45 1.39 -0.321
4 mean Training 8.00e-14 1102. 924. -3.20 15.3 2.04 1.88 0.713
#El modelo con mejor error MAPE es el SNAIVE con 7.39Análisis de correlación de Portmanteau
españa_fit_l |>
augment() |>
features(.innov, ljung_box, lag = 5, dof = 0)# A tibble: 3 × 3
.model lb_stat lb_pvalue
<chr> <dbl> <dbl>
1 drift 15.1 0.0101
2 mean 195. 0
3 naive 15.1 0.0101
tabaco_fit |>
augment() |>
features(.innov, ljung_box, lag = 10, dof = 0)# A tibble: 4 × 3
.model lb_stat lb_pvalue
<chr> <dbl> <dbl>
1 drift 129. 0
2 mean 447. 0
3 naive 129. 0
4 snaive 36.7 0.0000644
Modelado usando descomposición
españa_fit_desc <- españa_train |>
model(
stlf = decomposition_model(
STL(log(GDP) ~ season(window = "periodic"), robust = TRUE),
RW(season_adjust ~ drift())
)
)
españa_fit_desc# A mable: 1 x 1
stlf
<model>
1 <STL decomposition model>
Análisis de residuos del modelo de descomposición del GDP de España
españa_fit_desc |>
accuracy() |>
arrange(MAPE)# A tibble: 1 × 10
.model .type ME RMSE MAE MPE MAPE MASE RMSSE ACF1
<chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 stlf Training -17440494957. 7.98e10 4.42e10 -0.669 9.12 0.901 1.09 0.393
#Tiene el mismo MAPE que el drift con 9.11
españa_fit_desc |>
augment() |>
features(.innov, ljung_box)# A tibble: 1 × 3
.model lb_stat lb_pvalue
<chr> <dbl> <dbl>
1 stlf 11.7 0.000626
Modelar cada serie de tiempo mediante suavización exponencial.
Pueden utilizar dos o tres variantes del modelo, según sea el caso. Llevar a cabo el proceso completo de pronóstico.
Modelo nuevo GDP España
españa_fit_exp <- españa_train |>
model(
ets_AAN = ETS(GDP ~ error("A") + trend("A") + season("N")),
ets_AAdN = ETS(GDP ~ error("A") + trend("Ad") + season("N")),
ets_MAdN = ETS(GDP ~ error("M") + trend("Ad") + season("N")),
)
españa_fit_exp# A mable: 1 x 3
ets_AAN ets_AAdN ets_MAdN
<model> <model> <model>
1 <ETS(A,A,N)> <ETS(A,Ad,N)> <ETS(M,Ad,N)>
Modelos nuevos Tabaco
tabaco_fit_exp <- tabaco_train |>
model(
snaive = SNAIVE(Tobacco),
ets_ANA = ETS(Tobacco ~ error("A") + trend("N") + season("A")),
ets_AAdA = ETS(Tobacco ~ error("A") + trend("Ad") + season("A")),
ets_MAdM = ETS(Tobacco ~ error("M") + trend("Ad") + season("M")),
ets_ANA_l = ETS(log(Tobacco) ~ error("A") + trend("N") + season("A")),
ets_AAdA_l = ETS(log(Tobacco) ~ error("A") + trend("Ad") + season("A")),
ets_MAdM_l = ETS(log(Tobacco) ~ error("M") + trend("Ad") + season("M")),
stl_ets_A = decomposition_model(
STL(log(Tobacco), robust = TRUE),
ETS(season_year ~ error("A") + trend("N") + season("A")),
ETS(season_adjust ~ error("A") + trend("Ad") + season("N"))
),
stl_ets_M = decomposition_model(
STL(log(Tobacco), robust = TRUE),
ETS(season_year ~ error("M") + trend("N") + season("M")),
ETS(season_adjust ~ error("A") + trend("Ad") + season("N"))
)
)
tabaco_fit_exp# A mable: 1 x 9
snaive ets_ANA ets_AAdA ets_MAdM ets_ANA_l ets_AAdA_l
<model> <model> <model> <model> <model> <model>
1 <SNAIVE> <ETS(A,N,A)> <ETS(A,Ad,A)> <ETS(M,Ad,M)> <ETS(A,N,A)> <ETS(A,Ad,A)>
# ℹ 3 more variables: ets_MAdM_l <model>, stl_ets_A <model>, stl_ets_M <model>
Analizar si los modelos de suavización exponencial superan a los métodos de referencia. En caso de que el método de referencia sea mejor, intenten cambiar las características de la suavización exponencial, logrando un mejor pronóstico.
Métricas de error de modelos nuevos
accuracy(españa_fit_exp) |>
arrange(MAPE)# A tibble: 3 × 10
.model .type ME RMSE MAE MPE MAPE MASE RMSSE ACF1
<chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 ets_AAN Training -2661528789. 6.77e10 3.89e10 0.621 8.33 0.794 0.925 0.0965
2 ets_MAdN Training 1571614796. 6.66e10 3.89e10 1.81 8.44 0.793 0.911 -0.0770
3 ets_AAdN Training 6550867499. 6.44e10 3.88e10 3.10 8.60 0.792 0.880 0.0546
# Tenemos un nuevo mejor modelo, el ets_AAN con un MAPE de 8.3264
accuracy(tabaco_fit_exp) |>
arrange(MAPE)# A tibble: 9 × 10
.model .type ME RMSE MAE MPE MAPE MASE RMSSE ACF1
<chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 stl_ets_A Training -31.1 445. 347. -1.02 5.62 0.766 0.759 0.103
2 ets_MAdM Training -75.6 470. 362. -1.75 5.92 0.799 0.802 0.0423
3 ets_MAdM_l Training -42.7 471. 365. -1.26 5.92 0.806 0.803 0.0268
4 ets_AAdA_l Training -40.4 470. 365. -1.23 5.93 0.807 0.801 0.0265
5 ets_AAdA Training -66.1 472. 367. -1.57 6.00 0.810 0.804 0.0306
6 ets_ANA Training -98.0 479. 368. -2.16 6.06 0.813 0.816 -0.0349
7 ets_ANA_l Training -82.6 478. 371. -1.88 6.07 0.820 0.815 0.0220
8 snaive Training -121. 587. 453. -2.44 7.40 1 1 0.306
9 stl_ets_M Training 484. 1898. 956. 5.85 14.0 2.11 3.24 0.197
# Tenemos un nuevo mejor modelo, el stl_ets_A con un MAPE de 5.61Creación de pronósticos
españa_fc_l <- españa_fit_l |>
forecast(h = "5 years")
españa_fc_e <- españa_fit_exp |>
forecast(h = "5 years")
graf1 = españa_fc_l |>
autoplot(gdp_españa |>
filter_index("2000" ~ .), level = NULL) +
facet_wrap(~.model, ncol=1) +
xlab("Año") + ylab("GDP") +
ggtitle("Test para el log(GDP) de España (Modelos tradicionales)") +
guides(colour=guide_legend(title="Forecast"))
graf2 = españa_fc_e |>
autoplot(gdp_españa |>
filter_index("2000" ~ .), level = NULL) +
facet_wrap(~.model, ncol=1) +
xlab("Año") + ylab("GDP") +
ggtitle("Test para el log(GDP) de España (Modelo nuevo)") +
guides(colour=guide_legend(title="Forecast"))
graf1graf2tabaco_fc <- tabaco_fit |>
forecast(h = 10)
tabaco_fc_e <- tabaco_fit_exp |>
forecast(h = 10)
graf3 <- tabaco_fc |>
autoplot(tabaco |>
filter_index("1999" ~.), level = NULL) +
facet_wrap(~.model, ncol=2) +
xlab("Año") + ylab("GDP") +
ggtitle("Test para el Tabaco") +
guides(colour=guide_legend(title="Forecast"))
graf4 <- tabaco_fc_e |>
autoplot(tabaco |>
filter_index("1999" ~.), level = NULL) +
facet_wrap(~.model, ncol=3) +
xlab("Año") + ylab("GDP") +
ggtitle("Test para el Tabaco") +
guides(colour=guide_legend(title="Forecast"))
graf3graf4Pronóstico hacia el futuro con los mejores modelos
españa_fut <- gdp_españa |>
model(
ets_AAN = ETS(log(GDP) ~ error("A") + trend("A") + season("N"))
) |>
forecast(h = "5 years")
tabaco_fut <- tabaco |>
model(
stl_ets_A = decomposition_model(
STL(log(Tobacco), robust = TRUE),
ETS(season_year ~ error("A") + trend("N") + season("A")),
ETS(season_adjust ~ error("A") + trend("Ad") + season("N"))
)
) |>
forecast(h = 10)
españa_fut# A fable: 5 x 4 [1Y]
# Key: .model [1]
.model Year GDP .mean
<chr> <dbl> <dist> <dbl>
1 ets_AAN 2018 t(N(28, 0.013)) 1.35e12
2 ets_AAN 2019 t(N(28, 0.043)) 1.40e12
3 ets_AAN 2020 t(N(28, 0.099)) 1.47e12
4 ets_AAN 2021 t(N(28, 0.19)) 1.57e12
5 ets_AAN 2022 t(N(28, 0.31)) 1.70e12
tabaco_fut# A fable: 10 x 4 [1Q]
# Key: .model [1]
.model Quarter Tobacco .mean
<chr> <qtr> <dist> <dbl>
1 stl_ets_A 2004 Q3 t(N(8.5, 0.0047)) 5090.
2 stl_ets_A 2004 Q4 t(N(8.4, 0.0049)) 4615.
3 stl_ets_A 2005 Q1 t(N(8.3, 0.0052)) 4108.
4 stl_ets_A 2005 Q2 t(N(8.5, 0.0054)) 4845.
5 stl_ets_A 2005 Q3 t(N(8.5, 0.0057)) 5039.
6 stl_ets_A 2005 Q4 t(N(8.4, 0.006)) 4570.
7 stl_ets_A 2006 Q1 t(N(8.3, 0.0063)) 4068.
8 stl_ets_A 2006 Q2 t(N(8.5, 0.0067)) 4799.
9 stl_ets_A 2006 Q3 t(N(8.5, 0.007)) 4993.
10 stl_ets_A 2006 Q4 t(N(8.4, 0.0074)) 4529.
Gráfica de los pronósticos
final_e = españa_fut |>
autoplot(gdp_españa) +
ggtitle("Pronóstico final para el GDP de España")
final_t = tabaco_fut |>
autoplot(tabaco) +
ggtitle("Pronóstico final para el Tabaco")
final_efinal_t