## Cargando Datos
library(readxl)
library(forecast)
PIB_trimestral_precios_corrientes_SLV_2009_2021 <- read_excel("C:/Users/50379/Downloads/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_2021, start = c(2009,1),
frequency = 4)
Yt <- serie.pib.ts
##METODOLOGIA PASO A PASO
library(TSstudio)
library(forecast)
ts_plot(Yt, Xtitle = "Años/Meses")
#IDENTIFICACION
##ORDEN DE INTEGRACION
library(kableExtra)
library(magrittr)
d<-nsdiffs(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")
##VERIFICANDO LOS VALORES PARA (P,Q) Y (P,Q)
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.
##ESTIMACION DEL MODELO ###USANDO LIBRERYA FORECATS
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)
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]>
##VALIDACION CRUZADA
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.
#IPC GENERAL SLV
##CARGANDO DATA
library(readxl)
IPC_general_SLV_2009_2022_mayo_ <- read_excel("C:/Users/50379/Downloads/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
#METODOLOGIA PPASO A PASO
library(TSstudio)
library(forecast)
ts_plot(Yt2, Xtitle = "Años/Meses")
#IDENTIFICACION
##ORDEN DE INTEGRACION
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
##ESTIMACION DEL MODELO
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)
##COMPARATIVA
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)