Ejercicio de Pronóstico Modelos SARIMA

PARTE I: PIB trimestral precios corrientes SLV 2009-2021.

Cargamos la base de datos

library(readxl)
library(forecast)

PIB_SLV<- read_excel("F:/Practica Pronostico Modelos SARIMA/TAREA/PIB trimestral SLV 2009-2021.xlsx",  col_types = c("skip","numeric"),
                            skip = 5)

serie.PIB.ts<- ts(data = PIB_SLV, start = c(2009,1),frequency = 4)

Yt_1 <- serie.PIB.ts
serie.PIB.ts %>% 
  autoplot(main = "PIB trimestral precios corrientes SLV 2009-2021",
           xlab = "años/ trimestres",
           ylab = "Indice")

1. Gráfico de la Serie (Metodología Box-Jenkins)

library(TSstudio)
library(forecast)

ts_plot(Yt_1,Xtitle= "Años/Meses")

2. Identificacion

2.1 Orden de Integracion

library(kableExtra)
library(magrittr)
d_1<-ndiffs(Yt_1)
D_1<-nsdiffs(Yt_1)
ordenes_integracion<-c(d_1,D_1)
names(ordenes_integracion)<-c("d","D")
ordenes_integracion %>% kable(caption = "Ordenes de Integracion") %>% kable_material()
Ordenes de Integracion
x
d 1
D 1
#Gráfico de la serie diferenciada
Yt_1 %>%
  diff(lag=4,diffences=D_1) %>%
  diff(diffences=d_1) %>%
  ts_plot(title= "Yt estacionaria")

2.2 Verificar los valores para (p,q) & (P,Q)

Yt_1 %>%
  diff(lag=4,diffences=D) %>%
  diff(diffences=d) %>%
  ts_cor(lag.max = 12)

2.3 Estimacion del modelo

2.3.1 Usando forecast

library(forecast)
library(ggthemes)
modelo_estimado_PIB<-Yt_1 %>%
  Arima(order = c(0, 1, 0),
        seasonal = c(1, 1, 1))
summary(modelo_estimado_PIB)
## Series: . 
## ARIMA(0,1,0)(1,1,1)[4] 
## 
## Coefficients:
##          sar1     sma1
##       -0.3980  -0.4550
## s.e.   0.3732   0.3688
## 
## sigma^2 = 77377:  log likelihood = -331.67
## AIC=669.34   AICc=669.9   BIC=674.89
## 
## Training set error measures:
##                    ME     RMSE      MAE          MPE     MAPE      MASE
## Training set 6.530071 258.7683 120.9372 -0.004468918 2.054645 0.3680668
##                     ACF1
## Training set -0.09806694
#grafico de las raices (estabilidad/convertibilidad)
modelo_estimado_PIB %>% autoplot(type="both")+theme_solarized()

#verificacion
modelo_estimado_PIB %>% check_res(lag.max = 4)
library(forecast)

#Estimar el modelo
modeloHW_PIB<-HoltWinters(x = Yt_1,
                      seasonal = "multiplicative",
                      optim.start = c(0.9,0.9,0.9))
modeloHW_PIB
## Holt-Winters exponential smoothing with trend and multiplicative seasonal component.
## 
## Call:
## HoltWinters(x = Yt_1, 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_PIB<-forecast(object = modeloHW_PIB,h=4, level=c(0.95))
pronosticosMW_PIB
##         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
#Gráfico comparativo
Yt_Sarima_PIB<-modelo_estimado_PIB$fitted
Yt_HW_PIB<-pronosticosMW_PIB$fitted
grafico_comparativo_1<-cbind(Yt_1, Yt_Sarima_PIB,Yt_HW_PIB)
ts_plot(grafico_comparativo_1)

3. Verificacion de sobre ajuste/sub ajuste

library(tsibble)
library(feasts)
library(fable)
library(fabletools)
library(tidyr)
library(dplyr)
a<-Yt_1 %>% 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)[4]> <ARIMA(0,1,0)(0,1,1)[4]> <ARIMA(0,1,0)(1,1,0)[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 × 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 75930.   -332.  668.  669.  672. <cpl [0]> <cpl [4]>
## 2 arima_010_110    Orders 78594.   -333.  669.  670.  673. <cpl [4]> <cpl [0]>
## 3 arima_original   Orders 77377.   -332.  669.  670.  675. <cpl [4]> <cpl [4]>
## 4 arima_automatico Orders 62738.   -334.  676.  677.  683. <cpl [1]> <cpl [4]>

Validacion Cruzada (Cross Validated)

library(forecast)
library(dplyr)
library(tsibble)
library(fable)
library(fabletools)

#convertimos
Yt<-Yt_1 %>% 
  as_tsibble() %>% 
  rename(PIB=value)

#generador de la dta (roja)
data.cross.validation.PIB<-Yt %>% 
  as_tsibble() %>% 
  stretch_tsibble(.init = 20,.step = 1)

#generador de pronostico (verde) y simulacion 
TSCV<-data.cross.validation.PIB %>% 
model(ARIMA(PIB ~ pdq(0, 1, 0) + PDQ(1, 1, 1))) %>% 
forecast(h=1) %>% accuracy(Yt)

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, … Test   30.1  370.  197. 0.228  3.21 0.600 0.780 0.0422

PARTE II: IPC general SLV 2009-2022 (mayo).

Cargamos la base de datos

library(readxl)
library(forecast)

IPC_SLV<- read_excel("F:/Practica Pronostico Modelos SARIMA/TAREA/IPC general SLV 2009-2022 (mayo).xlsx",  col_types = c("skip","numeric"),
                            skip = 6)

serie.IPC.ts<- ts(data = IPC_SLV, start = c(2009,1),frequency = 12)

Yt_2 <- serie.IPC.ts
serie.IPC.ts %>% 
  autoplot(main = "IPC general SLV 2009-2022 (mayo)",
           xlab = "años/ trimestres",
           ylab = "Indice")

1. Gráfico de la Serie (Metodología Box-Jenkins)

library(TSstudio)
library(forecast)

ts_plot(Yt_2,Xtitle= "Años/Meses")

2. Identificacion

2.1 Orden de Integracion

library(kableExtra)
library(magrittr)
d_2<-ndiffs(Yt_2)
D_2<-nsdiffs(Yt_2)
ordenes_integracion<-c(d_2,D_2)
names(ordenes_integracion)<-c("d","D")
ordenes_integracion %>% kable(caption = "Ordenes de Integracion") %>% kable_material()
Ordenes de Integracion
x
d 1
D 0
#Gráfico de la serie diferenciada
Yt_2 %>%
  diff(lag=12,diffences=D_2) %>%
  diff(diffences=d_2) %>%
  ts_plot(title= "Yt estacionaria")

2.2 Verificar los valores para (p,q) & (P,Q)

Yt_2 %>%
  diff(lag=12,diffences=D_2) %>%
  diff(diffences=d_2) %>%
  ts_cor(lag.max = 36)

2.3 Estimacion del modelo

2.3.1 Usando forecast

library(forecast)
library(ggthemes)
modelo_estimado_IPC<-Yt_2 %>%
  Arima(order = c(1, 1, 1),
        seasonal = c(1, 0, 2))
summary(modelo_estimado_IPC)
## Series: . 
## ARIMA(1,1,1)(1,0,2)[12] 
## 
## Coefficients:
##          ar1      ma1    sar1    sma1     sma2
##       0.9406  -0.7934  0.0571  0.0615  -0.0683
## s.e.  0.0859   0.1447  0.6621  0.6595   0.1106
## 
## sigma^2 = 0.2251:  log likelihood = -104.87
## AIC=221.74   AICc=222.29   BIC=240.15
## 
## Training set error measures:
##                      ME      RMSE       MAE        MPE      MAPE      MASE
## Training set 0.05582688 0.4654425 0.3091819 0.04952956 0.2834401 0.1668998
##                    ACF1
## Training set 0.08746749
#grafico de las raices (estabilidad/convertibilidad)
modelo_estimado_IPC %>% autoplot(type="both")+theme_solarized()

#verificacion
modelo_estimado_IPC %>% check_res(lag.max = 36)
library(forecast)

#Estimar el modelo
modeloHW_IPC<-HoltWinters(x = Yt_2,
                      seasonal = "multiplicative",
                      optim.start = c(0.9,0.9,0.9))
modeloHW_IPC
## Holt-Winters exponential smoothing with trend and multiplicative seasonal component.
## 
## Call:
## HoltWinters(x = Yt_2, seasonal = "multiplicative", optim.start = c(0.9,     0.9, 0.9))
## 
## Smoothing parameters:
##  alpha: 0.8419073
##  beta : 0.0743462
##  gamma: 1
## 
## Coefficients:
##            [,1]
## a   122.7484331
## b     0.4728397
## s1    1.0043101
## s2    1.0017791
## s3    0.9980880
## s4    0.9970592
## s5    0.9984875
## s6    0.9981783
## s7    0.9959355
## s8    0.9977953
## s9    1.0010455
## s10   1.0045211
## s11   1.0052312
## s12   1.0055526
#Generar el pronostico:
pronosticosMW_IPC<-forecast(object = modeloHW_IPC,h=12, level=c(0.95))
pronosticosMW_IPC
##          Point Forecast    Lo 95    Hi 95
## May 2022       123.7524 122.6054 124.8994
## Jun 2022       123.9142 122.3694 125.4590
## Jul 2022       123.9295 122.0324 125.8267
## Aug 2022       124.2733 122.0409 126.5056
## Sep 2022       124.9234 122.3615 127.4853
## Oct 2022       125.3567 122.4738 128.2396
## Nov 2022       125.5459 122.3495 128.7424
## Dec 2022       126.2522 122.7300 129.7744
## Jan 2023       127.1368 123.2817 130.9918
## Feb 2023       128.0532 123.8606 132.2457
## Mar 2023       128.6190 124.0961 133.1419
## Apr 2023       129.1356 123.8244 134.4468
#Gráfico comparativo
Yt_Sarima_IPC<-modelo_estimado_IPC$fitted
Yt_HW_IPC<-pronosticosMW_IPC$fitted
grafico_comparativo_2<-cbind(Yt_2, Yt_Sarima_IPC,Yt_HW_IPC)
ts_plot(grafico_comparativo_2)

3. Verificacion de sobre ajuste/sub ajuste

library(tsibble)
library(feasts)
library(fable)
library(fabletools)
library(tidyr)
library(dplyr)
#generando modelo automatico
a_2<-Yt_2 %>% as_tsibble() %>% 
  model(arima_original=ARIMA(value ~ pdq(1, 1, 1) + PDQ(1, 0, 2)),
        arima_010_011 = ARIMA(value ~ pdq(1, 1, 1) + PDQ(0, 0, 2)),
        arima_010_110 = ARIMA(value ~ pdq(1, 1, 1) + PDQ(1, 0, 1)),
        arima_automatico=ARIMA(value,ic="bic",stepwise = FALSE)
  )
print(a_2)
## # A mable: 1 x 4
##                       arima_original                      arima_010_011
##                              <model>                            <model>
## 1 <ARIMA(1,1,1)(1,0,2)[12] w/ drift> <ARIMA(1,1,1)(0,0,2)[12] w/ drift>
## # … with 2 more variables: arima_010_110 <model>, arima_automatico <model>
#ordenar  
a_2 %>% pivot_longer(everything(), names_to = "Model name",
                         values_to = "Orders") %>% glance() %>% 
  arrange(AICc) ->tabla_2
tabla_2
## # 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  0.219   -102.  217.  218.  235. <cpl [1]>  <cpl [25]>
## 2 arima_automatico Orders  0.218   -102.  217.  218.  235. <cpl [26]> <cpl [0]> 
## 3 arima_010_110    Orders  0.219   -103.  217.  218.  236. <cpl [13]> <cpl [13]>
## 4 arima_original   Orders  0.220   -102.  219.  220.  240. <cpl [13]> <cpl [25]>

Validacion Cruzada (Cross Validated)

library(forecast)
library(dplyr)
library(tsibble)
library(fable)
library(fabletools)

#convertimos
Yt<-Yt_2 %>% as_tsibble() %>% rename(IPC=value)

#generador de la dta (roja)
data.cross.validation.IPC<-Yt %>% 
  as_tsibble() %>% 
  stretch_tsibble(.init = 60,.step = 1)

#generador de pronostico (verde) y simulacion 
TSCV_2<-data.cross.validation.IPC %>% 
model(ARIMA(IPC ~ pdq(1, 1, 1) + PDQ(1, 0, 2))) %>% 
forecast(h=1) %>% accuracy(Yt)

print(TSCV_2) 
## # 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(1, 1… Test  0.0695 0.437 0.295 0.0579 0.261 0.159 0.160 0.0775

PARTE III: Importación de Hidrocarburos SLV 2017-2022 (mayo).

Cargamos la base de datos

library(readxl)
library(forecast)

M_Hidrocarburos<- read_excel("F:/Practica Pronostico Modelos SARIMA/TAREA/Hidrocarburos SLV 2017-2022 (mayo).xlsx",  col_types = c("skip","numeric"),
                            skip = 7)

serie.M_HC.ts<- ts(data = M_Hidrocarburos, start = c(2017,1),frequency = 12)

Yt_3 <- serie.M_HC.ts
serie.M_HC.ts %>% 
  autoplot(main = "Importación de Hidrocarburos SLV 2017-2022 (mayo)",
           xlab = "años/ trimestres",
           ylab = "Indice")

1. Gráfico de la Serie (Metodología Box-Jenkins)

library(TSstudio)
library(forecast)

ts_plot(Yt_3,Xtitle= "Años/Meses")

2. Identificacion

2.1 Orden de Integracion

library(kableExtra)
library(magrittr)
d_3<-ndiffs(Yt_3)
D_3<-nsdiffs(Yt_3)
ordenes_integracion<-c(d_3,D_3)
names(ordenes_integracion)<-c("d","D")
ordenes_integracion %>% kable(caption = "Ordenes de Integracion") %>% kable_material()
Ordenes de Integracion
x
d 0
D 0
#Gráfico de la serie diferenciada
Yt_3 %>%
  diff(lag=12,diffences=D_3) %>%
  diff(diffences=d_3) %>%
  ts_plot(title= "Yt estacionaria")

2.2 Verificar los valores para (p,q) & (P,Q)

Yt_3 %>%
  diff(lag=12,diffences=D_3) %>%
  diff(diffences=d_3) %>%
  ts_cor(lag.max = 36)

2.3 Estimacion del modelo

2.3.1 Usando forecast

library(forecast)
library(ggthemes)
modelo_estimado_M_HC<-Yt_3 %>%
  Arima(order = c(1, 0, 1),
        seasonal = c(1, 0, 0))

summary(modelo_estimado_M_HC)
## Series: . 
## ARIMA(1,0,1)(1,0,0)[12] with non-zero mean 
## 
## Coefficients:
##          ar1      ma1     sar1        mean
##       0.6652  -0.4851  -0.2022  215790.730
## s.e.  0.2952   0.3398   0.1519    5147.504
## 
## sigma^2 = 1.042e+09:  log likelihood = -741.69
## AIC=1493.39   AICc=1494.44   BIC=1504.1
## 
## Training set error measures:
##                     ME     RMSE      MAE       MPE     MAPE      MASE
## Training set -428.6553 31240.12 25005.59 -2.421527 12.06669 0.6217076
##                      ACF1
## Training set -0.007961808
#grafico de las raices (estabilidad/convertibilidad)
modelo_estimado_M_HC %>% autoplot(type="both")+theme_solarized()

#verificacion
modelo_estimado_M_HC %>% check_res(lag.max = 36)
library(forecast)

#Estimar el modelo
modeloHW_M_HC<-HoltWinters(x = Yt_3,
                      seasonal = "multiplicative",
                      optim.start = c(0.9,0.9,0.9))
modeloHW_M_HC
## Holt-Winters exponential smoothing with trend and multiplicative seasonal component.
## 
## Call:
## HoltWinters(x = Yt_3, seasonal = "multiplicative", optim.start = c(0.9,     0.9, 0.9))
## 
## Smoothing parameters:
##  alpha: 0.1580326
##  beta : 0
##  gamma: 0.4946113
## 
## Coefficients:
##             [,1]
## a   2.501763e+05
## b   1.683628e+03
## s1  9.111372e-01
## s2  8.894296e-01
## s3  8.823914e-01
## s4  8.896954e-01
## s5  9.398533e-01
## s6  1.039846e+00
## s7  9.375516e-01
## s8  9.546773e-01
## s9  9.615739e-01
## s10 1.097096e+00
## s11 9.326123e-01
## s12 8.393040e-01
#Generar el pronostico:
pronosticosMW_M_HC<-forecast(object = modeloHW_M_HC,h=12, level=c(0.95))
pronosticosMW_M_HC
##          Point Forecast    Lo 95    Hi 95
## Apr 2022       229478.9 182755.6 276202.2
## May 2022       225509.1 177130.5 273887.7
## Jun 2022       225210.3 175204.2 275216.3
## Jul 2022       228572.3 176863.3 280281.4
## Aug 2022       243040.8 189049.4 297032.2
## Sep 2022       270649.0 213366.1 327932.0
## Oct 2022       245602.6 188944.1 302261.0
## Nov 2022       251696.2 193221.1 310171.3
## Dec 2022       255133.4 195092.9 315173.9
## Jan 2023       292938.5 227754.8 358122.3
## Feb 2023       250589.4 188983.5 312195.2
## Mar 2023       226930.8 188989.5 264872.2
#Gráfico comparativo
Yt_Sarima_M_HC<-modelo_estimado_M_HC$fitted
Yt_HW_M_HC<-pronosticosMW_M_HC$fitted
grafico_comparativo_3<-cbind(Yt_3, Yt_Sarima_M_HC,Yt_HW_M_HC)
ts_plot(grafico_comparativo_3)

3. Verificacion de sobre ajuste/sub ajuste

library(tsibble)
library(feasts)
library(fable)
library(fabletools)
library(tidyr)
library(dplyr)

#generando modelo automatico
a_3<-Yt_3 %>% as_tsibble() %>% 
  model(arima_original=ARIMA(value ~ pdq(1, 0, 1) + PDQ(1, 0, 0)),
        arima_010_011 = ARIMA(value ~ pdq(1, 1, 1) + PDQ(1, 0, 0)),
        arima_010_110 = ARIMA(value ~ pdq(1, 0, 1) + PDQ(1, 1, 0)),
        arima_automatico=ARIMA(value,ic="bic",stepwise = FALSE) #modelo automatico 
  )
print(a_3)
## # A mable: 1 x 4
##                      arima_original arima_010_011             arima_010_110
##                             <model>       <model>                   <model>
## 1 <ARIMA(1,0,1)(1,0,0)[12] w/ mean>  <NULL model> <ARIMA(1,0,1)(1,1,0)[12]>
## # … with 1 more variable: arima_automatico <model>

Validacion Cruzada (Cross Validated)

library(forecast)
library(dplyr)
library(tsibble)
library(fable)
library(fabletools)

#convertimos
Yt<-Yt_3 %>% 
  as_tsibble() %>% 
  rename(M_HC= value)

#generador de la dta (roja)
data.cross.validation.M_HC<-Yt %>% 
  as_tsibble() %>% 
  stretch_tsibble(.init = 60,.step = 1)

#generador de pronostico (verde) y simulacion 
TSCV_3<-data.cross.validation.M_HC %>% 
model(ARIMA(M_HC ~ pdq(1, 0, 1) + PDQ(1, 0, 1))) %>% 
forecast(h=1) %>% accuracy(Yt)

print(TSCV_3) 
## # 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(M_HC ~ pdq(1, … Test  82270. 82270. 82270.  27.5  27.5  2.05  1.67    NA

h1,h2,h3,h4{
    font-size:14px;
    font-weight: bold;
    font-family: 'Times New Roman', Times, serif;
    line-height:2;
}
h1 {
    text-align: center;
}
h4{
    text-align:center;
    font-weight: bold
}
p, li{
  text-indent: 40px;
    font-size:12 px;
    font-family: 'Times New Roman', Times, serif;
      line-height: 2;
}