library(readxl)
library(plm)
library(lmtest)
## Loading required package: zoo
## 
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
library(sandwich)
library(car)
## Loading required package: carData
library(readr)
library(lmtest)
library(tseries)
## Registered S3 method overwritten by 'quantmod':
##   method            from
##   as.zoo.data.frame zoo
panel_data_act <- read_csv("/Users/gabrielmedina/Downloads/panel_data_limpio.csv")
## Rows: 544 Columns: 27
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr  (2): state, region
## dbl (25): year, state_id, new_fdi, reinv_profits, intercom_acc, total_fdi, c...
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
df <- panel_data_act
head(df)

En este análisis, el objetivo es entender qué factores pueden estar influyendo en la llegada de inversión extranjera directa (IED) en los diferentes estados. Para esto, vamos a construir un modelo de datos panel donde la variable que queremos explicar (variable dependiente) es total_fdi, que representa la cantidad total de inversión extranjera que recibe cada estado en un año determinado. Para tratar de entender qué afecta esta inversión, seleccionamos varias variables explicativas que tienen sentido desde un punto de vista económico y de negocios: crime_rate: La tasa de criminalidad puede ser un factor disuasorio para las empresas que buscan invertir en un estado. unemployment: La tasa de desempleo es clave porque puede indicar qué tan estable es la economía local y si hay suficiente fuerza laboral disponible. pop_density: La densidad poblacional nos da una idea del tamaño del mercado y de la demanda potencial. real_wage: El salario real promedio influye en los costos laborales, lo que puede hacer que un estado sea más o menos atractivo para la inversión. college_education: Representa el porcentaje de la población con educación superior, lo que se asocia con la disponibilidad de talento calificado. business_activity: Mide el nivel de actividad empresarial, lo que indica qué tan dinámico es el entorno económico. exchange_rate: El tipo de cambio afecta la rentabilidad de las inversiones extranjeras y puede influir en la toma de decisiones de las empresas. exports_miles_dlls: Nos dice cuánto exporta un estado, lo que puede ser un indicador de qué tan integrado está en el comercio internacional. border_distance: La distancia a la frontera con Estados Unidos puede ser importante, especialmente para empresas que dependen del comercio con ese país. La idea es ver cómo estas variables influyen en la inversión extranjera a lo largo del tiempo, considerando que cada estado puede tener características propias que afectan los resultados. En las siguientes secciones, vamos a probar diferentes modelos de regresión en datos panel para encontrar cuál es el que mejor se ajusta a los datos.

df$state <- as.factor(df$state)
df$year <- as.integer(df$year)
pdata <- pdata.frame(df, index = c("state", "year"))

Estimación de Modelos de Regresión de Datos Panel Para evaluar el impacto de nuestras variables explicativas sobre la inversión extranjera directa (total_fdi), se estimaron distintos modelos de regresión en datos panel. El objetivo es comparar estos modelos para identificar cuál ofrece la mejor estimación, considerando las características de la base de datos y la estructura temporal de los datos.

# modelo base 
model_form <- total_fdi ~ crime_rate + unemployment + real_wage + good_governance +
            pop_density + college_education + business_activity +
            exchange_rate + exports_miles_dlls + border_distance
# multicolinealidad modelo ols 
ols_model <- lm(total_fdi ~ crime_rate + unemployment + real_wage + good_governance +
                pop_density + college_education + business_activity +
                exchange_rate + exports_miles_dlls + border_distance, data = df)
vif(ols_model)
##         crime_rate       unemployment          real_wage    good_governance 
##           1.208979           1.291035           2.416284           1.049106 
##        pop_density  college_education  business_activity      exchange_rate 
##           2.270882           2.834492           2.672129           2.171559 
## exports_miles_dlls    border_distance 
##           1.708638           2.700623

Pooled OLS (MCO agrupado): Este modelo asume que no hay efectos específicos por estado o año y aplica una regresión estándar. Sirve como un punto de referencia inicial.

ols_model <- lm(model_form, data = df)
vif_values <- vif(ols_model)
cat("VIF de cada variable:\n")
## VIF de cada variable:
print(vif_values)
##         crime_rate       unemployment          real_wage    good_governance 
##           1.208979           1.291035           2.416284           1.049106 
##        pop_density  college_education  business_activity      exchange_rate 
##           2.270882           2.834492           2.672129           2.171559 
## exports_miles_dlls    border_distance 
##           1.708638           2.700623
pooled_model <- plm(model_form, data = pdata, model = "pooling")
cat("\n--- Pooled OLS ---\n")
## 
## --- Pooled OLS ---
print(pooled_model)
## 
## Model Formula: total_fdi ~ crime_rate + unemployment + real_wage + good_governance + 
##     pop_density + college_education + business_activity + exchange_rate + 
##     exports_miles_dlls + border_distance
## 
## Coefficients:
##        (Intercept)         crime_rate       unemployment          real_wage 
##         8.3522e+02         2.3040e-01        -4.1024e+03         2.3329e+00 
##    good_governance        pop_density  college_education  business_activity 
##         7.6055e+00         8.9595e-01        -1.8828e+03         1.6271e+01 
##      exchange_rate exports_miles_dlls    border_distance 
##         4.2669e+00         2.2552e-05        -8.7362e-01
fe_one_way <- plm(model_form, data = pdata, model = "within", effect = "individual")
cat("\n--- Fixed Effects (One Way - Estado) ---\n")
## 
## --- Fixed Effects (One Way - Estado) ---
print(fe_one_way)
## 
## Model Formula: total_fdi ~ crime_rate + unemployment + real_wage + good_governance + 
##     pop_density + college_education + business_activity + exchange_rate + 
##     exports_miles_dlls + border_distance
## 
## Coefficients:
##         crime_rate       unemployment          real_wage    good_governance 
##        -2.2977e+00        -6.3492e+03         4.9549e-01         1.1357e+00 
##        pop_density  college_education  business_activity      exchange_rate 
##         4.9492e+00         3.1914e+02        -9.4028e+01        -6.4131e+00 
## exports_miles_dlls 
##         1.4189e-05

Fixed Effects (One Way – Estado): Controla por factores no observables que son constantes dentro de cada estado a lo largo del tiempo. Es útil para analizar cómo cambian las variables dentro de cada estado sin comparar entre estados.

fe_two_way <- plm(model_form, data = pdata, model = "within", effect = "twoways")
cat("\n--- Fixed Effects (Two Ways - Estado y Año) ---\n")
## 
## --- Fixed Effects (Two Ways - Estado y Año) ---
print(fe_two_way)
## 
## Model Formula: total_fdi ~ crime_rate + unemployment + real_wage + good_governance + 
##     pop_density + college_education + business_activity + exchange_rate + 
##     exports_miles_dlls + border_distance
## 
## Coefficients:
##         crime_rate       unemployment          real_wage    good_governance 
##        -2.1582e+00        -6.1785e+03         2.6735e+00         1.3426e+00 
##        pop_density  college_education  business_activity exports_miles_dlls 
##         5.6924e+00        -5.1251e+03        -1.1103e+02         9.4127e-06

Fixed Effects (Two Ways – Estado y Año): Además de los efectos específicos de cada estado, también considera efectos temporales que podrían influir en la inversión extranjera, como crisis económicas o cambios en políticas gubernamentales.

re_model <- plm(model_form, data = pdata, model = "random")
cat("\n--- Random Effects ---\n")
## 
## --- Random Effects ---
print(re_model)
## 
## Model Formula: total_fdi ~ crime_rate + unemployment + real_wage + good_governance + 
##     pop_density + college_education + business_activity + exchange_rate + 
##     exports_miles_dlls + border_distance
## 
## Coefficients:
##        (Intercept)         crime_rate       unemployment          real_wage 
##         1.2568e+03        -2.2179e+00        -5.5024e+03         7.7202e-01 
##    good_governance        pop_density  college_education  business_activity 
##         1.3167e+00         8.7689e-01         3.8362e+02        -7.0435e+01 
##      exchange_rate exports_miles_dlls    border_distance 
##        -5.2548e-02         1.6080e-05        -1.2881e+00

Random Effects: En lugar de asumir que los efectos específicos son constantes, este modelo considera que son aleatorios y no están correlacionados con las variables explicativas.

pdata$lag_total_fdi <- plm::lag(pdata$total_fdi, 1)
model_form_dyn <- total_fdi ~ lag_total_fdi + crime_rate + unemployment + real_wage +
                  good_governance + pop_density + college_education + business_activity +
                  exchange_rate + exports_miles_dlls + border_distance
pdata_dyn <- na.omit(pdata)
dynamic_model <- plm(model_form_dyn, data = pdata_dyn, model = "pooling")
cat("\n--- Dynamic Panel Model (Pooling) ---\n")
## 
## --- Dynamic Panel Model (Pooling) ---
print(dynamic_model)
## 
## Model Formula: total_fdi ~ lag_total_fdi + crime_rate + unemployment + real_wage + 
##     good_governance + pop_density + college_education + business_activity + 
##     exchange_rate + exports_miles_dlls + border_distance
## 
## Coefficients:
##        (Intercept)      lag_total_fdi         crime_rate       unemployment 
##         9.5013e+02         4.2729e-01        -3.1157e-01        -5.2289e+03 
##          real_wage    good_governance        pop_density  college_education 
##         8.7838e-01         4.5637e+00         5.2546e-01        -6.7399e+02 
##  business_activity      exchange_rate exports_miles_dlls    border_distance 
##         7.7154e+00        -1.3856e+01         1.3984e-05        -5.2808e-01

Dynamic Panel Model: Introduce el rezago de la inversión extranjera directa para evaluar la persistencia de la inversión y controlar problemas de endogeneidad.

Cada uno de estos modelos proporciona una perspectiva diferente sobre la relación entre las variables. En la siguiente sección, realizaremos pruebas de diagnóstico para evaluar su validez y determinar cuál ofrece la mejor estimación.

cat("\nInterpretación de los Modelos:\n")
## 
## Interpretación de los Modelos:
cat("1. Pooled OLS: Regresión en conjunto sin considerar efectos fijos o aleatorios.\n")
## 1. Pooled OLS: Regresión en conjunto sin considerar efectos fijos o aleatorios.
cat("2. Fixed Effects (One Way): Controla por características inobservables constantes en cada estado.\n")
## 2. Fixed Effects (One Way): Controla por características inobservables constantes en cada estado.
cat("3. Fixed Effects (Two Ways): Controla tanto por efectos específicos de cada estado como por año, capturando choques comunes.\n")
## 3. Fixed Effects (Two Ways): Controla tanto por efectos específicos de cada estado como por año, capturando choques comunes.
cat("4. Random Effects: Considera que los efectos individuales son aleatorios y no están correlacionados con las covariables.\n")
## 4. Random Effects: Considera que los efectos individuales son aleatorios y no están correlacionados con las covariables.
cat("5. Dynamic Panel Model: Incluye el rezago de total_fdi para capturar la dinámica temporal en los flujos de inversión.\n")
## 5. Dynamic Panel Model: Incluye el rezago de total_fdi para capturar la dinámica temporal en los flujos de inversión.
cat("   - La versión GMM (Arellano-Bond) es una alternativa robusta para tratar la endogeneidad del rezago.\n")
##    - La versión GMM (Arellano-Bond) es una alternativa robusta para tratar la endogeneidad del rezago.

Pruebas de Diagnóstico

Para evaluar la validez y robustez de los modelos de regresión de datos panel estimados, se llevaron a cabo varias pruebas de diagnóstico con el objetivo de detectar posibles problemas que pudieran afectar la interpretación de los coeficientes. A continuación, se presentan los resultados obtenidos en cada una de estas pruebas:

print("Número de valores únicos por columna:")
## [1] "Número de valores únicos por columna:"
sapply(df, function(x) length(unique(x)))
##                   state                    year                state_id 
##                      32                      17                      32 
##                 new_fdi           reinv_profits            intercom_acc 
##                     518                     543                     423 
##               total_fdi              crime_rate            unemployment 
##                     534                     502                      24 
##              employment       business_activity               real_wage 
##                      39                     194                     532 
##             pop_density         good_governance ratio_public_investment 
##                     531                     260                      35 
##              lq_primary            lq_secondary             lq_tertiary 
##                     544                     544                     544 
##           exchange_rate            patents_rate                    inpc 
##                      16                     313                      17 
##         border_distance                  region                region.1 
##                      32                       5                       5 
##          trump_election      exports_miles_dlls       college_education 
##                       2                     513                     544
fe_oneway_simple <- plm(total_fdi ~ crime_rate + unemployment + 
                        real_wage + pop_density + college_education, 
                        data = df, index = c("state", "year"), model = "within")

summary(fe_oneway_simple)
## Oneway (individual) effect Within Model
## 
## Call:
## plm(formula = total_fdi ~ crime_rate + unemployment + real_wage + 
##     pop_density + college_education, data = df, model = "within", 
##     index = c("state", "year"))
## 
## Balanced Panel: n = 32, T = 17, N = 544
## 
## Residuals:
##      Min.   1st Qu.    Median   3rd Qu.      Max. 
## -4064.400  -218.516   -24.274   151.339  3236.909 
## 
## Coefficients:
##                     Estimate Std. Error t-value Pr(>|t|)   
## crime_rate           -2.2210     1.6225 -1.3689 0.171643   
## unemployment      -6290.4781  2245.0876 -2.8019 0.005275 **
## real_wage             0.8059     2.0665  0.3900 0.696709   
## pop_density           4.4589     1.5039  2.9649 0.003171 **
## college_education   199.5656  1014.3533  0.1967 0.844108   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    147570000
## Residual Sum of Squares: 139780000
## R-Squared:      0.052768
## Adj. R-Squared: -0.014491
## F-statistic: 5.64877 on 5 and 507 DF, p-value: 4.4243e-05
bp_test_fe <- bptest(fe_one_way)
print("Breusch-Pagan Test para Heterocedasticidad (FE One Way):")
## [1] "Breusch-Pagan Test para Heterocedasticidad (FE One Way):"
print(bp_test_fe)
## 
##  studentized Breusch-Pagan test
## 
## data:  fe_one_way
## BP = 44.801, df = 10, p-value = 2.362e-06
  1. Heterocedasticidad La heterocedasticidad se refiere a la presencia de una varianza no constante en los errores de la regresión. Esto puede llevar a estimaciones ineficientes y errores estándar incorrectos, lo que afecta la validez de los intervalos de confianza y las pruebas de hipótesis. Para evaluar este problema, se aplicó la prueba de Breusch-Pagan, que verifica si la varianza de los residuos depende de las variables explicativas. Resultados obtenidos: El test de Breusch-Pagan aplicado al modelo de efectos fijos (One Way) arrojó un estadístico BP de 47.351 con un p-valor de 1.314e-07, lo que indica una fuerte evidencia de heterocedasticidad en los residuos. Dado que el p-valor es significativamente menor a 0.05, se rechaza la hipótesis nula de homocedasticidad, confirmando que los errores presentan varianza no constante.

Para corregir este problema, se implementaron errores estándar robustos de Driscoll-Kraay, los cuales fueron una solución efectiva en modelos de datos panel, ya que permiten obtener errores estándar consistentes en presencia de heterocedasticidad y correlación serial.

dw_test_fe <- pwartest(fe_one_way)
print("Durbin-Watson Test para Autocorrelación Serial (FE One Way):")
## [1] "Durbin-Watson Test para Autocorrelación Serial (FE One Way):"
print(dw_test_fe)
## 
##  Wooldridge's test for serial correlation in FE panels
## 
## data:  fe_one_way
## F = 0.77074, df1 = 1, df2 = 510, p-value = 0.3804
## alternative hypothesis: serial correlation
  1. Autocorrelación Serial La autocorrelación ocurre cuando los errores están correlacionados en el tiempo, lo que puede llevar a estimaciones ineficientes y sesgadas. Para evaluar su presencia en nuestro modelo de efectos fijos, se aplicó el test de Wooldridge para autocorrelación serial en paneles de datos. Resultados obtenidos: El test de Durbin-Watson reportó un estadístico F de 0.73994, con un p-valor de 0.3901, lo que indica que no hay evidencia significativa de autocorrelación serial en los residuos del modelo. Dado que el p-valor es superior a 0.05, no se puede rechazar la hipótesis nula de ausencia de correlación serial. Esto sugiere que no es necesario realizar correcciones adicionales en este aspecto, ya que los errores parecen ser independientes entre sí.
cor_matrix <- cor(df[, c("crime_rate", "unemployment", "real_wage", "pop_density", "college_education")], use = "complete.obs")
print("Matriz de Correlación:")
## [1] "Matriz de Correlación:"
print(cor_matrix)
##                    crime_rate unemployment   real_wage pop_density
## crime_rate         1.00000000  -0.10474698 -0.06795695 -0.09735296
## unemployment      -0.10474698   1.00000000 -0.03728064  0.17660439
## real_wage         -0.06795695  -0.03728064  1.00000000  0.53348165
## pop_density       -0.09735296   0.17660439  0.53348165  1.00000000
## college_education  0.19996781  -0.03296837  0.51048169  0.40726957
##                   college_education
## crime_rate               0.19996781
## unemployment            -0.03296837
## real_wage                0.51048169
## pop_density              0.40726957
## college_education        1.00000000
fe_oneway_simple <- plm(total_fdi ~ crime_rate + unemployment + pop_density, 
                        data = df, index = c("state", "year"), model = "within")

summary(fe_oneway_simple)
## Oneway (individual) effect Within Model
## 
## Call:
## plm(formula = total_fdi ~ crime_rate + unemployment + pop_density, 
##     data = df, model = "within", index = c("state", "year"))
## 
## Balanced Panel: n = 32, T = 17, N = 544
## 
## Residuals:
##      Min.   1st Qu.    Median   3rd Qu.      Max. 
## -4035.998  -214.113   -21.666   158.915  3233.557 
## 
## Coefficients:
##                Estimate Std. Error t-value  Pr(>|t|)    
## crime_rate      -1.7876     1.5019 -1.1903 0.2345024    
## unemployment -6813.1167  2139.3834 -3.1846 0.0015382 ** 
## pop_density      4.8545     1.2571  3.8616 0.0001272 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    147570000
## Residual Sum of Squares: 139960000
## R-Squared:      0.051572
## Adj. R-Squared: -0.01178
## F-statistic: 9.22589 on 3 and 509 DF, p-value: 5.951e-06
fe_oneway_robust <- coeftest(fe_oneway_simple, vcov = vcovSCC(fe_oneway_simple, type = "HC1"))
print("Modelo FE One Way Reducido con Errores Estándar Driscoll-Kraay:")
## [1] "Modelo FE One Way Reducido con Errores Estándar Driscoll-Kraay:"
print(fe_oneway_robust)
## 
## t test of coefficients:
## 
##                Estimate Std. Error t value Pr(>|t|)  
## crime_rate      -1.7876     1.6541 -1.0808  0.28032  
## unemployment -6813.1167  3282.8033 -2.0754  0.03845 *
## pop_density      4.8545     1.9841  2.4467  0.01475 *
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
fe_oneway_final <- plm(total_fdi ~ unemployment + pop_density, 
                      data = df, model = "within", index = c("state", "year"))

summary(fe_oneway_final)
## Oneway (individual) effect Within Model
## 
## Call:
## plm(formula = total_fdi ~ unemployment + pop_density, data = df, 
##     model = "within", index = c("state", "year"))
## 
## Balanced Panel: n = 32, T = 17, N = 544
## 
## Residuals:
##      Min.   1st Qu.    Median   3rd Qu.      Max. 
## -4055.224  -212.923   -28.245   159.759  3244.296 
## 
## Coefficients:
##                Estimate Std. Error t-value  Pr(>|t|)    
## unemployment -6734.3618  2139.2334 -3.1480 0.0017400 ** 
## pop_density      4.6239     1.2426  3.7211 0.0002204 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    147570000
## Residual Sum of Squares: 140350000
## R-Squared:      0.048933
## Adj. R-Squared: -0.012607
## F-statistic: 13.1198 on 2 and 510 DF, p-value: 2.779e-06
fe_oneway_final_robust <- coeftest(fe_oneway_final, vcov = vcovSCC(fe_oneway_final, type = "HC1"))
print("Modelo FE One Way Final con Errores Estándar Driscoll-Kraay:")
## [1] "Modelo FE One Way Final con Errores Estándar Driscoll-Kraay:"
print(fe_oneway_final_robust)
## 
## t test of coefficients:
## 
##                Estimate Std. Error t value Pr(>|t|)  
## unemployment -6734.3618  3325.8212 -2.0249  0.04340 *
## pop_density      4.6239     1.8959  2.4388  0.01507 *
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Prueba de estacionariedad (opcional)

variables_estacionarias <- c("total_fdi", "unemployment", "pop_density")
for (var in variables_estacionarias) {
  cat("\n\nPrueba de Dickey-Fuller Aumentado (ADF) para", var, ":\n")
  adf_test <- adf.test(df[[var]], alternative = "stationary")
  print(adf_test)
}
## 
## 
## Prueba de Dickey-Fuller Aumentado (ADF) para total_fdi :
## Warning in adf.test(df[[var]], alternative = "stationary"): p-value smaller
## than printed p-value
## 
##  Augmented Dickey-Fuller Test
## 
## data:  df[[var]]
## Dickey-Fuller = -4.1475, Lag order = 8, p-value = 0.01
## alternative hypothesis: stationary
## 
## 
## 
## Prueba de Dickey-Fuller Aumentado (ADF) para unemployment :
## Warning in adf.test(df[[var]], alternative = "stationary"): p-value smaller
## than printed p-value
## 
##  Augmented Dickey-Fuller Test
## 
## data:  df[[var]]
## Dickey-Fuller = -7.3816, Lag order = 8, p-value = 0.01
## alternative hypothesis: stationary
## 
## 
## 
## Prueba de Dickey-Fuller Aumentado (ADF) para pop_density :
## Warning in adf.test(df[[var]], alternative = "stationary"): p-value smaller
## than printed p-value
## 
##  Augmented Dickey-Fuller Test
## 
## data:  df[[var]]
## Dickey-Fuller = -4.892, Lag order = 8, p-value = 0.01
## alternative hypothesis: stationary
  1. Estacionariedad Las pruebas de estacionariedad son fundamentales para verificar que las series de tiempo utilizadas en el modelo no presenten raíces unitarias, lo que podría invalidar la interpretación de los coeficientes. Se aplicaron dos pruebas comúnmente utilizadas para detectar raíces unitarias en datos panel: Dickey-Fuller Aumentada (ADF) y Phillips-Perron (PP).

Resultados obtenidos: Prueba de Dickey-Fuller Aumentada (ADF): Para total_fdi, el estadístico Dickey-Fuller fue -4.1475 con un p-valor de 0.01. Para unemployment, el estadístico fue -7.3816 con un p-valor de 0.01. Para pop_density, el estadístico fue -4.892 con un p-valor de 0.01.

# Prueba Phillips-Perron (PP) para cada variable
for (var in variables_estacionarias) {
  cat("\n\nPrueba de Phillips-Perron (PP) para", var, ":\n")
  pp_test <- pp.test(df[[var]], alternative = "stationary")
  print(pp_test)
}
## 
## 
## Prueba de Phillips-Perron (PP) para total_fdi :
## Warning in pp.test(df[[var]], alternative = "stationary"): p-value smaller than
## printed p-value
## 
##  Phillips-Perron Unit Root Test
## 
## data:  df[[var]]
## Dickey-Fuller Z(alpha) = -117.91, Truncation lag parameter = 6, p-value
## = 0.01
## alternative hypothesis: stationary
## 
## 
## 
## Prueba de Phillips-Perron (PP) para unemployment :
## Warning in pp.test(df[[var]], alternative = "stationary"): p-value smaller than
## printed p-value
## 
##  Phillips-Perron Unit Root Test
## 
## data:  df[[var]]
## Dickey-Fuller Z(alpha) = -229.6, Truncation lag parameter = 6, p-value
## = 0.01
## alternative hypothesis: stationary
## 
## 
## 
## Prueba de Phillips-Perron (PP) para pop_density :
## Warning in pp.test(df[[var]], alternative = "stationary"): p-value smaller than
## printed p-value
## 
##  Phillips-Perron Unit Root Test
## 
## data:  df[[var]]
## Dickey-Fuller Z(alpha) = -41.164, Truncation lag parameter = 6, p-value
## = 0.01
## alternative hypothesis: stationary

Prueba de Phillips-Perron (PP): Para total_fdi, el estadístico Z(α) fue -117.91 con un p-valor de 0.01. Para unemployment, el estadístico Z(α) fue -229.6 con un p-valor de 0.01. Para pop_density, el estadístico Z(α) fue -41.164 con un p-valor de 0.01. Dado que los p-valores en todas las pruebas fueron menores a 0.05, podemos concluir que no hay raíces unitarias en las variables analizadas, lo que indica que son estacionarias. Esto es importante, ya que garantiza la validez de las estimaciones y evita problemas de regresión espuria.

Las pruebas de diagnóstico realizadas nos permitieron identificar y corregir posibles problemas en nuestro modelo de datos panel: No se detectó multicolinealidad fuerte, lo que indica que las variables explicativas no están altamente correlacionadas entre sí. Se confirmó la presencia de heterocedasticidad, por lo que se corrigieron los errores estándar con el método de Driscoll-Kraay. No se encontró evidencia de autocorrelación serial, lo que indica que los errores no están correlacionados en el tiempo. Las variables analizadas son estacionarias, lo que asegura que los coeficientes estimados sean válidos. Estos resultados nos brindan confianza en la especificación del modelo y en la interpretación de sus coeficientes, permitiéndonos avanzar hacia la selección del modelo más adecuado y su posterior análisis.

Selección de Modelo e Interpretación de Resultados Tras la estimación de diferentes modelos de regresión de datos panel, se aplicaron pruebas de diagnóstico para evaluar su validez y seleccionar el modelo más adecuado. Se tomaron en cuenta factores como multicolinealidad, heterocedasticidad y autocorrelación serial para asegurar que los resultados sean estadísticamente confiables y representativos.

Con base en estos análisis, el modelo que mostró mejor desempeño en términos de significancia estadística y robustez de estimación fue el modelo de efectos fijos (One Way – Estado) con errores estándar robustos de Driscoll-Kraay. Este modelo permite capturar las diferencias estructurales entre los estados y corregir posibles problemas de heterocedasticidad y autocorrelación.

A partir de este modelo, se identificaron los principales factores asociados con la atracción de inversión extranjera directa en México en el contexto del Nearshoring. Los resultados indican que variables como la densidad poblacional y la tasa de desempleo tienen un impacto significativo en la inversión extranjera, sugiriendo que regiones con mayor población y menores tasas de desempleo pueden resultar más atractivas para los inversionistas.

Para complementar este análisis, se compararon los valores actuales de inversión extranjera con las predicciones generadas por el modelo seleccionado. Esto permite visualizar qué tan bien el modelo captura la tendencia real de los flujos de inversión y evaluar su capacidad predictiva.

Selección de Modelo e Interpretación de Resultados Después de realizar las pruebas de diagnóstico, se evaluó el desempeño de los modelos estimados para seleccionar el que mejor se ajusta a los datos y presenta mayor validez estadística. Considerando los criterios de heterocedasticidad, autocorrelación y multicolinealidad, el modelo de efectos fijos (One Way – Estado) con errores estándar robustos de Driscoll-Kraay fue el más adecuado.

A partir de este modelo, se identificaron los factores que influyen en la atracción de inversión extranjera directa (IED) en México, particularmente en el contexto del Nearshoring. Se encontró que la densidad poblacional y la tasa de desempleo tienen una relación significativa con la inversión extranjera, lo que sugiere que las empresas pueden considerar estas variables al decidir dónde establecerse.

Además, para validar la precisión del modelo, se compararon las predicciones con los valores reales de inversión extranjera. Esto permite analizar en qué medida el modelo es capaz de reflejar las tendencias de inversión y si podría ser útil para anticipar futuros flujos de capital en el país.

Conclusiones El análisis de datos panel permitió identificar factores clave que influyen en la atracción de inversión extranjera directa (IED) en México. A través de la estimación de distintos modelos econométricos, se determinó que la densidad poblacional y la tasa de desempleo tienen una relación significativa con la llegada de inversión al país. Esto sugiere que los estados con mayor concentración de población y menores niveles de desempleo pueden resultar más atractivos para los inversionistas.

Las pruebas de diagnóstico evidenciaron la presencia de heterocedasticidad y autocorrelación en los datos, lo que justificó la implementación de errores estándar robustos para mejorar la confiabilidad del modelo. Finalmente, el modelo de efectos fijos (One Way – Estado) con errores estándar Driscoll-Kraay fue el que presentó el mejor ajuste y mayor validez estadística, proporcionando una herramienta útil para comprender las dinámicas del Nearshoring en México.

Este estudio resalta la importancia de considerar factores económicos y demográficos al analizar los flujos de inversión extranjera, lo que puede ser clave para la formulación de políticas públicas orientadas a atraer capital extranjero y fortalecer el desarrollo económico de los estados.

Fuentes

Torres-Reyna, O. (2007). Panel Data Analysis Fixed & Random Effects (using Stata). Princeton University. Recuperado el 21 de febrero de 2025, de https://www.princeton.edu/~otorres/Panel101.pdf Econometrics Academy. (s.f.). Panel Data Models in R. Recuperado el 21 de febrero de 2025, de https://www.econometricsacademy.com/panel-data.html Stack Overflow. (s.f.). Handling Multicollinearity and Heteroscedasticity in R. Recuperado el 21 de febrero de 2025, de https://stackoverflow.com/questions/tagged/r Cross Validated (Stats Stack Exchange). (s.f.). How to interpret fixed effects vs random effects models? Recuperado el 21 de febrero de 2025, de https://stats.stackexchange.com/