Si tenemos un modelo de regresión:
\[\hat{Y} = b_0 + b_1X_1 + b_2X_2 + b_3X_3...+ b_kX_k\]
Se dice que hay multicolinealidad cuando cuando las variables independientes (\(X_k\)) del modelo de regresión están demasiado correlacionadas entre sí.
Ello puede afectar la capacidad del modelo de medir adecuadamente el efecto de una variable independiente en particular en la variable dependiente. La multicolinealidad afecta los coeficientes \(b_i\) del modelo de regresión multiple, alternando su significancia estadística.
Es un problema que no viola los supuestos de regresión, pero sí perjudica nuestra capacidad de hacer inferencia estadística con los resultados de un modelo de regresión múltiple.
La multicolinealidad puede surgir de diferentes causas:
A veces no podemos evitar que un modelo de regresión, teóricamente bien fundamentado, presente problemas de multicolinealidad que afectan nuestra capacidad de hacer inferencias estadísticas. No existen soluciones “automáticas” o únicas al fenómeno de la multicolinealidad.
Hay técnicas y herramientas que nos permiten detectar y diagnosticar la multicolinealidad y estrategias para adoptar soluciones.
Para realizar un diagnóstico de multicolinealidad vamos a tomar un ejemplo. Usaremos los datop de la base de datos “dataWorld_q” para el quinquenio 2000-2004.
En esta y las siguientes diapositivas veremos las relaciones bivariables entre cada variable independiente y la variable dependiente
##
## Correlaciones con chidlMort
## =====================================================
## water -0.890
## sanitat -0.890
## vaccMeas -0.770
## teenFert 0.800
## yearSchF -0.820
## log10_incomePp -0.810
## income10p 0.270
## gini 0.250
## -----------------------------------------------------
## Todos los coeficientes son significativos a p < 0.01
##
## =======================================================================================
## Dependent variable:
## --------------------------------------------------------------------------
## childMort
## m1 m2 m3 m4
## ---------------------------------------------------------------------------------------
## water -2.191*** (0.091)
## sanitat -1.451*** (0.064)
## vaccMeas -2.378*** (0.148)
## teenFert 0.863*** (0.050)
## Constant 231.016*** (7.657) 152.348*** (4.815) 248.718*** (12.485) 1.454 (3.848)
## ---------------------------------------------------------------------------------------
## Observations 187 187 191 190
## R2 0.756 0.735 0.576 0.611
## Adjusted R2 0.755 0.734 0.574 0.609
## =======================================================================================
## Note: *p<0.05; **p<0.01; ***p<0.001
##
## ======================================================================================
## Dependent variable:
## ----------------------------------------------------------------------
## childMort
## m5 m6 m7 m8
## --------------------------------------------------------------------------------------
## yearSchF -12.386*** (0.670)
## log10(incomePp) -76.586*** (4.440)
## income10p 1.762** (0.609)
## gini 1.588** (0.560)
## Constant 155.171*** (5.904) 347.736*** (17.256) 2.143 (19.709) -6.273 (23.109)
## --------------------------------------------------------------------------------------
## Observations 174 193 116 114
## R2 0.665 0.609 0.068 0.067
## Adjusted R2 0.663 0.607 0.060 0.059
## ======================================================================================
## Note: *p<0.05; **p<0.01; ***p<0.001
La multicolinealidad afecta los coeficientes de regresión \(b_i\) así como sus respectivos errores estándar \(\sigma_{b_i}\).
Un “síntoma” de multicolinealidad es el cambio de magnitud importante en los valores de los coeficientes, así como el incremento de sus respectivos errores estándar, conforme de añaden más variables independientes al modelo de regresión.
Una estrategia para detectar ese “síntoma” es ir construyendo un modelo múltiple paso a paso, para identificar si existe(n) alguna(s) variable(s) “perturbadora(s)” de los efectos de otra u otras variables independientes, observando los cambios en los coeficientes \(b_i\) y los errores estándar.
##
## ========================================================================
## Dependent variable:
## -----------------------------------------------------------
## childMort
## m9 m10 m11
## ------------------------------------------------------------------------
## water -1.136*** (0.159) -1.044*** (0.152) -0.931*** (0.158)
## sanitat -0.553*** (0.111) -0.345** (0.114) -0.160 (0.126)
## vaccMeas -0.616*** (0.151) -0.536*** (0.144) -0.517*** (0.151)
## teenFert 0.252*** (0.052) 0.258*** (0.053)
## yearSchF -2.729** (0.869)
## Constant 233.721*** (10.195) 190.320*** (13.231) 188.871*** (13.370)
## ------------------------------------------------------------------------
## Observations 184 182 168
## R2 0.820 0.840 0.850
## Adjusted R2 0.817 0.836 0.845
## ========================================================================
## Note: *p<0.05; **p<0.01; ***p<0.001
##
## ===========================================================================
## Dependent variable:
## -----------------------------------------------------------
## childMort
## m11 m12 m13
## ---------------------------------------------------------------------------
## water -0.931*** (0.158) -0.834*** (0.163) -0.975*** (0.217)
## sanitat -0.160 (0.126) -0.068 (0.132) -0.316 (0.173)
## vaccMeas -0.517*** (0.151) -0.551*** (0.150) -0.479* (0.190)
## teenFert 0.258*** (0.053) 0.251*** (0.053) 0.195* (0.076)
## yearSchF -2.729** (0.869) -2.497** (0.867) -2.301* (1.114)
## log10(incomePp) -11.793* (5.614) -7.475 (7.348)
## income10p 0.417 (1.551)
## gini -0.705 (1.246)
## Constant 188.871*** (13.370) 221.457*** (20.389) 246.733*** (26.378)
## ---------------------------------------------------------------------------
## Observations 168 168 110
## R2 0.850 0.854 0.883
## Adjusted R2 0.845 0.849 0.874
## ===========================================================================
## Note: *p<0.05; **p<0.01; ***p<0.001
Se observa en los diferentes modelos cómo, al agregar algunas variables, la significancia de otras disminuye, a pesar de que se incrementa el \(R^2\). Tal es el caso de la variable sanitat cuando se pasa del modelo 2 al modelo 9, y de éste último al modelo 11.
Algo similar ocurre con la variable log10(incomePp) entre el modelo 12 y 13. Es probable que las variables que se hayan añadido entre un modelo y otro tengan problemas de multicolinealidad con las variables de modelos precedentes.
Hay dos maneras de identificar los problemas de multicolinealidad. Una primera es observar la matriz de correlaciones entre las variables independientes:
## water sanitat vaccMeas teenFert yearSchF log10_incomePp
## water 1
## sanitat 0.87 1
## vaccMeas 0.71 0.74 1
## teenFert -0.77 -0.81 -0.62 1
## yearSchF 0.75 0.86 0.68 -0.73 1
## log10_incomePp 0.81 0.81 0.59 -0.71 0.78 1
## income10p -0.25 -0.37 -0.08 0.49 -0.36 -0.29
## gini -0.24 -0.35 -0.06 0.5 -0.34 -0.27
## income10p gini
## water
## sanitat
## vaccMeas
## teenFert
## yearSchF
## log10_incomePp
## income10p 1
## gini 0.98 1
La otra forma es calcular el factor de inflación de la varianza nos indica el grado en que cada variable independiente se explica por otras variable independientes. Es como realizar una regresión de cada variable independiente respecto de las demás variables independientes.
\[VIF_k = \frac{1}{1-R^2{_k}}\] Donde \(R^2{_k}\) es el \(R^2\) que se obtiene al hacer una regresión del la \(k_{esima}\) variable independiente con las demás variables independientes.
Altos valores de inflación de la varianza (VIF) indican que la variable \(X_k\) en cuestión tiene problemas de multicolinealidad con las otras variables del modelo. Como criterio para decidir qué tán seria es esa multicolinealidad, se puede tomar en cuenta los siguientes parámetros:
##
## ========================================================================
## Dependent variable:
## -----------------------------------------------------------
## childMort
## m9 m10 m11
## ------------------------------------------------------------------------
## water -1.136*** (0.159) -1.044*** (0.152) -0.931*** (0.158)
## sanitat -0.553*** (0.111) -0.345** (0.114) -0.160 (0.126)
## vaccMeas -0.616*** (0.151) -0.536*** (0.144) -0.517*** (0.151)
## teenFert 0.252*** (0.052) 0.258*** (0.053)
## yearSchF -2.729** (0.869)
## Constant 233.721*** (10.195) 190.320*** (13.231) 188.871*** (13.370)
## ------------------------------------------------------------------------
## Observations 184 182 168
## R2 0.820 0.840 0.850
## Adjusted R2 0.817 0.836 0.845
## ========================================================================
## Note: *p<0.05; **p<0.01; ***p<0.001
##
## ===========================================================================
## Dependent variable:
## -----------------------------------------------------------
## childMort
## m11 m12 m13
## ---------------------------------------------------------------------------
## water -0.931*** (0.158) -0.834*** (0.163) -0.975*** (0.217)
## sanitat -0.160 (0.126) -0.068 (0.132) -0.316 (0.173)
## vaccMeas -0.517*** (0.151) -0.551*** (0.150) -0.479* (0.190)
## teenFert 0.258*** (0.053) 0.251*** (0.053) 0.195* (0.076)
## yearSchF -2.729** (0.869) -2.497** (0.867) -2.301* (1.114)
## log10(incomePp) -11.793* (5.614) -7.475 (7.348)
## income10p 0.417 (1.551)
## gini -0.705 (1.246)
## Constant 188.871*** (13.370) 221.457*** (20.389) 246.733*** (26.378)
## ---------------------------------------------------------------------------
## Observations 168 168 110
## R2 0.850 0.854 0.883
## Adjusted R2 0.845 0.849 0.874
## ===========================================================================
## Note: *p<0.05; **p<0.01; ***p<0.001
vif(m9)
## water sanitat vaccMeas
## 3.962322 4.294562 2.324326
vif(m10)
## water sanitat vaccMeas teenFert
## 4.030734 4.992099 2.350271 2.438130
vif(m11)
## water sanitat vaccMeas teenFert yearSchF
## 4.193348 5.894776 2.466252 2.466372 3.482694
vif(m12)
## water sanitat vaccMeas teenFert yearSchF
## 4.552152 6.635189 2.496138 2.476139 3.539971
## log10(incomePp)
## 3.437532
vif(m13)
## water sanitat vaccMeas teenFert yearSchF
## 5.343473 7.891595 2.731834 4.105153 4.430373
## log10(incomePp) income10p gini
## 3.854068 35.266611 35.749551
##
## =======================================================
## Dependent variable:
## ---------------------------------------
## childMort
## m13 m14
## -------------------------------------------------------
## water -0.975*** (0.217) -0.859*** (0.153)
## sanitat -0.316 (0.173)
## vaccMeas -0.479* (0.190) -0.568*** (0.144)
## teenFert 0.195* (0.076) 0.258*** (0.051)
## yearSchF -2.301* (1.114) -2.619** (0.814)
## log10(incomePp) -7.475 (7.348) -12.904* (5.236)
## income10p 0.417 (1.551)
## gini -0.705 (1.246)
## Constant 246.733*** (26.378) 224.999*** (19.046)
## -------------------------------------------------------
## Observations 110 170
## R2 0.883 0.855
## Adjusted R2 0.874 0.850
## =======================================================
## Note: *p<0.05; **p<0.01; ***p<0.001
vif(m14)
## water vaccMeas teenFert yearSchF log10(incomePp)
## 4.124617 2.336508 2.325972 3.204590 3.074129
# Carga de datos y paquetes
load(url("https://www.dropbox.com/s/fyobx9uswy3qgp3/dataWorld_q.rda?dl=1"))
library(stargazer)
# Correlaciónes con variable dependiente
data00_04 <- dataWorld_q[dataWorld_q$quinq == "2000-2004",]
data00_04$log10_incomePp <- log10(data00_04$incomePp)
misvars <- c("childMort", "water", "sanitat", "vaccMeas", "teenFert", "yearSchF", "log10_incomePp",
"income10p", "gini")
data00_04 <- data00_04[misvars]
mat1 <- round(cor(data00_04, use = "complete.obs"),2)
stargazer(mat1[1, -1], type = "text", flip = TRUE,
notes = c("Todos los coeficientes son significativos a p < 0.01"),
title = "Correlaciones con chidlMort")
# Modelos de regresión simple
m1 <- lm(childMort ~ water, data = dataWorld_q[dataWorld_q$quinq == "2000-2004",])
m2 <- lm(childMort ~ sanitat, data = dataWorld_q[dataWorld_q$quinq == "2000-2004",])
m3 <- lm(childMort ~ vaccMeas, data = dataWorld_q[dataWorld_q$quinq == "2000-2004",])
m4 <- lm(childMort ~ teenFert, data = dataWorld_q[dataWorld_q$quinq == "2000-2004",])
m5 <- lm(childMort ~ yearSchF, data = dataWorld_q[dataWorld_q$quinq == "2000-2004",])
m6 <- lm(childMort ~ log10(incomePp), data = dataWorld_q[dataWorld_q$quinq == "2000-2004",])
m7 <- lm(childMort ~ income10p, data = dataWorld_q[dataWorld_q$quinq == "2000-2004",])
m8 <- lm(childMort ~ gini, data = dataWorld_q[dataWorld_q$quinq == "2000-2004",])
stargazer(m1, m2, m3, m4, type = "text", single.row = TRUE,
model.numbers = FALSE, object.names = TRUE,
omit.stat=c("ser","f"),
star.cutoffs = c(0.05, 0.01, 0.001))
stargazer(m5, m6, m7, m8, type = "text", single.row = TRUE,
model.numbers = FALSE, object.names = TRUE,
omit.stat=c("ser","f"),
star.cutoffs = c(0.05, 0.01, 0.001))
# Modelos de regresión múltiple
m9 <- lm(childMort ~ water + sanitat + vaccMeas,
data = dataWorld_q[dataWorld_q$quinq == "2000-2004",])
m10 <- lm(childMort ~ water + sanitat + vaccMeas + teenFert,
data = dataWorld_q[dataWorld_q$quinq == "2000-2004",])
m11 <- lm(childMort ~ water + sanitat + vaccMeas + teenFert + yearSchF,
data = dataWorld_q[dataWorld_q$quinq == "2000-2004",])
stargazer(m9, m10, m11, type = "text", single.row = TRUE,
model.numbers = FALSE, object.names = TRUE,
omit.stat=c("ser","f"),
star.cutoffs = c(0.05, 0.01, 0.001))
m12 <- lm(childMort ~ water + sanitat + vaccMeas + teenFert + yearSchF + log10(incomePp),
data = dataWorld_q[dataWorld_q$quinq == "2000-2004",])
m13 <- lm(childMort ~ water + sanitat + vaccMeas + teenFert + yearSchF + log10(incomePp) +
income10p + gini,
data = dataWorld_q[dataWorld_q$quinq == "2000-2004",])
stargazer(m11, m12, m13, type = "text", single.row = TRUE,
model.numbers = FALSE, object.names = TRUE,
omit.stat=c("ser","f"),
star.cutoffs = c(0.05, 0.01, 0.001))
# Matriz de correlaciones
mat1.2 <-mat1[-1, -1]
upper <- mat1.2
upper[upper.tri(mat1.2)]<-""
upper<-as.data.frame(upper)
upper
# Cálculo de VIF
library(car) # Paquete que contiene la función VIF
vif(m9)
vif(m10)
vif(m11)
vif(m12)
vif(m13)
# Modelo final
m14 <- lm(childMort ~ water + + vaccMeas + teenFert + yearSchF + log10(incomePp),
data = dataWorld_q[dataWorld_q$quinq == "2000-2004",])
stargazer(m13, m14, type = "text", single.row = TRUE,
model.numbers = FALSE, object.names = TRUE,
omit.stat=c("ser","f"),
star.cutoffs = c(0.05, 0.01, 0.001))
vif(m14)