## Cargando Datos
library(readxl)
library(forecast)
library(readxl)
PIB_trimestral_precios_corrientes_SLV_2009_20211 <- read_excel("PIB trimestral precios corrientes SLV 2009-20211.xlsx",
range = "B7:B58", col_names = FALSE)
## Convirtiendo datos en serie temporal
serie.pib.ts <- ts(data = PIB_trimestral_precios_corrientes_SLV_2009_20211, start = c(2009,1),
frequency = 4)
Yt <- serie.pib.ts
library(TSstudio)
library(forecast)
ts_plot(Yt, Xtitle = "Años/Meses")
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 Integracion") %>% kable_material()
| x | |
|---|---|
| d | 1 |
| D | 1 |
# Gráfico de la serie diferenciada
Yt %>%
diff(lag=4, diffences = D) %>%
diff(diffences = d) %>%
ts_plot(title= "Yt estacionaria")
Yt %>%
diff(lag=4, diffences=D) %>%
diff(diffences=d) %>%
ts_cor(lag.max = 20)
En la parte del ACF debido a que los primeros 3 ordenes están dentro de las bandas (no son significativos), el componente autoregresivo de la parte no ordinaria el valor de p es igual a 0
PACF es para identificar valor de q y debido a que los coeficientes de autocorrelacion parcial se encuentran dentro de las bandas se puede garantizar que no hay un componente de media movil ordinaria (q)
En la parte ordinaria, el PIB trimestral para los años 2009-2021 no depende del valor inmediato anterior ni de los errores de medición.
El componente autoregresivo estacional (P) es 1
En el caso de media movil (Q), se observa que para el primer y segundo periodo resulta ser muy significativa (quiere decir que el valor actual de la serie depende de la fluctuacion del año anterior en este periodo). El componente de media movil es estacional con un valor de 2.
Usando librería forecast
library(forecast)
library(ggthemes)
modelo_estimado<-Yt %>%
Arima(order = c(0,1,0),
seasonal = c(1,1,2))
summary(modelo_estimado)
## Series: .
## ARIMA(0,1,0)(1,1,2)[4]
##
## Coefficients:
## sar1 sma1 sma2
## -0.3494 -0.5042 0.0640
## s.e. 0.5359 0.5323 0.3901
##
## sigma^2 = 79136: log likelihood = -331.65
## AIC=671.31 AICc=672.26 BIC=678.71
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE
## Training set 6.615822 258.7679 121.0037 -0.002908518 2.055323 0.3682692
## ACF1
## Training set -0.1013843
## Raices de los polinomios de la parte autoregresiva y parte media movil.
modelo_estimado %>% autoplot(type="both")+theme_solarized()
## Construye el correlograma
modelo_estimado %>% check_res(lag.max = 52)
El error porcentual absoluto medio (MAPE) es de 2.05%, quiere decir que de cada 100 valores pronosticados la distancia o error cometido es de 2.05%.
library(forecast)
#Estimar el modelo
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.8742302
## beta : 0
## gamma: 0
##
## Coefficients:
## [,1]
## a 7429.8128051
## b 48.3963750
## s1 0.9751646
## s2 1.0058150
## s3 0.9783521
## s4 1.0406683
#Generar el pronostico:
pronosticosMW<-forecast(object = modeloHW,h=12, level=c(0.95))
pronosticosMW
## Point Forecast Lo 95 Hi 95
## 2022 Q1 7292.485 6847.413 7737.557
## 2022 Q2 7570.373 6930.977 8209.768
## 2022 Q3 7411.019 6646.235 8175.804
## 2022 Q4 7933.429 7119.875 8746.982
## 2023 Q1 7481.263 6598.506 8364.020
## 2023 Q2 7765.084 6751.622 8778.546
## 2023 Q3 7600.414 6518.808 8682.020
## 2023 Q4 8134.887 6984.348 9285.426
## 2024 Q1 7670.040 6503.665 8836.415
## 2024 Q2 7959.795 6677.070 9242.520
## 2024 Q3 7789.809 6465.102 9114.515
## 2024 Q4 8336.345 6927.229 9745.462
Yt_Sarima<-modelo_estimado$fitted
Yt_HW<-pronosticosMW$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, 2)),
arima_010_011 = ARIMA(value ~ pdq(0, 1, 0) + PDQ(0, 1, 2)),
arima_010_110 = ARIMA(value ~ pdq(0, 1, 0) + PDQ(1, 1, 1)),
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,2)[4]> <ARIMA(0,1,0)(0,1,2)[4]> <ARIMA(0,1,0)(1,1,1)[4]>
## # ... 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 x 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 77377. -332. 669. 670. 675. <cpl [4]> <cpl [4]>
## 2 arima_010_011 Orders 77738. -332. 670. 670. 675. <cpl [0]> <cpl [8]>
## 3 arima_original Orders 79136. -332. 671. 672. 679. <cpl [4]> <cpl [8]>
## 4 arima_automatico Orders 62738. -334. 676. 677. 683. <cpl [1]> <cpl [4]>
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 = 20, .step = 1)
TSCV <- data.cross.validation %>%
model(ARIMA(PIB ~ pdq(0,1,0)+ PDQ(1,1,2))) %>%
forecast(h=1) %>% accuracy(Yt)
print(TSCV)
## # A tibble: 1 x 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, ~ Test 52.6 416. 230. 0.547 3.71 0.698 0.877 0.0492
El MAPE original era 2.05%, en este caso al hacer el contraste con la data desconocida, el MAPE es de 3.71 por lo que nuestro modelo tiene un buen poder predictivo.
library(readxl)
library(readxl)
IPC_general_SLV_2009_2022_mayo_ <- read_excel("IPC general SLV 2009-2022 (mayo).xltx",range = "B7:B167",col_names = FALSE)
serie.IPC.ts <- ts(data = IPC_general_SLV_2009_2022_mayo_, start = c(2009,1),
frequency = 12)
Yt2 <-serie.IPC.ts
library(TSstudio)
library(forecast)
ts_plot(Yt2, Xtitle = "Años/Meses")
library(kableExtra)
library(magrittr)
d<-ndiffs(Yt2)
D<-nsdiffs(Yt2)
ordenes_integracion2<-c(d,D)
names(ordenes_integracion2)<-c("d","D")
ordenes_integracion2 %>% kable(caption = "Ordenes de Integracion") %>% kable_material()
| x | |
|---|---|
| d | 1 |
| D | 0 |
# El valor de d es 1 y el de D es 0
## Graficando la serie diferenciada
Yt2 %>%
diff(lag=12, diffences= D) %>%
diff(diffences=d) %>%
ts_plot(title= "Yt estacionaria")
## Verificando los valores para (p,q) y (P,Q)
Yt2 %>%
diff(lag=12, diffences = D) %>%
diff(diffences=d) %>%
ts_cor(lag.max = 36)
En la parte del ACF debido a que uno de los ordenes está fuera de las bandas (es significativo), el valor del componente autoregresivo de la parte no ordinaria es igual a 1
PACF es para identificar valor de q y debido a que uno de los coeficientes de autocorrelacion parcial se encuentra fuera de las bandas se puede garantizar que hay un componente de media movil ordinaria (q), el valor es 0
El componente autoregresivo estacional (P) es 1
En el caso de media movil (Q) es 2
library(forecast)
library(ggthemes)
modelo_estimado2 <- Yt2 %>%
Arima (order = c(1,1,0),
seasonal = c(1,0,2))
summary(modelo_estimado2)
## Series: .
## ARIMA(1,1,0)(1,0,2)[12]
##
## Coefficients:
## ar1 sar1 sma1 sma2
## 0.3150 -0.0171 0.2325 -0.0576
## s.e. 0.0766 0.8200 0.8189 0.1958
##
## sigma^2 = 0.2269: log likelihood = -106.73
## AIC=223.47 AICc=223.86 BIC=238.84
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE
## Training set 0.09418575 0.4688496 0.307792 0.08409974 0.2815712 0.1667916
## ACF1
## Training set -0.06000596
modelo_estimado2 %>% autoplot(type = "both")+theme_solarized()
modelo_estimado2 %>% check_res(lag.max = 36)
library(forecast)
#Estimar el modelo
modeloHW2<-HoltWinters(x = Yt2,
seasonal = "multiplicative",
optim.start = c(0.9,0.9,0.9))
modeloHW2
## Holt-Winters exponential smoothing with trend and multiplicative seasonal component.
##
## Call:
## HoltWinters(x = Yt2, 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
#Generando el pronostico
pronosticosMW2<-forecast(object = modeloHW2,h=12, level=c(0.95))
pronosticosMW2
## Point Forecast Lo 95 Hi 95
## Jun 2022 123.7827 122.6365 124.9289
## Jul 2022 123.9896 122.4499 125.5294
## Aug 2022 124.0357 122.1459 125.9256
## Sep 2022 124.3884 122.1648 126.6120
## Oct 2022 125.0394 122.4870 127.5918
## Nov 2022 125.4570 122.5842 128.3298
## Dec 2022 125.6139 122.4280 128.7997
## Jan 2023 126.3012 122.7897 129.8128
## Feb 2023 127.1819 123.3369 131.0269
## Mar 2023 128.1007 123.9171 132.2842
## Apr 2023 128.6771 124.1616 133.1927
## May 2023 129.2228 123.9338 134.5118
Yt_Sarima2<-modelo_estimado2$fitted
Yt_HW2<-pronosticosMW2$fitted
grafico_comparativo2<-cbind(Yt2, Yt_Sarima2,Yt_HW2)
ts_plot(grafico_comparativo2)
Con el grafico comparativo vemos lo bien que nuestra serie original se reproduce ya que logra replicar bien la serie Yt_Sarima2 y el HW
library(forecast)
library(dplyr)
library(tsibble)
library(fable)
library(fabletools)
Yt2<-Yt2 %>% as_tsibble() %>% rename(IPC =value)
data.cross.validation<-Yt2 %>%
as_tsibble() %>%
stretch_tsibble(.init = 60,.step = 1)
TSCV2<-data.cross.validation %>%
model(ARIMA(IPC ~ pdq(1, 1, 0) + PDQ(1, 0, 2))) %>%
forecast(h=1) %>% accuracy(Yt2)
print(TSCV2)
## # A tibble: 1 x 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(1, 1~ Test 0.0538 0.439 0.292 0.0434 0.258 0.158 0.161 0.0951
al hacer el contraste con la data desconocida, el MAPE es de 0.257 por lo que nuestro modelo tiene un buen poder predictivo
library(readxl)
library(readxl)
Importacion_de_Hidrocarburos1 <- read_excel("Importacion de Hidrocarburos1.xlsx",
range = "B7:B71", col_names = FALSE)
## New names:
## * `` -> `...1`
serie.Hidro.ts <- ts(data = Importacion_de_Hidrocarburos1, start = c(2017, 1),
frequency = 12)
Yt3 <- serie.Hidro.ts
library(TSstudio)
library(forecast)
ts_plot(Yt3, Xtitle = "Años/Meses")
library(kableExtra)
library(magrittr)
d<-ndiffs(Yt3)
D<-nsdiffs(Yt3)
ordenes_integracion3<-c(d,D)
names(ordenes_integracion3)<-c("d","D")
ordenes_integracion3 %>% kable(caption = "Ordenes de Integracion") %>% kable_material()
| x | |
|---|---|
| d | 0 |
| D | 0 |
# El valor de d es 0 y el de D es 0
# Graficando la serie diferenciada
Yt3 %>%
diff(lag = 12, diffences = D) %>%
diff(diffences = d) %>%
ts_plot(title = "Yt estacionaria")
# Verificando valores para (p,q) y (P,Q)
Yt3 %>%
diff(lag=12,diffences = D) %>%
diff(diffences=d) %>%
ts_cor(lag.max = 36)
En la parte del ACF debido a que uno de los ordenes está fuera de las bandas (es significativo), el valor del componente autoregresivo de la parte no ordinaria es igual a 1
PACF es para identificar valor de q y debido a que uno de los coeficientes de autocorrelacion parcial se encuentra fuera de las bandas se puede garantizar que hay un componente de media movil ordinaria (q), el valor es 1
El componente autoregresivo estacional (P) es 1
En el caso de media movil (Q) es 0
library(forecast)
library(ggthemes)
modelo_estimado3 <- Yt3 %>%
Arima (order = c(1,0,1),
seasonal = c(1,0,0))
summary(modelo_estimado3)
## Series: .
## ARIMA(1,0,1)(1,0,0)[12] with non-zero mean
##
## Coefficients:
## ar1 ma1 sar1 mean
## 0.6883 -0.5363 -0.2097 215368.837
## s.e. 0.2890 0.3277 0.1494 4910.911
##
## sigma^2 = 1.058e+09: log likelihood = -765.8
## AIC=1541.6 AICc=1542.62 BIC=1552.48
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE ACF1
## Training set -237.9014 31510 25506.37 -2.377165 12.31299 0.6275001 -0.02020648
modelo_estimado3 %>% autoplot(type = "both")+theme_solarized()
modelo_estimado2 %>% check_res(lag.max = 36)
library(forecast)
options(scipen = 99999)
#Estimar el modelo
modeloHW3<-HoltWinters(x = Yt3,
seasonal = "multiplicative",
optim.start = c(0.9,0.9,0.9))
modeloHW3
## Holt-Winters exponential smoothing with trend and multiplicative seasonal component.
##
## Call:
## HoltWinters(x = Yt3, seasonal = "multiplicative", optim.start = c(0.9, 0.9, 0.9))
##
## Smoothing parameters:
## alpha: 0.1273406
## beta : 0
## gamma: 0.4793705
##
## Coefficients:
## [,1]
## a 246510.0613572
## b 1239.4532110
## s1 0.9247101
## s2 0.8984179
## s3 0.8791852
## s4 0.8941624
## s5 0.9460044
## s6 1.0498253
## s7 0.9469010
## s8 0.9667736
## s9 0.9762889
## s10 1.1171158
## s11 0.9509380
## s12 0.8557828
# Generando el pronostico
pronosticosMW3<-forecast(object = modeloHW3,h=12, level=c(0.95))
pronosticosMW3
## Point Forecast Lo 95 Hi 95
## Jun 2022 229096.5 185614.4 272578.5
## Jul 2022 223696.1 179110.4 268281.8
## Aug 2022 219997.1 174364.1 265630.2
## Sep 2022 224853.1 177997.3 271708.9
## Oct 2022 239062.2 190615.5 287508.9
## Nov 2022 266599.7 215810.4 317389.1
## Dec 2022 241636.1 191288.5 291983.7
## Jan 2023 247905.6 196238.0 299573.1
## Feb 2023 251555.6 198735.7 304375.5
## Mar 2023 289226.4 232632.2 345820.6
## Apr 2023 247380.9 193379.5 301382.3
## May 2023 223687.5 193456.8 253918.2
Yt_Sarima3<-modelo_estimado3$fitted
Yt_HW3<-pronosticosMW3$fitted
grafico_comparativo3<-cbind(Yt3, Yt_Sarima3,Yt_HW3)
ts_plot(grafico_comparativo3)
Con el grafico comparativo podemos observar que nuestra serie original no se reproduce de forma correcta ya que no puede replicar la serie Yt_sarima3 y Hw3
library(forecast)
library(dplyr)
library(tsibble)
library(fable)
library(fabletools)
Yt3<-Yt3 %>% as_tsibble() %>% rename(Hidro =value)
data.cross.validation<-Yt3 %>%
as_tsibble() %>%
stretch_tsibble(.init = 60,.step = 1)
TSCV3<-data.cross.validation %>%
model(ARIMA(Hidro ~ pdq(1, 0, 1) + PDQ(1, 0, 0))) %>%
forecast(h=1) %>% accuracy(Yt3)
## Warning: The future dataset is incomplete, incomplete out-of-sample data will be treated as missing.
## 1 observation is missing at 2022 jun.
print(TSCV3)
## # A tibble: 1 x 10
## .model .type ME RMSE MAE MPE MAPE MASE RMSSE ACF1
## <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 ARIMA(Hidro ~ pdq(1,~ Test 16026. 47906. 36107. 3.57 14.8 0.888 0.966 0.148
Al hacer el contraste con la data desconocida, obtener un MAPE de 14.78 por lo que concluimos con que nuestro modelo no tiene un buen poder predictivo.