ACTIVIDAD #2

Ximena Meléndez - A01720569 Ana Sofía Mijares - A01236164 Sofía Badillo - A01384253

Introducción

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.

Visualización de Datos

Se visualiza el comportamiento de los flujos de inversión extranjera directa a través de los años.

Estimación de Modelo de Series de Tiempo

Analisis de regresiones de series temporales

## [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"
  • H0: Non-stationary and HA: Stationary. p-values < 0.05 reject the H0.
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") 

a. ARMA 1

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. 
  • La varianza estimada de los residuos (sigma^2) es igual a 4560370.
  • El coeficiente autorregresivo es 0,712.
  • P-Value es aproximadamente 0,577, lo que sugiere que no hay autocorrelación significativa en los residuos al nivel de significancia del 5%.

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)

b. ARMA 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 
  • La varianza estimada de los residuos (sigma^2) es igual a 4511177.
  • El coeficiente autorregresivo es 0,6505
  • P-Value es aproximadamente 0,9887, lo que sugiere que no hay autocorrelación significativa en los residuos al nivel de significancia del 5%.

Comparando los dos modelos Presentados:

  1. ARIMA(1,0,1) con un AIC aproximado de 1264,32.

  2. 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.

VAR

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.

PANEL VAR

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)

Selección de Modelo e Interpretación de Resultados

#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.

Conslusiones

Los principales hallazgos del análisis de series de tiempo son:

  1. 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.

  2. 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.

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

  4. 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.

Referencias

Time Series Analysis: Definition, Types, Techniques, and When It’s Used. (s. f.). Tableau. https://www.tableau.com/learn/articles/time-series-analysis