remesas_ts <- ts(df$remesas, start = c(1991, 1), frequency = 12)
autoplot(remesas_ts)+ggtitle("Remesas en El Salvador")+ylab("Millones de $")
ipc_usa_filtered=ipc_usa %>% filter(observation_date>="1990-12-01" & observation_date <="2024-06-01")
ips_us_filtered <- ts(ipc_usa_filtered$CPIAUCNS, start = c(1991, 1), frequency = 12)
ipc_usa_2026=ipc_usa %>% filter(observation_date>="1990-12-01")
ips_us_2026 <- ts(ipc_usa_filtered$CPIAUCNS, start = c(1991, 1), frequency = 12)
autoplot(ips_us_2026)+ggtitle("Indice de Precio al Consumidor US")
# Gráfico de desempleo en US
desempleo_usa_filtered=desempleo_usa %>% filter(observation_date>="1990-12-01" & observation_date <="2024-06-01")
desempleo_us_filtered <- ts(desempleo_usa_filtered$UNRATE, start = c(1991, 1), frequency = 12)
desempleo_usa_2026=desempleo_usa %>% filter(observation_date>="1990-12-01")
desempleo_us_2026 <- ts(desempleo_usa_filtered$UNRATE, start = c(1991, 1), frequency = 12)
autoplot(desempleo_us_2026)+ggtitle("Tasa de desempleo en US")
Se observa estacionalidad en los meses de diciembre y enero. Se observa que las remesas suben en mayo.
# Extraer el mes y el año de las fechas
datos <- df %>%
mutate(mes = format(fecha, "%m"))
# Agrupar por mes y calcular el promedio de remesas
promedios_mensuales <- datos %>%
group_by(mes) %>%
summarize(promedio_remesas = mean(remesas))
# Crear el gráfico de caja
ggplot(datos, aes(x = mes, y = remesas)) +
geom_boxplot() +
labs(title = "Gráfico de Caja de Remesas por Mes",
x = "Mes",
y = "Remesas") +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
autoplot(decompose(remesas_ts))
training <- window(remesas_ts, end =c(2022,6))
test <- window(remesas_ts, start =c(2022,7))
modelo_arima1=Arima(training, order=c(1,1,1), seasonal = c(0,1,1))
pronosticos_arima_1 <- forecast(modelo_arima1, h =24)
autoplot(pronosticos_arima_1)+ autolayer(test, series ="Test data")+coord_cartesian(xlim = c(2021, 2025))
accuracy(pronosticos_arima_1, test)
## ME RMSE MAE MPE MAPE MASE
## Training set 1.085654 19.34603 11.24454 0.05155607 4.683454 0.462525
## Test set -35.241578 45.37273 36.77484 -5.36250974 5.567393 1.512671
## ACF1 Theil's U
## Training set 0.04041938 NA
## Test set 0.23613499 0.5819536
checkresiduals(modelo_arima1)
##
## Ljung-Box test
##
## data: Residuals from ARIMA(1,1,1)(0,1,1)[12]
## Q* = 49.482, df = 21, p-value = 0.0004305
##
## Model df: 3. Total lags used: 24
autoplot(modelo_arima1)
lmtest::coeftest(modelo_arima1)
##
## z test of coefficients:
##
## Estimate Std. Error z value Pr(>|z|)
## ar1 0.556139 0.081164 6.8521 7.279e-12 ***
## ma1 -0.838501 0.052314 -16.0281 < 2.2e-16 ***
## sma1 -0.677210 0.036180 -18.7178 < 2.2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
pandemia=rep(0,24)
ipc_us_test=ipc_usa_2026 %>% filter(observation_date>="2022-06-01")
desempleo_us_test=desempleo_usa_2026 %>% filter(observation_date>="2022-06-01")
new_xreg=cbind(pandemia,head(ipc_us_test$CPIAUCNS,24),head(desempleo_us_test$UNRATE,24))
reg_pandemia=pandemia=head(df$pandemia,length(training))
reg_ipc_us=pandemia=head(ipc_usa_2026$CPIAUCNS,length(training))
reg_desempleo_us=pandemia=head(desempleo_usa_2026$UNRATE,length(training))
reg= cbind(reg_pandemia,reg_ipc_us,reg_desempleo_us)
modelo_arima_2=Arima(training, order=c(1,1,1), seasonal=c(1,1,1), xreg = reg)
pronosticos_arima_2=forecast(modelo_arima_2,h=24, xreg =new_xreg)
## Warning in forecast.forecast_ARIMA(modelo_arima_2, h = 24, xreg = new_xreg):
## xreg contains different column names from the xreg used in training. Please
## check that the regressors are in the same order.
autoplot(pronosticos_arima_2)+ autolayer(test, series ="Test data")+coord_cartesian(xlim = c(2021, 2025))
accuracy(pronosticos_arima_2, test)
## ME RMSE MAE MPE MAPE MASE
## Training set 0.3479918 13.61102 9.449009 -0.09877678 4.234589 0.3886689
## Test set -3.4861426 21.18284 14.598047 -0.57883434 2.152762 0.6004658
## ACF1 Theil's U
## Training set -0.005453668 NA
## Test set -0.148225798 0.2762287
checkresiduals(modelo_arima_2)
##
## Ljung-Box test
##
## data: Residuals from Regression with ARIMA(1,1,1)(1,1,1)[12] errors
## Q* = 37.41, df = 17, p-value = 0.00296
##
## Model df: 7. Total lags used: 24
autoplot(modelo_arima_2)
lmtest::coeftest(modelo_arima_2)
##
## z test of coefficients:
##
## Estimate Std. Error z value Pr(>|z|)
## ar1 -0.218816 0.090516 -2.4174 0.01563 *
## ma1 -0.423264 0.086446 -4.8963 9.767e-07 ***
## sar1 0.104884 0.096591 1.0859 0.27754
## sma1 -0.592230 0.071068 -8.3332 < 2.2e-16 ***
## reg_pandemia -151.086980 9.480848 -15.9360 < 2.2e-16 ***
## reg_ipc_us -0.032442 0.695512 -0.0466 0.96280
## reg_desempleo_us -7.047028 1.241998 -5.6739 1.395e-08 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
modelo_arima_3=auto.arima(training, xreg = reg, stepwise = F)
pronosticos_arima_3=forecast(modelo_arima_3,h=24, xreg =new_xreg)
## Warning in forecast.forecast_ARIMA(modelo_arima_3, h = 24, xreg = new_xreg):
## xreg contains different column names from the xreg used in training. Please
## check that the regressors are in the same order.
autoplot(pronosticos_arima_3)+ autolayer(test, series ="Test data")+coord_cartesian(xlim = c(2021, 2025))
accuracy(pronosticos_arima_3, test)
## ME RMSE MAE MPE MAPE MASE
## Training set 0.3934135 13.50888 9.459883 -0.1027945 4.279057 0.3891162
## Test set -16.4250040 27.71818 18.994522 -2.4859983 2.834585 0.7813074
## ACF1 Theil's U
## Training set -0.009181634 NA
## Test set -0.038121581 0.3555368
checkresiduals(modelo_arima_3)
##
## Ljung-Box test
##
## data: Residuals from Regression with ARIMA(0,1,4)(0,1,1)[12] errors
## Q* = 32.017, df = 16, p-value = 0.00995
##
## Model df: 8. Total lags used: 24
autoplot(modelo_arima_3)
lmtest::coeftest(modelo_arima_3)
##
## z test of coefficients:
##
## Estimate Std. Error z value Pr(>|z|)
## ma1 -0.612437 0.057486 -10.6536 < 2.2e-16 ***
## ma2 0.169552 0.064350 2.6348 0.008418 **
## ma3 0.030770 0.062076 0.4957 0.620120
## ma4 -0.147524 0.058921 -2.5038 0.012287 *
## sma1 -0.510619 0.048015 -10.6346 < 2.2e-16 ***
## reg_pandemia -143.502969 9.360771 -15.3303 < 2.2e-16 ***
## reg_ipc_us -0.091556 0.707272 -0.1294 0.897002
## reg_desempleo_us -8.079490 1.261613 -6.4041 1.513e-10 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
hw_model=forecast::hw(training)
pronosticos_hw=forecast(hw_model, h=24)
autoplot(pronosticos_hw)+ autolayer(test, series ="Test data")+coord_cartesian(xlim = c(2021, 2025))
accuracy(pronosticos_hw, test)
## ME RMSE MAE MPE MAPE MASE
## Training set 0.1864839 20.48046 12.39605 -0.5457563 6.244803 0.5098903
## Test set 28.6597715 37.02131 32.25489 4.1088306 4.646545 1.3267500
## ACF1 Theil's U
## Training set 0.04845517 NA
## Test set -0.16064520 0.4825903
checkresiduals(hw_model)
##
## Ljung-Box test
##
## data: Residuals from Holt-Winters' additive method
## Q* = 64.044, df = 8, p-value = 7.456e-11
##
## Model df: 16. Total lags used: 24
ets_model=forecast::ets (training)
pronosticos_ets=forecast(ets_model, h=24)
autoplot(pronosticos_ets)+ autolayer(test, series ="Test data")+coord_cartesian(xlim = c(2021, 2025))
accuracy(pronosticos_ets, test)
## ME RMSE MAE MPE MAPE MASE ACF1
## Training set 1.638625 18.51821 10.21091 0.09232292 4.61412 0.4200086 0.3604862
## Test set 5.567556 20.31443 16.08994 0.75838729 2.36313 0.6618325 -0.1515247
## Theil's U
## Training set NA
## Test set 0.2630601
checkresiduals(ets_model)
##
## Ljung-Box test
##
## data: Residuals from ETS(M,A,M)
## Q* = 61.303, df = 8, p-value = 2.585e-10
##
## Model df: 16. Total lags used: 24
tbats_model=forecast::tbats (training)
pronosticos_tbats=forecast(tbats_model, h=24)
autoplot(pronosticos_tbats)+ autolayer(test, series ="Test data")+coord_cartesian(xlim = c(2021, 2025))
accuracy(pronosticos_hw, test)
## ME RMSE MAE MPE MAPE MASE
## Training set 0.1864839 20.48046 12.39605 -0.5457563 6.244803 0.5098903
## Test set 28.6597715 37.02131 32.25489 4.1088306 4.646545 1.3267500
## ACF1 Theil's U
## Training set 0.04845517 NA
## Test set -0.16064520 0.4825903
checkresiduals(tbats_model)
##
## Ljung-Box test
##
## data: Residuals from TBATS
## Q* = 64.969, df = 9, p-value = 1.463e-10
##
## Model df: 15. Total lags used: 24
pandemia=rep(0,24)
ipc_us_test=ipc_usa_2026 %>% filter(observation_date>="2024-06-01")
desempleo_us_test=desempleo_usa_2026 %>% filter(observation_date>="2024-06-01")
new_xreg=cbind(pandemia,head(ipc_us_test$CPIAUCNS,24),head(desempleo_us_test$UNRATE,24))
reg_pandemia=pandemia=head(df$pandemia,length(remesas_ts))
reg_ipc_us=pandemia=head(ipc_usa_2026$CPIAUCNS,length(remesas_ts))
reg_desempleo_us=pandemia=head(desempleo_usa_2026$UNRATE,length(remesas_ts))
reg= cbind(reg_pandemia,reg_ipc_us,reg_desempleo_us)
modelo_arima=Arima(remesas_ts, order=c(1,1,1), seasonal=c(1,1,1), xreg = reg)
pronosticos_arima=forecast(modelo_arima,h=24, xreg =new_xreg)
## Warning in forecast.forecast_ARIMA(modelo_arima, h = 24, xreg = new_xreg): xreg
## contains different column names from the xreg used in training. Please check
## that the regressors are in the same order.
autoplot(pronosticos_arima)+coord_cartesian(xlim = c(2010, 2027))
checkresiduals(pronosticos_arima)
##
## Ljung-Box test
##
## data: Residuals from Regression with ARIMA(1,1,1)(1,1,1)[12] errors
## Q* = 30.814, df = 17, p-value = 0.02104
##
## Model df: 7. Total lags used: 24
autoplot(modelo_arima)
lmtest::coeftest(modelo_arima)
##
## z test of coefficients:
##
## Estimate Std. Error z value Pr(>|z|)
## ar1 -0.233957 0.079555 -2.9408 0.003273 **
## ma1 -0.468093 0.073160 -6.3982 1.572e-10 ***
## sar1 0.112813 0.092671 1.2173 0.223473
## sma1 -0.601612 0.069860 -8.6116 < 2.2e-16 ***
## reg_pandemia -153.397905 9.631674 -15.9264 < 2.2e-16 ***
## reg_ipc_us 0.019760 0.668829 0.0295 0.976430
## reg_desempleo_us -6.682452 1.230838 -5.4292 5.661e-08 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
pronosticos_arima
## Point Forecast Lo 80 Hi 80 Lo 95 Hi 95
## Jul 2024 693.4717 674.6032 712.3403 664.6148 722.3287
## Aug 2024 683.9274 664.2391 703.6156 653.8168 714.0380
## Sep 2024 670.0371 648.5037 691.5704 637.1047 702.9694
## Oct 2024 697.9061 674.9361 720.8761 662.7766 733.0356
## Nov 2024 662.5656 638.1874 686.9438 625.2824 699.8488
## Dec 2024 794.1681 768.4713 819.8649 754.8682 833.4680
## Jan 2025 614.4157 587.4619 641.3695 573.1934 655.6380
## Feb 2025 635.7512 607.5971 663.9053 592.6932 678.8092
## Mar 2025 718.7087 689.4033 748.0142 673.8899 763.5275
## Apr 2025 731.9233 701.5101 762.3365 685.4104 778.4362
## May 2025 770.9431 739.4611 802.4251 722.7956 819.0906
## Jun 2025 693.8663 661.3507 726.3820 644.1379 743.5947
## Jul 2025 714.5535 677.4946 751.6124 657.8768 771.2302
## Aug 2025 705.3066 666.6475 743.9656 646.1826 764.4305
## Sep 2025 690.1199 649.4619 730.7779 627.9389 752.3010
## Oct 2025 719.2347 676.7797 761.6897 654.3054 784.1640
## Nov 2025 683.7729 639.5700 727.9759 616.1703 751.3756
## Dec 2025 814.6348 768.7558 860.5139 744.4689 884.8007
## Jan 2026 636.6995 589.2023 684.1967 564.0588 709.3401
## Feb 2026 656.9387 607.8770 706.0004 581.9053 731.9721
## Mar 2026 743.2709 692.6930 793.8489 665.9186 820.6232
## Apr 2026 750.6723 698.6223 802.7223 671.0687 830.2759
## May 2026 792.7597 739.2781 846.2412 710.9667 874.5527
## Jun 2026 717.2123 662.3365 772.0881 633.2870 801.1376
sum(head(pronosticos_arima$mean),6)+sum(tail(remesas_ts,6))
## [1] 8260.056
sum((pronosticos_arima$mean)[7:18])
## [1] 8493.231