library(readxl)
library(forecast)
PIB <- read_excel("C:/Users/HP/Desktop/EMAS EJERICIOS/Ejercicio de Pronóstico Modelos SARIMA/PIB.xlsx")
col_types = c("skip", "numeric")
# Serie
PIB.ts<- ts(data = PIB, start = c(2009,1),
frequency = 12)
Yt<- PIB.ts
Generacion de Grafica general
library(TSstudio)
library(forecast)
ts_plot(Yt,Xtitle = "Años/Meses")
Orden de Integración
library(kableExtra)
library(magrittr)
d<-ndiffs(Yt)
D<-nsdiffs(Yt)
ordenes_integracion<-c(d,D)
names(ordenes_integracion)<-c("d","D")
ordenes_integracion %>% kable(caption = "Ordenes de Integración") %>% kable_material()
| x | |
|---|---|
| d | 1 |
| D | 0 |
# Gráfico de la serie diferenciada
Yt %>%
diff(lag = 12,diffences=D) %>%
diff(diffences=d) %>%
ts_plot(title = "Yt estacionaria")
Yt %>%
diff(lag = 12,diffences=D) %>%
diff(diffences=d) %>%
ts_cor(lag.max = 36)
Usando forecast
library(forecast)
library(ggthemes)
modelo_estimado <- Yt %>%
Arima(order = c(0, 1, 0),
seasonal = c(1, 1, 1))
summary(modelo_estimado)
## Series: .
## ARIMA(0,1,0)(1,1,1)[12]
##
## Coefficients:
## sar1 sma1
## 0.9702 -0.9397
## s.e. 0.6151 0.7678
##
## sigma^2 = 91195: log likelihood = -277.28
## AIC=560.56 AICc=561.25 BIC=565.55
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE
## Training set -0.7865574 254.7334 117.8703 -0.1388922 1.972113 0.1805655
## ACF1
## Training set -0.1635746
modelo_estimado %>% autoplot(type="both")+theme_solarized()
modelo_estimado %>% check_res(lag.max = 36)
## Warning: Ignoring 36 observations
## Warning: Ignoring 34 observations
## Warning: Ignoring 4 observations
Estimación del modelo
library(forecast)
modeloHW<-HoltWinters(x = Yt,
seasonal = "multiplicative",
optim.start = c(0.9,0.9,0.9))
modeloHW
## Holt-Winters exponential smoothing with trend and multiplicative seasonal component.
##
## Call:
## HoltWinters(x = Yt, seasonal = "multiplicative", optim.start = c(0.9, 0.9, 0.9))
##
## Smoothing parameters:
## alpha: 0.4054911
## beta : 0
## gamma: 1
##
## Coefficients:
## [,1]
## a 7176.7883149
## b 69.1137019
## s1 0.9696052
## s2 1.0116489
## s3 0.9844298
## s4 1.0214095
## s5 0.9324324
## s6 0.8438392
## s7 0.9570999
## s8 1.0635765
## s9 1.0017664
## s10 1.0409599
## s11 1.0310841
## s12 1.0784685
# Generar el pronostico:
pronosticosHW<-forecast(object = modeloHW,h=12, level=c(0.95,0.99))
pronosticosHW
## Point Forecast Lo 95 Hi 95 Lo 99 Hi 99
## May 2013 7025.664 6397.082 7654.246 6199.567 7851.761
## Jun 2013 7400.228 6717.704 8082.751 6503.240 8297.215
## Jul 2013 7269.157 6545.554 7992.760 6318.182 8220.133
## Aug 2013 7612.813 6836.042 8389.585 6591.963 8633.664
## Sep 2013 7014.089 6224.905 7803.273 5976.926 8051.253
## Oct 2013 6405.980 5609.233 7202.728 5358.877 7453.084
## Nov 2013 7331.944 6444.790 8219.099 6166.026 8497.863
## Dec 2013 8221.125 7241.675 9200.575 6933.909 9508.340
## Jan 2014 7812.588 6836.225 8788.950 6529.430 9095.746
## Feb 2014 8190.195 7156.772 9223.618 6832.047 9548.343
## Mar 2014 8183.754 7125.928 9241.581 6793.535 9573.974
## Apr 2014 8634.383 7705.344 9563.422 7413.419 9855.347
# Gráfico de la serie original y del pronóstico.
pronosticosHW%>% autoplot()
Yt_Sarima<-modelo_estimado$fitted
Yt_HW<-pronosticosHW$fitted
grafico_comparativo<-cbind(Yt,Yt_Sarima,Yt_HW)
ts_plot(grafico_comparativo)
library(tsibble)
##
## Attaching package: 'tsibble'
## The following objects are masked from 'package:base':
##
## intersect, setdiff, union
library(feasts)
## Loading required package: fabletools
##
## Attaching package: 'fabletools'
## The following objects are masked from 'package:forecast':
##
## accuracy, forecast
library(fable)
library(fabletools)
library(tidyr)
##
## Attaching package: 'tidyr'
## The following object is masked from 'package:magrittr':
##
## extract
library(dplyr)
##
## Attaching package: 'dplyr'
## The following object is masked from 'package:kableExtra':
##
## group_rows
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
a<-Yt %>% as_tsibble() %>%
model(arima_original=ARIMA(value ~ pdq(0, 1, 0) + PDQ(1, 1, 1)),
arima_010_011 = ARIMA(value ~ pdq(0, 1, 0) + PDQ(0, 1, 1)),
arima_010_110 = ARIMA(value ~ pdq(0, 1, 0) + PDQ(1, 1, 0)),
arima_automatico=ARIMA(value,ic="bic",stepwise = FALSE)
)
print(a)
## # A mable: 1 x 4
## arima_original arima_010_011 arima_010_110
## <model> <model> <model>
## 1 <ARIMA(0,1,0)(1,1,1)[12]> <ARIMA(0,1,0)(0,1,1)[12]> <ARIMA(0,1,0)(1,1,0)[12]>
## # … with 1 more variable: arima_automatico <model>
a %>% pivot_longer(everything(), names_to = "Model name",
values_to = "Orders") %>% glance() %>%
arrange(AICc) ->tabla
tabla
## # A tibble: 4 × 9
## `Model name` .model sigma2 log_lik AIC AICc BIC ar_roots ma_roots
## <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <list> <list>
## 1 arima_010_110 Orders 89895. -277. 559. 559. 562. <cpl [12]> <cpl [0]>
## 2 arima_010_011 Orders 89992. -277. 559. 559. 562. <cpl [0]> <cpl [12]>
## 3 arima_original Orders 91195. -277. 561. 561. 566. <cpl [12]> <cpl [12]>
## 4 arima_automatico Orders 79850. -364. 732. 732. 736. <cpl [12]> <cpl [0]>
#2. Realice una validación cruzada para los modelos estimados en 1, interprete el MAPE. # Validación Cruzada (Cross Validated)
library(forecast)
library(dplyr)
library(tsibble)
library(fable)
library(fabletools)
Yt<-Yt %>% as_tsibble() %>% rename(PIB=value)
data.cross.validation<-Yt %>%
as_tsibble() %>%
stretch_tsibble(.init = 50,.step = 1)
TSCV<-data.cross.validation %>%
model(ARIMA(PIB ~ pdq(0, 1, 0) + PDQ(1, 1, 1))) %>%
forecast(h=1) %>% accuracy(Yt)
## Warning: The future dataset is incomplete, incomplete out-of-sample data will be treated as missing.
## 1 observation is missing at 2013 may.
print(TSCV)
## # 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 ARIMA(PIB ~ pdq(0, 1, 0… Test 151. 152. 151. 2.03 2.03 0.232 0.223 -0.5
El MAPE anterior era de 1.97% y ahora con la data desconocida el MAPE es de 2.03%, podemos concluir entonces que sigue teniendo un buen poder predictivo de nuestro modelo.
library(readxl)
library(forecast)
IPC <- read_excel("IPC.xlsx")
col_types = c("skip", "numeric")
# Serie
IPC.ts<- ts(data = IPC, start = c(2009,1),
frequency = 12)
Yt<- IPC.ts
Generacion de Grafica general
library(TSstudio)
library(forecast)
ts_plot(Yt,Xtitle = "Años/Meses")
Orden de Integración
library(kableExtra)
library(magrittr)
d<-ndiffs(Yt)
D<-nsdiffs(Yt)
ordenes_integracion<-c(d,D)
names(ordenes_integracion)<-c("d","D")
ordenes_integracion %>% kable(caption = "Ordenes de Integración") %>% kable_material()
| x | |
|---|---|
| d | 1 |
| D | 0 |
# Gráfico de la serie diferenciada
Yt %>%
diff(lag = 12,diffences=D) %>%
diff(diffences=d) %>%
ts_plot(title = "Yt estacionaria")
Yt %>%
diff(lag = 12,diffences=D) %>%
diff(diffences=d) %>%
ts_cor(lag.max = 36)
Usando forecast
library(forecast)
library(ggthemes)
modelo_estimado <- Yt %>%
Arima(order = c(0, 1, 0),
seasonal = c(1, 1, 1))
summary(modelo_estimado)
## Series: .
## ARIMA(0,1,0)(1,1,1)[12]
##
## Coefficients:
## sar1 sma1
## 0.1112 -1.0000
## s.e. 0.0950 0.1139
##
## sigma^2 = 0.2312: log likelihood = -114.66
## AIC=235.33 AICc=235.49 BIC=244.32
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE
## Training set 0.02246671 0.4579215 0.3010507 0.01772013 0.2729747 0.1631385
## ACF1
## Training set 0.2438271
modelo_estimado %>% autoplot(type="both")+theme_solarized()
modelo_estimado %>% check_res(lag.max = 36)
## Warning: Ignoring 36 observations
## Warning: Ignoring 34 observations
## Warning: Ignoring 4 observations
Estimación del modelo
library(forecast)
modeloHW<-HoltWinters(x = Yt,
seasonal = "multiplicative",
optim.start = c(0.9,0.9,0.9))
modeloHW
## Holt-Winters exponential smoothing with trend and multiplicative seasonal component.
##
## Call:
## HoltWinters(x = Yt, seasonal = "multiplicative", optim.start = c(0.9, 0.9, 0.9))
##
## Smoothing parameters:
## alpha: 0.8353873
## beta : 0.07612657
## gamma: 1
##
## Coefficients:
## [,1]
## a 122.7690242
## b 0.4801476
## s1 1.0043291
## s2 1.0021040
## s3 0.9986014
## s4 0.9975846
## s5 0.9989586
## s6 0.9984650
## s7 0.9959074
## s8 0.9975598
## s9 1.0007205
## s10 1.0041558
## s11 1.0048925
## s12 1.0053839
# Generar el pronostico:
pronosticosHW<-forecast(object = modeloHW,h=12, level=c(0.95,0.99))
pronosticosHW
## Point Forecast Lo 95 Hi 95 Lo 99 Hi 99
## Jun 2022 123.7827 122.6365 124.9289 122.2764 125.2891
## Jul 2022 123.9896 122.4499 125.5294 121.9661 126.0132
## Aug 2022 124.0357 122.1459 125.9256 121.5521 126.5194
## Sep 2022 124.3884 122.1648 126.6120 121.4661 127.3108
## Oct 2022 125.0394 122.4870 127.5918 121.6850 128.3938
## Nov 2022 125.4570 122.5842 128.3298 121.6816 129.2325
## Dec 2022 125.6139 122.4280 128.7997 121.4270 129.8008
## Jan 2023 126.3012 122.7897 129.8128 121.6863 130.9162
## Feb 2023 127.1819 123.3369 131.0269 122.1288 132.2351
## Mar 2023 128.1007 123.9171 132.2842 122.6026 133.5987
## Apr 2023 128.6771 124.1616 133.1927 122.7427 134.6116
## May 2023 129.2228 123.9338 134.5118 122.2718 136.1738
# Gráfico de la serie original y del pronóstico.
pronosticosHW%>% autoplot()
Yt_Sarima<-modelo_estimado$fitted
Yt_HW<-pronosticosHW$fitted
grafico_comparativo<-cbind(Yt,Yt_Sarima,Yt_HW)
ts_plot(grafico_comparativo)
library(tsibble)
library(feasts)
library(fable)
library(fabletools)
library(tidyr)
library(dplyr)
a<-Yt %>% as_tsibble() %>%
model(arima_original=ARIMA(value ~ pdq(0, 1, 0) + PDQ(1, 1, 1)),
arima_010_011 = ARIMA(value ~ pdq(0, 1, 0) + PDQ(0, 1, 1)),
arima_010_110 = ARIMA(value ~ pdq(0, 1, 0) + PDQ(1, 1, 0)),
arima_automatico=ARIMA(value,ic="bic",stepwise = FALSE)
)
print(a)
## # A mable: 1 x 4
## arima_original arima_010_011 arima_010_110
## <model> <model> <model>
## 1 <ARIMA(0,1,0)(1,1,1)[12]> <ARIMA(0,1,0)(0,1,1)[12]> <ARIMA(0,1,0)(1,1,0)[12]>
## # … with 1 more variable: arima_automatico <model>
a %>% pivot_longer(everything(), names_to = "Model name",
values_to = "Orders") %>% glance() %>%
arrange(AICc) ->tabla
tabla
## # A tibble: 4 × 9
## `Model name` .model sigma2 log_lik AIC AICc BIC ar_roots ma_roots
## <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <list> <list>
## 1 arima_automatico Orders 0.225 -105. 223. 224. 241. <cpl [27]> <cpl [0]>
## 2 arima_010_011 Orders 0.228 -115. 235. 235. 241. <cpl [0]> <cpl [12]>
## 3 arima_original Orders 0.231 -115. 235. 235. 244. <cpl [12]> <cpl [12]>
## 4 arima_010_110 Orders 0.348 -132. 268. 268. 274. <cpl [12]> <cpl [0]>
#2. Realice una validación cruzada para los modelos estimados en 1, interprete el MAPE. # Validación Cruzada (Cross Validated)
library(forecast)
library(dplyr)
library(tsibble)
library(fable)
library(fabletools)
Yt<-Yt %>% as_tsibble() %>% rename(IPC=value)
data.cross.validation<-Yt %>%
as_tsibble() %>%
stretch_tsibble(.init = 60,.step = 1)
TSCV<-data.cross.validation %>%
model(ARIMA(IPC ~ pdq(0, 1, 0) + PDQ(1, 1, 1))) %>%
forecast(h=1) %>% accuracy(Yt)
## Warning: The future dataset is incomplete, incomplete out-of-sample data will be treated as missing.
## 1 observation is missing at 2022 jun.
print(TSCV)
## # 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 ARIMA(IPC ~ pdq(0, 1,… Test 0.0284 0.473 0.333 0.0200 0.296 0.181 0.173 0.324
El MAPE anterior era de 0.2729% y ahora con la data desconocida el MAPE es de 0.295%, podemos concluir entonces que sigue teniendo un buen poder predictivo de nuestro modelo.
library(readxl)
library(forecast)
I_de_H <- read_excel("I_de_H.xlsx")
col_types = c("skip", "numeric")
# Serie
I_de_H.ts<- ts(data = I_de_H, start = c(2009,1),
frequency = 12)
Yt<- I_de_H.ts
Generacion de Grafica general
library(TSstudio)
library(forecast)
ts_plot(Yt,Xtitle = "Años/Meses")
Orden de Integración
library(kableExtra)
library(magrittr)
d<-ndiffs(Yt)
D<-nsdiffs(Yt)
ordenes_integracion<-c(d,D)
names(ordenes_integracion)<-c("d","D")
ordenes_integracion %>% kable(caption = "Ordenes de Integración") %>% kable_material()
| x | |
|---|---|
| d | 0 |
| D | 0 |
# Gráfico de la serie diferenciada
Yt %>%
diff(lag = 12,diffences=D) %>%
diff(diffences=d) %>%
ts_plot(title = "Yt estacionaria")
Yt %>%
diff(lag = 12,diffences=D) %>%
diff(diffences=d) %>%
ts_cor(lag.max = 36)
Usando forecast
library(forecast)
library(ggthemes)
modelo_estimado <- Yt %>%
Arima(order = c(0, 1, 0),
seasonal = c(1, 1, 1))
summary(modelo_estimado)
## Series: .
## ARIMA(0,1,0)(1,1,1)[12]
##
## Coefficients:
## sar1 sma1
## -0.2732 -0.7686
## s.e. 0.2344 0.4962
##
## sigma^2 = 1.811e+09: log likelihood = -634.64
## AIC=1275.27 AICc=1275.77 BIC=1281.12
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE ACF1
## Training set 905.7283 37323.65 26683.45 -0.2640752 12.4837 0.6564582 -0.4350606
modelo_estimado %>% autoplot(type="both")+theme_solarized()
modelo_estimado %>% check_res(lag.max = 36)
## Warning: Ignoring 36 observations
## Warning: Ignoring 34 observations
## Warning: Ignoring 4 observations
Estimación del modelo
library(forecast)
modeloHW<-HoltWinters(x = Yt,
seasonal = "multiplicative",
optim.start = c(0.9,0.9,0.9))
modeloHW
## Holt-Winters exponential smoothing with trend and multiplicative seasonal component.
##
## Call:
## HoltWinters(x = Yt, seasonal = "multiplicative", optim.start = c(0.9, 0.9, 0.9))
##
## Smoothing parameters:
## alpha: 0.1273406
## beta : 0
## gamma: 0.4793705
##
## Coefficients:
## [,1]
## a 2.465101e+05
## b 1.239453e+03
## s1 9.247101e-01
## s2 8.984179e-01
## s3 8.791852e-01
## s4 8.941624e-01
## s5 9.460044e-01
## s6 1.049825e+00
## s7 9.469010e-01
## s8 9.667736e-01
## s9 9.762889e-01
## s10 1.117116e+00
## s11 9.509380e-01
## s12 8.557828e-01
# Generar el pronostico:
pronosticosHW<-forecast(object = modeloHW,h=12, level=c(0.95,0.99))
pronosticosHW
## Point Forecast Lo 95 Hi 95 Lo 99 Hi 99
## Jun 2014 229096.5 185614.4 272578.5 171951.4 286241.6
## Jul 2014 223696.1 179110.4 268281.8 165100.6 282291.7
## Aug 2014 219997.1 174364.1 265630.2 160025.2 279969.1
## Sep 2014 224853.1 177997.3 271708.9 163274.2 286432.1
## Oct 2014 239062.2 190615.5 287508.9 175392.5 302732.0
## Nov 2014 266599.7 215810.4 317389.1 199851.2 333348.3
## Dec 2014 241636.1 191288.5 291983.7 175468.2 307804.0
## Jan 2015 247905.6 196238.0 299573.1 180002.9 315808.2
## Feb 2015 251555.6 198735.7 304375.5 182138.5 320972.8
## Mar 2015 289226.4 232632.2 345820.6 214849.1 363603.8
## Apr 2015 247380.9 193379.5 301382.3 176411.0 318350.7
## May 2015 223687.5 193456.8 253918.2 183957.6 263417.4
# Gráfico de la serie original y del pronóstico.
pronosticosHW%>% autoplot()
Yt_Sarima<-modelo_estimado$fitted
Yt_HW<-pronosticosHW$fitted
grafico_comparativo<-cbind(Yt,Yt_Sarima,Yt_HW)
ts_plot(grafico_comparativo)
library(tsibble)
library(feasts)
library(fable)
library(fabletools)
library(tidyr)
library(dplyr)
a<-Yt %>% as_tsibble() %>%
model(arima_original=ARIMA(value ~ pdq(0, 1, 0) + PDQ(1, 1, 1)),
arima_010_011 = ARIMA(value ~ pdq(0, 1, 0) + PDQ(0, 1, 1)),
arima_010_110 = ARIMA(value ~ pdq(0, 1, 0) + PDQ(1, 1, 0)),
arima_automatico=ARIMA(value,ic="bic",stepwise = FALSE)
)
print(a)
## # A mable: 1 x 4
## arima_original arima_010_011 arima_010_110
## <model> <model> <model>
## 1 <ARIMA(0,1,0)(1,1,1)[12]> <ARIMA(0,1,0)(0,1,1)[12]> <ARIMA(0,1,0)(1,1,0)[12]>
## # … with 1 more variable: arima_automatico <model>
a %>% pivot_longer(everything(), names_to = "Model name",
values_to = "Orders") %>% glance() %>%
arrange(AICc) ->tabla
tabla
## # A tibble: 4 × 9
## `Model name` .model sigma2 log_lik AIC AICc BIC ar_roots ma_roots
## <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <list> <list>
## 1 arima_010_011 Orders 1.67e9 -635. 1275. 1275. 1279. <cpl> <cpl>
## 2 arima_original Orders 1.81e9 -635. 1275. 1276. 1281. <cpl> <cpl>
## 3 arima_010_110 Orders 2.31e9 -637. 1277. 1278. 1281. <cpl> <cpl>
## 4 arima_automatico Orders 1.11e9 -769. 1541. 1541. 1545. <cpl> <cpl>
#2. Realice una validación cruzada para los modelos estimados en 1, interprete el MAPE. # Validación Cruzada (Cross Validated)
library(forecast)
library(dplyr)
library(tsibble)
library(fable)
library(fabletools)
Yt<-Yt %>% as_tsibble() %>% rename(I_de_H=value)
data.cross.validation<-Yt %>%
as_tsibble() %>%
stretch_tsibble(.init = 60,.step = 1)
TSCV<-data.cross.validation %>%
model(ARIMA(I_de_H ~ pdq(0, 1, 0) + PDQ(1, 1, 1))) %>%
forecast(h=1) %>% accuracy(Yt)
## Warning: The future dataset is incomplete, incomplete out-of-sample data will be treated as missing.
## 1 observation is missing at 2014 jun.
print(TSCV)
## # 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 ARIMA(I_de_H ~ pdq… Test -13393. 54937. 48772. -7.82 21.4 1.20 1.11 -0.120
El MAPE anterior era de 12.48% y ahora con la data desconocida el MAPE es de 21.35%, podemos concluir entonces que no tiene un buen poder predictivo de nuestro modelo.