Serie temporal de Remesas en El Salvador

remesas_ts <- ts(df$remesas, start = c(1991, 1), frequency = 12)

Gráfico de remesas en El Salvador

autoplot(remesas_ts)+ggtitle("Remesas en El Salvador")+ylab("Millones de $")

Gráfico de IPC US

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")

Análisis de la estacionalidad

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))

División de datos en conjunto de prueba y test

training <- window(remesas_ts, end =c(2022,6))
test <- window(remesas_ts, start =c(2022,7))

Modelo Arima

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

ARIMA con variablex exogenas

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

AUTO ARIMA

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

HOLT WINTERS

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

SUAVIZADO EXPONENCIAL

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

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

MODELO SELECCIONADO POR METRICA MAE (ARIMA) \((1,1,1), (1,1,1)_{12}\)

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

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

TOTAL REMESAS PARA EL AÑO 2024

sum(head(pronosticos_arima$mean),6)+sum(tail(remesas_ts,6))
## [1] 8260.056

TOTAL REMESAS PARA EL AÑO 2025

sum((pronosticos_arima$mean)[7:18])
## [1] 8493.231