La multicolinealidad ocurre cuando las variables explicativas están altamente correlacionadas entre sí, lo que hace inestables las estimaciones de los coeficientes.
set.seed(123)
X1 <- 1:100
X2 <- 2*X1 + rnorm(100, 0, 1)
Y <- 5 + 3*X1 + rnorm(100, 0, 10)
modelo1 <- lm(Y ~ X1 + X2)
summary(modelo1)
##
## Call:
## lm(formula = Y ~ X1 + X2)
##
## Residuals:
## Min 1Q Median 3Q Max
## -18.491 -6.869 -0.948 6.015 32.357
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 2.2850 1.9566 1.168 0.2457
## X1 4.2532 2.1475 1.981 0.0505 .
## X2 -0.6098 1.0723 -0.569 0.5708
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 9.708 on 97 degrees of freedom
## Multiple R-squared: 0.9882, Adjusted R-squared: 0.988
## F-statistic: 4064 on 2 and 97 DF, p-value: < 2.2e-16
vif(modelo1)
## X1 X2
## 4077.605 4077.605
Cuando el VIF es mayor que 10, hay evidencia fuerte de multicolinealidad. En este caso, X1 y X2 están casi perfectamente correlacionadas.
Solución: eliminar una variable o usar ACP.
modelo1_fix <- lm(Y ~ X1)
summary(modelo1_fix)
##
## Call:
## lm(formula = Y ~ X1)
##
## Residuals:
## Min 1Q Median 3Q Max
## -18.961 -6.688 -0.774 5.608 33.054
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 2.30720 1.94942 1.184 0.239
## X1 3.03203 0.03351 90.471 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 9.674 on 98 degrees of freedom
## Multiple R-squared: 0.9882, Adjusted R-squared: 0.988
## F-statistic: 8185 on 1 and 98 DF, p-value: < 2.2e-16
La heterocedasticidad significa que la varianza de los errores no es constante. Esto hace que los errores estándar sean incorrectos y las pruebas t no sean válidas.
X <- 1:100
u <- rnorm(100, mean=0, sd=X/5)
Y <- 2 + 3*X + u
modelo2 <- lm(Y ~ X)
plot(modelo2$fitted.values, resid(modelo2),
main="Heterocedasticidad: varianza creciente",
xlab="Valores ajustados", ylab="Residuos")
abline(h=0, col="red")
bptest(modelo2)
##
## studentized Breusch-Pagan test
##
## data: modelo2
## BP = 20.595, df = 1, p-value = 5.674e-06
Transformar variables (por ejemplo, logaritmos)
Usar errores estándar robustos
modelo2_log <- lm(log(Y) ~ log(X))
summary(modelo2_log)
##
## Call:
## lm(formula = log(Y) ~ log(X))
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.12489 -0.05732 -0.00271 0.03748 0.36544
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1.328298 0.031592 42.05 <2e-16 ***
## log(X) 0.947082 0.008418 112.50 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.07773 on 98 degrees of freedom
## Multiple R-squared: 0.9923, Adjusted R-squared: 0.9922
## F-statistic: 1.266e+04 on 1 and 98 DF, p-value: < 2.2e-16
coeftest(modelo2, vcov = vcovHC(modelo2, type = "HC1"))
##
## t test of coefficients:
##
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -0.897825 1.505179 -0.5965 0.5522
## X 3.094198 0.043321 71.4256 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
La autocorrelación ocurre cuando los errores están correlacionados entre sí, algo común en series temporales.
set.seed(123)
n <- 100
X <- 1:n
u <- arima.sim(n = n, list(ar = 0.8))
Y <- 5 + 0.5*X + u
modelo3 <- lm(Y ~ X)
dwtest(modelo3)
##
## Durbin-Watson test
##
## data: modelo3
## DW = 0.45546, p-value = 1.324e-15
## alternative hypothesis: true autocorrelation is greater than 0
plot(resid(modelo3), type="l",
main="Autocorrelación: residuos correlacionados",
ylab="Residuos", xlab="Tiempo")
Cuando la relación entre X y Y no es lineal, el modelo lineal genera residuos con patrón curvo.
X <- 1:100
Y <- 2 + 0.5*X^2 + rnorm(100, 0, 30)
modelo4 <- lm(Y ~ X)
ggplot(data.frame(X, Y), aes(X, Y)) +
geom_point() +
geom_smooth(method="lm", se=FALSE, col="red") +
ggtitle("No linealidad: relación cuadrática mal especificada")
plot(resid(modelo4), main="Residuos con patrón curvo", ylab="Residuos")
modelo4_fix <- lm(Y ~ X + I(X^2))
summary(modelo4_fix)
##
## Call:
## lm(formula = Y ~ X + I(X^2))
##
## Residuals:
## Min 1Q Median 3Q Max
## -56.037 -19.253 -5.385 20.221 95.829
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -6.193425 9.319165 -0.665 0.508
## X 0.402664 0.425911 0.945 0.347
## I(X^2) 0.496219 0.004086 121.456 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 30.44 on 97 degrees of freedom
## Multiple R-squared: 0.9996, Adjusted R-squared: 0.9996
## F-statistic: 1.221e+05 on 2 and 97 DF, p-value: < 2.2e-16
Agregar términos polinómicos o transformaciones de las variables.
Un solo punto extremo puede alterar toda la pendiente de la regresión.
set.seed(123)
X <- 1:30
Y <- 2 + 3*X + rnorm(30, 0, 10)
Y[30] <- 200 # outlier extremo
modelo5 <- lm(Y ~ X)
plot(X, Y, main="Outlier extremo", pch=19)
abline(modelo5, col="red")
influencePlot(modelo5)
## StudRes Hat CookD
## 1 -0.1399481 0.12688172 0.00147472
## 26 -1.1086773 0.08238784 0.05473237
## 30 11.4865697 0.12688172 1.68887692
Revisar si el outlier es un error de medición o usar regresión robusta.
options(encoding = "UTF-8")
##install.packages("flextable")
library(flextable)
df <- data.frame(
Problema = c("Multicolinealidad", "Heterocedasticidad", "Autocorrelacion", "No linealidad", "Outliers"),
Descripcion = c(
"Variables explicativas altamente correlacionadas.",
"Varianza no constante del error.",
"Errores correlacionados entre sí.",
"Relación no lineal entre variables.",
"Observaciones extremas distorsionan los resultados."
),
Solucion = c(
"Usar ACP o eliminar variables redundantes.",
"Errores robustos o transformación logarítmica.",
"Modelos ARIMA o inclusión de rezagos.",
"Modelos no lineales o polinomiales.",
"Revisión y tratamiento de valores extremos."
)
)
flextable::flextable(df)
Problema | Descripcion | Solucion |
|---|---|---|
Multicolinealidad | Variables explicativas altamente correlacionadas. | Usar ACP o eliminar variables redundantes. |
Heterocedasticidad | Varianza no constante del error. | Errores robustos o transformación logarítmica. |
Autocorrelacion | Errores correlacionados entre sí. | Modelos ARIMA o inclusión de rezagos. |
No linealidad | Relación no lineal entre variables. | Modelos no lineales o polinomiales. |
Outliers | Observaciones extremas distorsionan los resultados. | Revisión y tratamiento de valores extremos. |
Aprender de los errores econométricos
En la práctica económica, los problemas de una regresión no son simples fallas estadísticas: representan señales que nos advierten sobre la naturaleza compleja de los fenómenos económicos.
Multicolinealidad nos recuerda que las variables económicas están profundamente interrelacionadas. Precios, ingresos y consumo rara vez se mueven por separado. El desafío del economista está en discernir cuál variable impulsa el cambio y cuál solo lo acompaña.
Heterocedasticidad refleja que la volatilidad o la incertidumbre no son constantes. Los mercados y los agentes reaccionan de forma distinta según el tamaño de los shocks o el nivel de ingreso.
Autocorrelación enseña que el tiempo importa. Los errores de hoy suelen ser herencia del pasado: las decisiones económicas no se desvanecen de inmediato, sino que dejan huellas que deben modelarse.
No linealidad invita a aceptar que la economía no siempre responde de forma proporcional. Pequeños cambios pueden tener grandes impactos, y entender esa curvatura mejora nuestras predicciones.
Outliers representan los choques, crisis o eventos atípicos que desafían la normalidad. Lejos de ignorarlos, comprenderlos permite anticipar riesgos y fortalecer la resiliencia de los modelos.
En síntesis, cada error econométrico encierra una lección sobre la realidad. La econometría no busca eliminar la incertidumbre, sino aprender de ella, construir modelos más sólidos y, sobre todo, fortalecer la capacidad del analista para pensar críticamente los datos.
Autor: Econ. FRIDNO MARC RStudio — 2025