Ximena Meléndez - A01720569 Ana Sofía Mijares - A01236164 Sofía Badillo - A01384253
De acuerdo con el artículo de Tableau que se recomendó leer, el análisis de series de tiempo es una herramienta para ver cómo las variables van variando con el tiempo, de tal forma ayudando a predecir futuras tendencias que se basan en datos históricos. Tomando en cuenta lo anterior, se pudieron identificar las siguientes características de una base de datos de series de tiempo:
Recopilación Seguida de Datos: Los datos se recopilan constantemente para facilitar el análisis de cómo las variables cambian con el tiempo.
Variable de Tiempo: Se requiere contar con una variable de tiempo para que el análisis ayude a mostrar como los resultados se van ajustando con el tiempo.
Gran Cantidad de Datos: Para poder identificar tendencias y hacer pronósticos confiables, es necesario contar con muchos datos para asegurar que exista representatividad en los datos.
Datos Históricos: Hay que tener datos históricos para poder predecir el futuro, esto también ayuda a crear proyecciones.
Considerando las características anteriores de las series de tiempo, se puede reconocer que este tipo de análisis es clave para pronosticar los efectos de las decisiones del Nearshoring en México sobre los flujos de inversión extranjera directa, esto quiere decir que se pueden identificar patrones que nos ayuden a tomar decisiones que impacten positivamente a la economía mexicana. Debido a que contamos con datos históricos de los flujos de IED, podemos distinguir que está variables ha cambiado mientras pasan los años, esto gracias a distintos factores como los salarios, el desempleo, la empleabilidad, la actividad económica, cambios en política comercial, entre otros. Haciendo uso de este análisis, los gobiernos y las empresas pueden crear estrategias para incentivar más IED, con el objetivo de mejorar los beneficios económicos del Nearshoring.
Se visualiza el comportamiento de los flujos de inversión extranjera directa a través de los años.
## [1] TRUE
## [1] 4
Podemos observar cómo la linea de tendencia se muestra lineal, sin incremento ni altas, no suele tener ciertas altas y bajas pero en su mayoría se mantiene.
decompose_ts <- decompose(ts_data, type = "multiplicative")
decompose_ts
## $x
## Qtr1 Qtr2 Qtr3 Qtr4
## 2006 896.5577 2110.3751 1284.0054 2677.7047
## 2007 3108.2192 2560.7016 6059.1738 6298.6966
## 2008 2502.1674 1915.8095 4039.9755 4595.5064
## 2009 2984.4670 2254.0761 1056.0126 4713.8215
## 2010 2947.5447 6678.8907 2259.9544 3749.8692
## 2011 3058.2889 2091.1302 2604.8467 1944.8647
## 2012 1493.8032 2111.6953 2401.8953 -1691.3286
## 2013 749.0627 15444.5903 262.2751 5582.6809
## 2014 2427.1384 -2433.2354 441.8868 5326.9922
## 2015 4406.8469 2816.7455 4501.0964 1724.2851
## 2016 3850.7746 1460.8032 1550.1782 4129.8015
## 2017 2780.6735 3134.1452 3570.2502 2454.7038
## 2018 1934.0924 2292.6421 4226.7374 2869.8218
## 2019 2584.0631 2406.2171 4959.3594 3579.5004
## 2020 2603.8144 799.3975 1606.5905 1731.8703
## 2021 2250.7625 3657.3159 4149.3107 3607.1131
## 2022 8823.9632 3664.9111 2653.1558 2817.8730
## 2023 931.6892
##
## $seasonal
## Qtr1 Qtr2 Qtr3 Qtr4
## 2006 1.0125500 0.8799661 1.0177112 1.0897727
## 2007 1.0125500 0.8799661 1.0177112 1.0897727
## 2008 1.0125500 0.8799661 1.0177112 1.0897727
## 2009 1.0125500 0.8799661 1.0177112 1.0897727
## 2010 1.0125500 0.8799661 1.0177112 1.0897727
## 2011 1.0125500 0.8799661 1.0177112 1.0897727
## 2012 1.0125500 0.8799661 1.0177112 1.0897727
## 2013 1.0125500 0.8799661 1.0177112 1.0897727
## 2014 1.0125500 0.8799661 1.0177112 1.0897727
## 2015 1.0125500 0.8799661 1.0177112 1.0897727
## 2016 1.0125500 0.8799661 1.0177112 1.0897727
## 2017 1.0125500 0.8799661 1.0177112 1.0897727
## 2018 1.0125500 0.8799661 1.0177112 1.0897727
## 2019 1.0125500 0.8799661 1.0177112 1.0897727
## 2020 1.0125500 0.8799661 1.0177112 1.0897727
## 2021 1.0125500 0.8799661 1.0177112 1.0897727
## 2022 1.0125500 0.8799661 1.0177112 1.0897727
## 2023 1.0125500
##
## $trend
## Qtr1 Qtr2 Qtr3 Qtr4
## 2006 NA NA 2018.6184 2351.3669
## 2007 3004.5538 4054.0738 4430.9413 4274.5733
## 2008 3941.5620 3476.2635 3323.6521 3426.2229
## 2009 3095.5109 2737.3049 2747.4790 3295.9656
## 2010 3999.5601 4029.5588 3922.9078 3363.2807
## 2011 2832.9222 2650.4082 2229.2219 2036.2318
## 2012 2013.4335 1533.5405 985.9237 2559.4430
## 2013 3958.6024 4600.4011 5719.4117 3694.4430
## 2014 1482.1662 1472.6566 1688.1591 2591.8702
## 2015 3755.5190 3812.5819 3292.7344 3053.7326
## 2016 2515.3751 2447.1998 2614.1267 2689.5319
## 2017 3151.2086 3194.3304 2879.1205 2668.1100
## 2018 2644.9830 2778.9337 2912.0698 3007.5130
## 2019 3113.2876 3293.5752 3384.7539 3186.3704
## 2020 2566.4218 1916.3719 1641.2867 1954.3950
## 2021 2629.4748 3181.7202 4237.7756 5060.3751
## 2022 4874.3052 4588.6308 3503.4415 NA
## 2023 NA
##
## $random
## Qtr1 Qtr2 Qtr3 Qtr4
## 2006 NA NA 0.62501159 1.04497604
## 2007 1.02168071 0.71779657 1.34367075 1.35214097
## 2008 0.62694802 0.62628743 1.19436925 1.23078393
## 2009 0.95217765 0.93579227 0.37766799 1.31236466
## 2010 0.72783294 1.88356626 0.56606594 1.02309757
## 2011 1.06617231 0.89660751 1.14816502 0.87644815
## 2012 0.73272266 1.56484048 2.39379085 -0.60638239
## 2013 0.18687871 3.81517759 0.04505896 1.38662139
## 2014 1.61726492 -1.87765889 0.25720125 1.88596168
## 2015 1.15888818 0.83958077 1.34318880 0.51813404
## 2016 1.51192025 0.67835393 0.58268044 1.40901799
## 2017 0.87147791 1.11499610 1.21846834 0.84422734
## 2018 0.72216740 0.93754503 1.42619510 0.87561155
## 2019 0.81972355 0.83023548 1.43970639 1.03083752
## 2020 1.00199493 0.47404222 0.96182532 0.81314327
## 2021 0.84536487 1.30627479 0.96208500 0.65409542
## 2022 1.78786412 0.90764160 0.74412060 NA
## 2023 NA
##
## $figure
## [1] 1.0125500 0.8799661 1.0177112 1.0897727
##
## $type
## [1] "multiplicative"
##
## attr(,"class")
## [1] "decomposed.ts"
adf.test(ts_data)
## Warning in adf.test(ts_data): p-value smaller than printed p-value
##
## Augmented Dickey-Fuller Test
##
## data: ts_data
## Dickey-Fuller = -5.631, Lag order = 4, p-value = 0.01
## alternative hypothesis: stationary
P-value de 0.01, es estacionaria
acf(ts_data,main= "Significant Autocorrelation")
ARMA: Autoregressive Moving Average (primarly used to forecasting time series data) Vamos a hacerle un fit a nuestro modelo ARMA para hacer un modelo predictivo para predecir los Flujos de Inversión Extranjera (IED_Flujos)
ARMA1 <- arima(ts_data, order = c(1,0,1))
print(ARMA1)
##
## Call:
## arima(x = ts_data, order = c(1, 0, 1))
##
## Coefficients:
## ar1 ma1 intercept
## 0.7127 -1.0000 2982.1211
## s.e. 0.0880 0.0426 39.7209
##
## sigma^2 estimated as 4560370: log likelihood = -628.16, aic = 1264.32
Box.test(ARMA1$residuals,lag=1,type="Ljung-Box")
##
## Box-Ljung test
##
## data: ARMA1$residuals
## X-squared = 0.31106, df = 1, p-value = 0.577
# Box.test is to examine the hypothesis of independence of a regression residuals.
# Ho: Regression Residuals are independently distributed.
# Ha: Regression Residuals are not independently distributed, but exhibit serial correlation.
ts.plot(ts_data)
ARMA_fit <- ts_data - residuals(ARMA1)
points(ARMA_fit, type = "l", col = 2, lty = 2)
# Se realiza un segundo fit a nuestro modelo ARMA para hacer un modelo predictivo para predecir los Flujos de Inversión Extranjera, en este caso haciendo uso de una p = 1, y una q = 0
#Entr
ARMA2 <- arima(ts_data, order = c(1,0,2))
print(ARMA2)
##
## Call:
## arima(x = ts_data, order = c(1, 0, 2))
##
## Coefficients:
## ar1 ma1 ma2 intercept
## 0.6505 -0.8776 -0.1224 2980.2556
## s.e. 0.1300 0.1676 0.1616 37.2391
##
## sigma^2 estimated as 4511177: log likelihood = -627.86, aic = 1265.72
Box.test(ARMA2$residuals,lag=1,type="Ljung-Box") # Box.test is to examine the hypothesis of independence of a regression residuals.
##
## Box-Ljung test
##
## data: ARMA2$residuals
## X-squared = 0.00020051, df = 1, p-value = 0.9887
# Ho: Regression Residuals are independently distributed.
# Ha: Regression Residuals are not independently distributed, but exhibit serial correlation.
# Teniendo un p-value de 0.99, no se rechaza la hipotesis nula, porque nuestros errores no estan correlacionados.
# Cuenta con un aic de 1810.94
Comparando los dos modelos Presentados:
ARIMA(1,0,1) con un AIC aproximado de 1264,32.
ARIMA(1,0,2) con un AIC aproximado de 1265,72.
Dado que un AIC más bajo indica un mejor ajuste, el primer modelo (ARIMA(1,0,1)) parece ser más conveniente en este caso puesto que mantiene un AIC menor que el segundo modelo.
Primero visualicemos las varibales de serie de tiempo
Aquí podemos obaservar las tendecias de cada una de las variables selccionadas para realizar nuestro modelo.
# transofrmacion de variables con datos atipicos
nsh_log_pop_density <- log(nsh_pop_density)
# it is important to assess whether the variables under study are stationary or not
adf.test(nsh_pd$new_fdi_real_mxn) # estacionaria .01
## Warning in adf.test(nsh_pd$new_fdi_real_mxn): p-value smaller than printed
## p-value
##
## Augmented Dickey-Fuller Test
##
## data: nsh_pd$new_fdi_real_mxn
## Dickey-Fuller = -4.1673, Lag order = 7, p-value = 0.01
## alternative hypothesis: stationary
adf.test(nsh_pd$real_wage) # estacionaria .01
## Warning in adf.test(nsh_pd$real_wage): p-value smaller than printed p-value
##
## Augmented Dickey-Fuller Test
##
## data: nsh_pd$real_wage
## Dickey-Fuller = -5.5205, Lag order = 7, p-value = 0.01
## alternative hypothesis: stationary
adf.test(nsh_log_pop_density) # no estacionaria .79
##
## Augmented Dickey-Fuller Test
##
## data: nsh_log_pop_density
## Dickey-Fuller = -0.28217, Lag order = 2, p-value = 0.9843
## alternative hypothesis: stationary
adf.test(nsh_pd$exchange_rate) # estacionaria
## Warning in adf.test(nsh_pd$exchange_rate): p-value smaller than printed p-value
##
## Augmented Dickey-Fuller Test
##
## data: nsh_pd$exchange_rate
## Dickey-Fuller = -18.324, Lag order = 7, p-value = 0.01
## alternative hypothesis: stationary
adf.test(nsh_pd$college_education) # estacionaria .01
## Warning in adf.test(nsh_pd$college_education): p-value smaller than printed
## p-value
##
## Augmented Dickey-Fuller Test
##
## data: nsh_pd$college_education
## Dickey-Fuller = -5.9577, Lag order = 7, p-value = 0.01
## alternative hypothesis: stationary
Podemos observar que las variables new_fdi_real_mxn, real_wage, exchange_rate y college_education parecen ser estacionarias, mientras que log_pop_density no parece ser estacionaria según las pruebas realizadas
#crear un data set
nsh_var_data <- cbind(nsh_new_fdi_real_mxn, nsh_real_wage, nsh_exchange_rate, nsh_log_pop_density)
colnames(nsh_var_data) <- cbind("new_fdi_real_mxn", "nsh_real_wage", "nsh_exchange_rate", "log_pop_density" )
# this line will automatically generate the preferred lag order based on the multivariate iterations of the Akaike Information Criterion - AIC.
# Selection of lag order might be related to the lowest AIC shown.
lag_selection_var <- VARselect(nsh_var_data,lag.max=3,type="const")
lag_selection_var$selection
## AIC(n) HQ(n) SC(n) FPE(n)
## 3 3 3 2
lag_selection_var$criteria
## 1 2 3
## AIC(n) 9.664166 1.1748946 -Inf
## HQ(n) 9.485516 0.8533245 -Inf
## SC(n) 10.533319 2.7393697 -Inf
## FPE(n) 18600.867222 11.6513890 NaN
Estos resultados están relacionados con la selección del orden de rezago óptimo para tu modelo VAR. Los valores más bajos indican un mejor ajuste del modelo, y en este caso, el orden de rezago 2 tiene los valores más bajos en los tres criterios de información.
# We estimate the VAR model. The p option refers to the number of lags used.
var_model_1 <- VAR(nsh_var_data,p=2,type="const",season=NULL,exog=NULL)
forecast_1<-predict(var_model_1, n.ahead=4,ci=0.95) ### forecast for the next year
fanchart(forecast_1,names="Inversion Extranjera Directa Nominal",main="VAR Forecast Inversion extrajera DIrecta en México para los próximos 4 años",xlab="Year",ylab="Inversion en pesos")
## Warning in fanchart(forecast_1, names = "Inversion Extranjera Directa Nominal", :
## Invalid variable name(s) supplied, using first variable.
AIC(var_model_1)
## [1] 228.3408
Se realizaron previsiones para las próximas 4 observaciones con intervalos de confianza del 95%.
### Perform a Granger-Causality Test
# Ho: Time series x does not Granger-cause time series y
# Ha: Time series x Granger-causes time series y
# Granger causality testing each variable against all the others.
# There could be a unidirectional, bidirectional, or no causality relationships between variables.
granger_1 <-causality(var_model_1, cause="new_fdi_real_mxn")
granger_1
## $Granger
##
## Granger causality H0: new_fdi_real_mxn do not Granger-cause
## nsh_real_wage nsh_exchange_rate log_pop_density
##
## data: VAR object var_model_1
## F-Test = 10.346, df1 = 6, df2 = 20, p-value = 2.954e-05
##
##
## $Instant
##
## H0: No instantaneous causality between: new_fdi_real_mxn and
## nsh_real_wage nsh_exchange_rate log_pop_density
##
## data: VAR object var_model_1
## Chi-squared = 6.7776, df = 3, p-value = 0.07934
Según la prueba de Granger, new_fdi_real_mxn Granger-causa nsh_real_wage, pero no hay causalidad instantánea entre estas dos variables.
PanelVAR_FE<-pvarfeols(dependent_vars=c(“new_fdi_real_mxn”,“real_wage”),lags=1, exog_vars=c(“pop_density”, “eschange_rate”), transformation=“demean”, data= nsh_pd, panel_identifier= c(“state”,“year”)) summary(PanelVAR_FE)
summary(nsh_pd)
PANELVAR_FE_GMM<-pvargmm(dependent_vars= c(“new_fdi”),lags=1, predet_vars=c(“real_wage”,“exchange_rate”), exog_vars=c(“pop_density”), transformation=“fd”, data=data_p, panel_identifier=c(“state”,“year”), steps=c(“onestep”)) summary(PANELVAR_FE_GMM)
hansen_j_test(PANELVAR_FE_GMM)
#Pronostico - graficando las series con los fitted values.
ts.plot(ts_data)
ARMA_fit <- ts_data - residuals(ARMA1)
points(ARMA_fit, type = "l", col = 2, lty = 2)
#Usando predict() para ahcer un 1-step forecast
predict_ARMA <- predict(ARMA1)
#Obteniendo el 1-step forecast usando $pred[1]
predict_ARMA$pred[1]
## [1] 2640.212
#Alternativamente usando predict para hacer un 1-step por 10-step forecasts
predict(ARMA1, n.ahead = 5)
## $pred
## Qtr1 Qtr2 Qtr3 Qtr4
## 2023 2640.212 2738.437 2808.443
## 2024 2858.338 2893.899
##
## $se
## Qtr1 Qtr2 Qtr3 Qtr4
## 2023 2149.699 2228.822 2267.957
## 2024 2287.579 2297.483
#Se estiman los proximos 5 periodos
#Graficando AirPassenger series, más el pronocstico y su intervalo de predicción de 95%
ts.plot(ts_data, xlim = c(1997, 2022))
ARMA_forecast <- predict(ARMA1, n.ahead = 5)$pred
ARMA_forecast_se <- predict(ARMA1, n.ahead = 5)$se
points(ARMA_forecast, type = "l", col = 2)
points(ARMA_forecast - 2*ARMA_forecast_se, type = "l", col = 2, lty = 2)
points(ARMA_forecast + 2*ARMA_forecast_se, type = "l", col = 2, lty = 2)
data_df <- as.data.frame(data)
data_df <- dplyr::select(data_df, Year, New_FDI_Inflows)
data_df[nrow(data_df)+1,] <-c(23.2,2640.212)
data_df[nrow(data_df)+1,] <-c(24.3,2738.437)
data_df[nrow(data_df)+1,] <-c(25.4,2808.443)
data_df[nrow(data_df)+1,] <-c(24.1,2149.699)
data_df[nrow(data_df)+1,] <-c(24.2,2228.822 )
ts_data_forecast <- ts(data_df$New_FDI_Inflows, start = c(2006), end = c(2023), frequency = 4) # Anual time series data
plot(ts_data_forecast, type="l",col="blue", lwd=2, xlab ="Year",ylab ="Flujos de Inversión Extranjera", main = "Flujos de Inversión Extranjera en México")
autoplot(forecast(ARMA1))
De la misma manera podemos observar cómo el modelo Arma1 nos refleja la misma tendencia que New_IEd_Inflows a mantenido a través del tiempo, lineal, sin grandes o representativos aumentos ni disminución en su nivel, sin embargo se puede apreciar la presencia de un pequeño cambio (decremento) como los que ya se han visto.
Los principales hallazgos del análisis de series de tiempo son:
Estacionariedad: Se encontró que las variables de interés, como los flujos de inversión extranjera directa, el salario real y la tasa de cambio, son estacionarias, lo que sugiere que no tienen una tendencia sistemática a lo largo del tiempo.
Autocorrelación: Se observó la presencia de autocorrelación en algunas de las variables, lo que indica que los valores pasados de una variable están correlacionados con sus valores futuros.
Modelado ARMA: Se ajustaron modelos ARMA para predecir los flujos de inversión extranjera directa. Se encontró que un modelo ARMA(1,0,1) tenía un mejor ajuste según el criterio de información de Akaike (AIC).
Modelado VAR: Se realizó un modelado VAR para examinar las relaciones entre las variables de interés, como los flujos de inversión extranjera directa y el salario real. Se encontró que había una relación de causalidad entre estas variables según la prueba de causalidad de Granger.
Time Series Analysis: Definition, Types, Techniques, and When It’s Used. (s. f.). Tableau. https://www.tableau.com/learn/articles/time-series-analysis