En este documento se abordan las principales características de una base de datos de series de tiempo y su importancia para pronosticar cambios en los flujos de inversión extranjera directa (IED) asociados con decisiones de “Nearshoring” en México.
Las series de tiempo contienen observaciones recolectadas en intervalos regulares (mensuales, trimestrales o anuales) y presentan dependencias o correlaciones temporales (autocorrelación). Su análisis permite identificar patrones de tendencia y estacionalidad que pueden influir en el comportamiento futuro de la variable estudiada. Además, las series de tiempo permiten evaluar la estacionalidad, tendencia, ciclos económicos y variabilidad estocástica de las variables de interés.
El análisis de series de tiempo contribuye a: - Identificar tendencias y patrones cíclicos o estacionales en la IED. - Estimar modelos estadísticos (ARMA, ARIMA, VAR, Panel VAR) para generar pronósticos. - Informar decisiones estratégicas de empresas y gobiernos sobre la relocalización de operaciones. - Evaluar escenarios optimistas y pesimistas sobre la llegada de nuevas inversiones a México bajo el esquema de “Nearshoring”.
En esta sección se presentan gráficos de series de tiempo que muestran el desempeño de las variables de interés (flujos de IED, tipo de cambio, exportaciones) para identificar posibles tendencias, estacionalidad y autocorrelación.
# Carga de librerías
library(readxl)
library(ggplot2)
library(plm)
library(forecast)
library(tseries)
library(zoo)
library(vars)
library(lmtest)
library(dplyr)
library(panelvar)
library(urca)
library(TSA)
library(xts)
# Carga de datos
<- read_excel("/Users/gabrielmedina/Downloads/panel_data_actualizada.xlsx", sheet = "time series data")
data
# Comprobación de columnas y primeros datos
print(colnames(data))
## [1] "Year" "Quarter" "New_FDI_Inflows" "Exchange_Rate"
## [5] "INPC" "Exports"
print(head(data))
## # A tibble: 6 × 6
## Year Quarter New_FDI_Inflows Exchange_Rate INPC Exports
## <chr> <chr> <dbl> <dbl> <dbl> <dbl>
## 1 2006 I 897. 10.8 60.8 17375.
## 2 2006 II 2110. 10.9 60.6 17909.
## 3 2006 III 1284. 10.9 61.7 17505.
## 4 2006 IV 2678. 10.9 62.7 17486.
## 5 2007 I 3108. 10.9 63.3 18499.
## 6 2007 II 2561. 10.9 63.1 19239.
# Eliminación de filas con valores faltantes
<- na.omit(data)
data
# Procesamiento de la columna Quarter
$Quarter <- trimws(as.character(data$Quarter))
data<- c("I", "II", "III", "IV")
valid_quarters <- data[data$Quarter %in% valid_quarters, ]
data $Quarter <- as.numeric(factor(data$Quarter, levels = valid_quarters, labels = c(1, 2, 3, 4)))
data
# Creación de fechas y series de tiempo
$YearQuarter <- paste(data$Year, data$Quarter)
data$Date <- as.Date(as.yearqtr(data$YearQuarter, format="%Y %q"))
data
<- ts(data$New_FDI_Inflows, start=c(min(data$Year), min(data$Quarter)), frequency=4)
ts_fdi <- ts(data$Exchange_Rate, start=c(min(data$Year), min(data$Quarter)), frequency=4)
ts_exchange <- ts(data$Exports, start=c(min(data$Year), min(data$Quarter)), frequency=4) ts_exports
Para comenzar el análisis exploratorio de los datos se visualizan los datos de la serie de tiempo de la base de datos.
# Gráficos de las variables de interés
par(mfrow=c(3,1))
plot(data$Date, data$New_FDI_Inflows, type="l", col="blue",
main="Flujos de Inversión Extranjera Directa (FDI)",
xlab="Fecha (Trimestres)", ylab="Millones USD")
plot(data$Date, data$Exchange_Rate, type="l", col="red",
main="Evolución del Tipo de Cambio",
xlab="Fecha (Trimestres)", ylab="Pesos por USD")
plot(data$Date, data$Exports, type="l", col="green",
main="Evolución de las Exportaciones",
xlab="Fecha (Trimestres)", ylab="Millones USD")
Las tres gráficas muestran la evolución de los flujos de Inversión Extranjera Directa (FDI), el tipo de cambio y las exportaciones en México a lo largo del tiempo. La primera gráfica indica que los flujos de FDI han sido volátiles, con algunos picos notables, como el registrado alrededor de 2014, seguido de fluctuaciones moderadas. Esto sugiere que la inversión extranjera en México ha respondido a eventos económicos y políticos específicos, reflejando posibles cambios en políticas de inversión o incentivos fiscales.
La segunda gráfica muestra la evolución del tipo de cambio, que ha presentado una tendencia creciente desde 2008 hasta aproximadamente 2020, con periodos de estabilidad y algunas caídas recientes. Esto implica que el peso mexicano se ha depreciado frente al dólar en el largo plazo, lo que podría haber favorecido las exportaciones al hacerlas más competitivas. La tercera gráfica confirma esto con un crecimiento sostenido en las exportaciones, especialmente después de 2015, lo que sugiere que la depreciación del peso y el auge del nearshoring han impulsado la actividad comercial de México con el exterior.
Análisis detallado…
Flujos de Inversión Extranjera Directa (FDI)
Evolución del Tipo de Cambio
Evolución de las Exportaciones
En resumen, ninguna de las series parece ser estacionaria, ya que todas presentan tendencias o fluctuaciones en su varianza. Para realizar modelos predictivos robustos, sería necesario aplicar transformaciones como diferenciación o pruebas de estacionariedad.
# Ejemplo de modelo ARMA(1,1) sobre la serie ts_fdi
<- arima(ts_fdi, order = c(1, 0, 1))
model_arma summary(model_arma)
##
## Call:
## arima(x = ts_fdi, order = c(1, 0, 1))
##
## Coefficients:
## ar1 ma1 intercept
## 0.7677 -1.0000 2957.8654
## s.e. 0.0839 0.0376 44.7353
##
## sigma^2 estimated as 4744450: log likelihood = -674.97, aic = 1355.94
##
## Training set error measures:
## Warning in trainingaccuracy(object, test, d, D): test elements must be within
## sample
## ME RMSE MAE MPE MAPE
## Training set NaN NaN NaN NaN NaN
checkresiduals(model_arma)
##
## Ljung-Box test
##
## data: Residuals from ARIMA(1,0,1) with non-zero mean
## Q* = 8.6785, df = 6, p-value = 0.1925
##
## Model df: 2. Total lags used: 8
El modelo ARMA sugiere que la serie de flujos de inversión extranjera presenta una dependencia moderada con su valor inmediato anterior (ar1 = 0.7677) y un componente de media móvil (ma1) bastante pronunciado en -1.0000. El intercepto (2957.8654) representa el valor promedio de la serie cuando los efectos AR y MA se compensan. El hecho de que la prueba de Ljung-Box muestre un p-value de 0.1925 indica que no hay evidencia estadísticamente significativa de autocorrelación en los residuos, lo que sugiere que el modelo capta adecuadamente la dinámica de la serie.
Por otra parte, el valor de sigma^2 (4744450) se interpreta como la varianza de los residuos y el AIC (1355.94) brinda una referencia para comparar con otros posibles modelos. En conjunto, los resultados apuntan a que un ARMA con intercepto logra explicar de manera razonable la variabilidad de los flujos de inversión.
<- auto.arima(ts_fdi, seasonal = FALSE)
arima_fdi summary(arima_fdi)
## Series: ts_fdi
## ARIMA(0,0,0) with non-zero mean
##
## Coefficients:
## mean
## 2890.7131
## s.e. 268.7113
##
## sigma^2 = 5416412: log likelihood = -678.18
## AIC=1360.36 AICc=1360.53 BIC=1364.97
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE
## Training set -4.916188e-14 2311.54 1504.828 -56.3453 94.2923 0.6677783
## ACF1
## Training set 0.02674732
El modelo ARIMA(0,0,0) básicamente nos dice que los flujos de inversión extranjera directa (IED) no siguen una tendencia clara ni tienen una estructura predecible. La media estimada es de 2890.71 millones de USD, lo que indica que, en promedio, los valores fluctúan alrededor de ese nivel sin patrones evidentes de crecimiento o caída. Es como si los datos fueran puro ruido, sin un componente autoregresivo o de medias móviles que permita hacer buenas predicciones basadas en el pasado.
Además, el RMSE de 2311.54 y el MAPE del 94.29% nos dicen que el modelo no predice con mucha precisión, lo que sugiere que los flujos de IED han sido muy volátiles. La baja autocorrelación en los residuos confirma que no hay una estructura clara en los datos. En resumen, este modelo no ayuda mucho para hacer pronósticos confiables, y tal vez sería mejor probar enfoques más complejos que incorporen factores externos, como la política económica, cambios en tratados comerciales o el impacto del nearshoring.
# Cargar la librería necesaria
library(vars)
# Combinar las series en un solo objeto
<- cbind(ts_fdi, ts_exchange, ts_exports)
data_var
# Seleccionar el orden óptimo del VAR (p) con un máximo de 8 rezagos
<- VARselect(data_var, lag.max = 8, type = "const")
lag_select print(lag_select)
## $selection
## AIC(n) HQ(n) SC(n) FPE(n)
## 1 1 1 1
##
## $criteria
## 1 2 3 4 5
## AIC(n) 3.045252e+01 3.058149e+01 3.063477e+01 3.069686e+01 3.085145e+01
## HQ(n) 3.060984e+01 3.085679e+01 3.102806e+01 3.120814e+01 3.148072e+01
## SC(n) 3.085064e+01 3.127820e+01 3.163007e+01 3.199075e+01 3.244393e+01
## FPE(n) 1.680954e+13 1.916084e+13 2.030379e+13 2.179089e+13 2.578973e+13
## 6 7 8
## AIC(n) 3.099795e+01 3.108901e+01 3.118014e+01
## HQ(n) 3.174520e+01 3.195424e+01 3.216336e+01
## SC(n) 3.288901e+01 3.327866e+01 3.366838e+01
## FPE(n) 3.048291e+13 3.437840e+13 3.918325e+13
# Ajustar el modelo VAR con el número de rezagos recomendado (por ejemplo, p=2)
<- VAR(data_var, p = 2, type = "const")
var_model summary(var_model)
##
## VAR Estimation Results:
## =========================
## Endogenous variables: ts_fdi, ts_exchange, ts_exports
## Deterministic variables: const
## Sample size: 72
## Log Likelihood: -1378.207
## Roots of the characteristic polynomial:
## 0.9755 0.8898 0.2845 0.2845 0.2042 0.2042
## Call:
## VAR(y = data_var, p = 2, type = "const")
##
##
## Estimation results for equation ts_fdi:
## =======================================
## ts_fdi = ts_fdi.l1 + ts_exchange.l1 + ts_exports.l1 + ts_fdi.l2 + ts_exchange.l2 + ts_exports.l2 + const
##
## Estimate Std. Error t value Pr(>|t|)
## ts_fdi.l1 0.03265 0.12133 0.269 0.7887
## ts_exchange.l1 -498.05573 406.29671 -1.226 0.2247
## ts_exports.l1 0.13679 0.14972 0.914 0.3643
## ts_fdi.l2 -0.01699 0.12144 -0.140 0.8892
## ts_exchange.l2 602.47127 429.27423 1.403 0.1652
## ts_exports.l2 -0.20397 0.14735 -1.384 0.1710
## const 3268.29108 1374.74210 2.377 0.0204 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
##
## Residual standard error: 2367 on 65 degrees of freedom
## Multiple R-Squared: 0.06753, Adjusted R-squared: -0.01855
## F-statistic: 0.7845 on 6 and 65 DF, p-value: 0.5852
##
##
## Estimation results for equation ts_exchange:
## ============================================
## ts_exchange = ts_fdi.l1 + ts_exchange.l1 + ts_exports.l1 + ts_fdi.l2 + ts_exchange.l2 + ts_exports.l2 + const
##
## Estimate Std. Error t value Pr(>|t|)
## ts_fdi.l1 1.643e-05 3.878e-05 0.424 0.673
## ts_exchange.l1 9.250e-01 1.299e-01 7.122 1.05e-09 ***
## ts_exports.l1 -3.152e-05 4.786e-05 -0.659 0.512
## ts_fdi.l2 1.555e-05 3.882e-05 0.401 0.690
## ts_exchange.l2 3.990e-02 1.372e-01 0.291 0.772
## ts_exports.l2 3.455e-05 4.710e-05 0.734 0.466
## const 4.860e-01 4.394e-01 1.106 0.273
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
##
## Residual standard error: 0.7568 on 65 degrees of freedom
## Multiple R-Squared: 0.9584, Adjusted R-squared: 0.9546
## F-statistic: 249.8 on 6 and 65 DF, p-value: < 2.2e-16
##
##
## Estimation results for equation ts_exports:
## ===========================================
## ts_exports = ts_fdi.l1 + ts_exchange.l1 + ts_exports.l1 + ts_fdi.l2 + ts_exchange.l2 + ts_exports.l2 + const
##
## Estimate Std. Error t value Pr(>|t|)
## ts_fdi.l1 -4.859e-03 9.844e-02 -0.049 0.9608
## ts_exchange.l1 -3.415e+02 3.296e+02 -1.036 0.3041
## ts_exports.l1 7.835e-01 1.215e-01 6.449 1.61e-08 ***
## ts_fdi.l2 -7.532e-03 9.853e-02 -0.076 0.9393
## ts_exchange.l2 6.319e+02 3.483e+02 1.814 0.0743 .
## ts_exports.l2 1.074e-01 1.196e-01 0.898 0.3725
## const -6.742e+02 1.115e+03 -0.604 0.5476
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
##
## Residual standard error: 1921 on 65 degrees of freedom
## Multiple R-Squared: 0.9629, Adjusted R-squared: 0.9595
## F-statistic: 281.4 on 6 and 65 DF, p-value: < 2.2e-16
##
##
##
## Covariance matrix of residuals:
## ts_fdi ts_exchange ts_exports
## ts_fdi 5604969.7 103.7937 -106553.9
## ts_exchange 103.8 0.5727 -216.7
## ts_exports -106553.9 -216.6976 3689649.5
##
## Correlation matrix of residuals:
## ts_fdi ts_exchange ts_exports
## ts_fdi 1.00000 0.05793 -0.02343
## ts_exchange 0.05793 1.00000 -0.14907
## ts_exports -0.02343 -0.14907 1.00000
# Prueba de autocorrelación en los residuos del VAR
<- serial.test(var_model, lags.pt = 16, type = "PT.asymptotic")
serial_test print(serial_test)
##
## Portmanteau Test (asymptotic)
##
## data: Residuals of VAR object var_model
## Chi-squared = 129.92, df = 126, p-value = 0.3872
## $serial
##
## Portmanteau Test (asymptotic)
##
## data: Residuals of VAR object var_model
## Chi-squared = 129.92, df = 126, p-value = 0.3872
El modelo VAR de orden 2 evidencia que, en la ecuación de los flujos de IED, ninguno de los rezagos de las variables resulta estadísticamente significativo, salvo el intercepto, lo que sugiere que la dinámica de la IED podría estar influenciada por factores no incluidos en este sistema o por shocks externos. En contraste, la ecuación del tipo de cambio muestra una alta persistencia, ya que el primer rezago de la tasa de cambio (ts_exchange.l1) es altamente significativo, lo que indica que el valor actual del tipo de cambio depende fuertemente de su valor pasado. De igual manera, en la ecuación de exportaciones, el primer rezago de exportaciones (ts_exports.l1) resulta significativo, sugiriendo un comportamiento inercial en esta variable.
Por otro lado, las pruebas de autocorrelación, como el test de Portmanteau (p-value = 0.3872), indican que los residuos del VAR no presentan autocorrelación significativa, lo cual respalda la adecuación del modelo. En conjunto, estos resultados sugieren que, si bien el tipo de cambio y las exportaciones tienen una dinámica interna marcada por sus propios rezagos, la IED podría requerir la incorporación de otros factores o variables para captar de manera adecuada su comportamiento o natural.
# Obtener los residuos del modelo ARMA
<- residuals(model_arma)
res_arma
# a. Prueba de autocorrelación serial: Test de Ljung-Box
<- Box.test(res_arma, lag = 16, type = "Ljung-Box")
lb_test print(lb_test)
##
## Box-Ljung test
##
## data: res_arma
## X-squared = 13.773, df = 16, p-value = 0.6156
# b. Prueba de estacionariedad: Test de Dickey-Fuller aumentado (ADF)
library(tseries)
<- adf.test(res_arma) adf_test
## Warning in adf.test(res_arma): p-value smaller than printed p-value
print(adf_test)
##
## Augmented Dickey-Fuller Test
##
## data: res_arma
## Dickey-Fuller = -4.7591, Lag order = 4, p-value = 0.01
## alternative hypothesis: stationary
El test de Ljung-Box muestra un valor de chi-cuadrado de 13.773 con 16 grados de libertad y un p-value de 0.6156. Esto indica que no se rechaza la hipótesis nula de ausencia de autocorrelación en los residuos, lo que sugiere que estos se comportan como ruido blanco, es decir, no presentan patrones seriales que el modelo no haya captado.
Por otro lado, el test de Dickey-Fuller Aumentado arroja un estadístico de -4.7591 con un p-value de 0.01, lo que permite rechazar la hipótesis nula de la presencia de una raíz unitaria. Esto confirma que la serie (o los residuos, en este caso) es estacionaria. En conjunto, ambos resultados indican que el modelo ARMA se ajusta adecuadamente a la estructura temporal de la serie, ya que captura la dependencia temporal sin dejar autocorrelación en los residuos y asegura la estacionariedad requerida.
# Supongamos que tu modelo ARIMA ya está estimado y se llama 'model_arima'
# Por ejemplo:
# model_arima <- arima(ts_fdi, order = c(1, 0, 1))
# 1. Extraer los residuos del modelo ARIMA
<- residuals(arima_fdi)
res_arima
# 2. Prueba de autocorrelación serial: Ljung-Box test
<- Box.test(res_arima, lag = 16, type = "Ljung-Box")
lb_test print(lb_test)
##
## Box-Ljung test
##
## data: res_arima
## X-squared = 12.901, df = 16, p-value = 0.68
# 3. Prueba de estacionariedad: Augmented Dickey-Fuller (ADF)
library(tseries)
<- adf.test(res_arima) adf_test
## Warning in adf.test(res_arima): p-value smaller than printed p-value
print(adf_test)
##
## Augmented Dickey-Fuller Test
##
## data: res_arima
## Dickey-Fuller = -5.014, Lag order = 4, p-value = 0.01
## alternative hypothesis: stationary
El test de Ljung-Box aplicado a los residuos del modelo ARIMA arroja un estadístico chi-cuadrado de 12.901 con 16 grados de libertad y un p-value de 0.68. Dado que el p-value es alto, no se rechaza la hipótesis nula de que los residuos son ruido blanco, lo que indica que el modelo ha capturado bien la estructura temporal de la serie y no deja patrones de autocorrelación significativos.
Por otro lado, el test de Dickey-Fuller Aumentado (ADF) muestra un estadístico de -5.014 con un p-value de 0.01, lo que permite rechazar la hipótesis nula de que los residuos tienen una raíz unitaria. Esto confirma que los residuos del modelo son estacionarios, un requisito clave para validar la adecuación del ARIMA.
En conjunto, estos resultados indican que el modelo ARIMA está correctamente especificado, ya que sus residuos se comportan como ruido blanco y no presentan problemas de autocorrelación ni de no estacionariedad.
library(vars)
# 1. Prueba de autocorrelación serial (Portmanteau)
<- serial.test(var_model, lags.pt = 16, type = "PT.asymptotic")
serial_test print(serial_test)
##
## Portmanteau Test (asymptotic)
##
## data: Residuals of VAR object var_model
## Chi-squared = 129.92, df = 126, p-value = 0.3872
## $serial
##
## Portmanteau Test (asymptotic)
##
## data: Residuals of VAR object var_model
## Chi-squared = 129.92, df = 126, p-value = 0.3872
# 2. Prueba de normalidad de los residuos
<- normality.test(var_model)
normality_test print(normality_test)
## $JB
##
## JB-Test (multivariate)
##
## data: Residuals of VAR object var_model
## Chi-squared = 499.78, df = 6, p-value < 2.2e-16
##
##
## $Skewness
##
## Skewness only (multivariate)
##
## data: Residuals of VAR object var_model
## Chi-squared = 82.054, df = 3, p-value < 2.2e-16
##
##
## $Kurtosis
##
## Kurtosis only (multivariate)
##
## data: Residuals of VAR object var_model
## Chi-squared = 417.73, df = 3, p-value < 2.2e-16
## $jb.mul
## $jb.mul$JB
##
## JB-Test (multivariate)
##
## data: Residuals of VAR object var_model
## Chi-squared = 499.78, df = 6, p-value < 2.2e-16
##
##
## $jb.mul$Skewness
##
## Skewness only (multivariate)
##
## data: Residuals of VAR object var_model
## Chi-squared = 82.054, df = 3, p-value < 2.2e-16
##
##
## $jb.mul$Kurtosis
##
## Kurtosis only (multivariate)
##
## data: Residuals of VAR object var_model
## Chi-squared = 417.73, df = 3, p-value < 2.2e-16
# 3. Prueba de heterocedasticidad (ARCH test)
<- arch.test(var_model)
arch_test print(arch_test)
##
## ARCH (multivariate)
##
## data: Residuals of VAR object var_model
## Chi-squared = 192.87, df = 180, p-value = 0.2427
## $arch.mul
##
## ARCH (multivariate)
##
## data: Residuals of VAR object var_model
## Chi-squared = 192.87, df = 180, p-value = 0.2427
# 4. Verificación de estabilidad: obtener y graficar las raíces del polinomio característico
<- roots(var_model)
roots_var print(roots_var)
## [1] 0.9754563 0.8898220 0.2845121 0.2845121 0.2042252 0.2042252
plot(roots(var_model), main = "Raíces del VAR", xlab = "Parte Real", ylab = "Parte Imaginaria")
Interpretación de las pruebas de diagnóstico del
VAR:
Autocorrelación (Portmanteau Test): El test arroja un p-value de 0.3872, lo que indica que no hay evidencia significativa de autocorrelación en los residuos. Esto sugiere que el modelo VAR captura adecuadamente la dependencia temporal.
Normalidad (Jarque-Bera Multivariado): El p-value < 2.2e-16 revela que los residuos no siguen una distribución normal. Esta desviación de normalidad podría indicar la presencia de colas gruesas o asimetría en los datos. Heterocedasticidad (ARCH Test): El p-value de 0.2427 sugiere que no hay evidencia estadísticamente significativa de heterocedasticidad en los residuos, por lo que la varianza parece ser constante en el tiempo.
Estabilidad (Raíces del polinomio característico): Todas las raíces están por debajo de 1 (en valor absoluto), lo que implica que el modelo VAR es estable. En otras palabras, las perturbaciones tienden a disiparse en lugar de amplificarse a lo largo del tiempo.
En conjunto, el VAR no presenta problemas de autocorrelación ni heterocedasticidad, y sus ecuaciones son estables. Sin embargo, la no normalidad de los residuos podría requerir ajustes o transformaciones adicionales si la normalidad es un supuesto crítico para la inferencia.
En términos de pronóstico específico para la serie de flujos de IED, el modelo ARIMA(1,0,1) ofrece un mejor ajuste. Las pruebas de diagnóstico muestran que sus residuos son estacionarios (test ADF con p-value < 0.05) y no presentan autocorrelación (test de Ljung-Box con p-value > 0.05), lo que indica que el modelo capta de manera adecuada la estructura temporal de la variable sin dejar patrones sin explicar. Esto lo convierte en una opción confiable para predecir el comportamiento de la IED en el tiempo.
Por su parte, el modelo VAR es valioso si se busca capturar relaciones dinámicas entre múltiples variables (IED, tipo de cambio y exportaciones). Si bien no presenta autocorrelación serial y es estable (todas las raíces por debajo de 1), el incumplimiento de la normalidad de los residuos y la falta de significancia en la ecuación de IED sugieren que, para un pronóstico univariante de la IED, el ARIMA(1,0,1) resulta más apropiado. El VAR es recomendable cuando el interés radica en el efecto conjunto y la interacción entre las distintas variables.
# Cargar librerías
library(forecast)
library(tseries)
# 1. Transformación Box-Cox para estabilizar la varianza (opcional, pero recomendable si la serie muestra heterocedasticidad)
<- BoxCox.lambda(ts_fdi) # Determina el mejor lambda automáticamente lambda
## Warning in guerrero(x, lower, upper): Guerrero's method for selecting a Box-Cox
## parameter (lambda) is given for strictly positive data.
<- BoxCox(ts_fdi, lambda) # Aplica la transformación Box-Cox
ts_fdi_bc
# 2. Ajuste exhaustivo de ARIMA con auto.arima
# - stepwise=FALSE y approximation=FALSE realizan una búsqueda más amplia en el espacio de modelos.
# - seasonal=FALSE asume que no hay componente estacional, ajusta según tus datos (si trimestral con estacionalidad, pon seasonal=TRUE).
<- auto.arima(
model_improved
ts_fdi_bc,stepwise = FALSE,
approximation = FALSE,
seasonal = FALSE
)
# 3. Revisar el resumen del modelo
summary(model_improved)
## Series: ts_fdi_bc
## ARIMA(4,0,0) with non-zero mean
##
## Coefficients:
## ar1 ar2 ar3 ar4 mean
## 0.2661 -0.2752 0.2749 -0.3068 42.0289
## s.e. 0.1112 0.1111 0.1093 0.1099 1.8823
##
## sigma^2 = 297.4: log likelihood = -313.44
## AIC=638.88 AICc=640.13 BIC=652.7
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE
## Training set -0.008155347 16.6524 10.23466 3.483506 24.5342 0.6190454
## ACF1
## Training set 0.04706985
# 4. Verificación de los residuos
checkresiduals(model_improved)
##
## Ljung-Box test
##
## data: Residuals from ARIMA(4,0,0) with non-zero mean
## Q* = 4.667, df = 4, p-value = 0.3232
##
## Model df: 4. Total lags used: 8
El nuevo modelo ARIMA(4,0,0) con Box-Cox exhibe criterios de información (AIC, BIC) considerablemente más bajos que el ARIMA(1,0,1) original, y su log-likelihood es más elevado, lo que indica un mejor ajuste. Adicionalmente, las medidas de error (RMSE, MAE) en el conjunto de entrenamiento se reducen, sugiriendo que la transformación Box-Cox y la búsqueda exhaustiva de órdenes han permitido capturar de forma más precisa la dinámica de la serie.
En cuanto a los residuos, se observa que estos presentan menor autocorrelación y se distribuyen de manera más cercana a la normal, cumpliendo con los supuestos de ruido blanco. En conjunto, estas mejoras apuntan a que el ARIMA(4,0,0) con Box-Cox describe mejor la evolución de la variable estudiada y ofrece mayor confiabilidad para fines de pronóstico.
# Cargar librerías necesarias
library(forecast)
library(ggplot2)
library(strucchange) # Para detectar posibles cambios estructurales
# -----------------------------------------------------------------
# 1. Pronóstico de los flujos de IED para los siguientes 4 períodos
<- forecast(model_improved, h = 4)
forecast_improved
# Graficar el pronóstico
autoplot(forecast_improved) +
ggtitle("Pronóstico de Flujos de IED para México - Próximos 4 Períodos") +
xlab("Tiempo") +
ylab("Flujos de IED (Millones USD)") +
theme_minimal()
# Imprimir resumen del pronóstico
print(forecast_improved)
## Point Forecast Lo 80 Hi 80 Lo 95 Hi 95
## 2024 Q3 42.00014 19.89954 64.10075 8.200186 75.80010
## 2024 Q4 46.83206 23.96222 69.70190 11.855663 81.80846
## 2025 Q1 41.69780 18.38635 65.00925 6.046015 77.34959
## 2025 Q2 48.02892 24.49130 71.56655 12.031229 84.02661
# -----------------------------------------------------------------
# -----------------------------------------------------------------
# 3. Análisis de posibles cambios estructurales en la serie de IED
<- breakpoints(ts_fdi ~ 1) # 'ts_fdi' es la serie original de flujos de IED
bp_model summary(bp_model)
##
## Optimal (m+1)-segment partition:
##
## Call:
## breakpoints.formula(formula = ts_fdi ~ 1)
##
## Breakpoints at observation number:
##
## m = 1 30
## m = 2 18 29
## m = 3 18 29 41
## m = 4 18 29 41 56
## m = 5 18 29 41 52 63
##
## Corresponding to breakdates:
##
## m = 1 2013(2)
## m = 2 2010(2) 2013(1)
## m = 3 2010(2) 2013(1) 2016(1)
## m = 4 2010(2) 2013(1) 2016(1) 2019(4)
## m = 5 2010(2) 2013(1) 2016(1) 2018(4) 2021(3)
##
## Fit:
##
## m 0 1 2 3 4 5
## RSS 395398046 391645995 381468084 373262852 372179565 373202570
## BIC 1365 1373 1380 1387 1395 1404
plot(bp_model, main = "Detección de puntos de quiebre en flujos de IED")
Los resultados del pronóstico mediante el modelo ARIMA(4,0,0) con
Box-Cox muestran que los flujos de IED en México se mantendrán
relativamente estables durante los próximos cuatro trimestres, con un
rango de incertidumbre que permite distinguir escenarios optimistas
(límite superior) y pesimistas (límite inferior). El punto medio del
pronóstico sugiere una ligera recuperación frente a los valores más
recientes, aunque no se proyecta un crecimiento acelerado; más bien, se
estima una trayectoria moderada. Esta perspectiva se alinea con la idea
de que el nearshoring puede impulsar la llegada de inversiones, pero
también depende de otros factores como la estabilidad económica y las
condiciones del mercado global.
En cuanto a la detección de puntos de quiebre, la prueba sugiere posibles rupturas estructurales en 2010(2), 2013(1), 2016(1), 2019(4) y 2021(3). Sin embargo, de acuerdo con el criterio BIC, el modelo sin quiebres (m=0) exhibe el valor más bajo (BIC=1365), lo que indica que no hay evidencia concluyente de que estos cambios hayan alterado significativamente la media de la serie en comparación con un modelo sin rupturas. Dicho de otra forma, aunque pueden existir eventos relevantes en esas fechas que afecten temporalmente la dinámica de la IED, el ajuste global de la serie no mejora sustancialmente al incorporar esos posibles cambios estructurales, por lo que se considera que la serie no presenta un quiebre estadísticamente definitivo en el período analiz+.
El escenario optimista se refleja en el límite superior de los intervalos de confianza, donde se prevé que los flujos de IED aumenten gradualmente, apoyados por las oportunidades del nearshoring y la competitividad de México en manufactura y logística. En contraste, el escenario pesimista se observa en el límite inferior de dichos intervalos, sugiriendo una desaceleración o estancamiento de la IED ante factores como incertidumbre política, volatilidad económica o menor demanda externa.
El análisis de series de tiempo de los flujos de IED, el tipo de cambio y las exportaciones en México permitió identificar patrones y dinámicas relevantes para entender el comportamiento de la inversión extranjera, especialmente en el contexto del nearshoring. Se evidenció que los modelos univariantes y multivariantes capturan distintos aspectos de la dinámica, aunque la serie de IED presenta cierta volatilidad y posibles puntos de quiebre que requieren atención. El modelo ARIMA, optimizado a través de una transformación Box-Cox y una búsqueda exhaustiva de órdenes, mostró un mejor desempeño que la especificación inicial. Los criterios de información (AIC, BIC) mejorados, junto con residuos que se comportan como ruido blanco y muestran estacionariedad, respaldan la fiabilidad del modelo para pronosticar la evolución de los flujos de IED en el corto plazo. En el pronóstico a 4 períodos, se observa una tendencia moderada en la evolución de los flujos de IED, con un escenario optimista que sugiere un incremento gradual, impulsado por oportunidades vinculadas al nearshoring. Por el contrario, el escenario pesimista, representado por el límite inferior de los intervalos de confianza, indica la posibilidad de estancamiento o desaceleración, reflejando la incertidumbre inherente a factores económicos y políticos. Finalmente, el análisis de rupturas estructurales indicó la presencia de posibles puntos de quiebre en fechas clave, aunque según el criterio BIC, el modelo sin quiebres resulta el más parsimonioso. En conjunto, estos hallazgos ofrecen una visión integral que permite valorar tanto el potencial de crecimiento de la IED en México como los riesgos y limitaciones, proporcionando una base sólida para la toma de decisiones estratégicas en el marco del nearshoring.
De acuerdo con el análisis realizado, se observa que existen condiciones favorables que podrían impulsar el nearshoring en México, reflejadas en un escenario optimista donde se proyecta un incremento gradual de los flujos de IED. Sin embargo, la presencia de un escenario pesimista, que señala la posibilidad de estancamiento o incluso una desaceleración en la entrada de inversiones, resalta que la concreción del nearshoring dependerá de la evolución de factores económicos y políticos tanto a nivel local como global. En síntesis, aunque el potencial para que se materialicen decisiones de nearshoring es real, su éxito dependerá de la estabilidad y la convergencia de múltiples variables