Definición de Multicolinealidad

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.

Causas del Problema de Multicolinealidad

La multicolinealidad puede surgir de diferentes causas:

¿Se puede “solucionar” la multicolinealidad?

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.

Diagnóstico de Multicolinealidad

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.

Coeficientes de Correlación entre Y y Xs

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

Modelos de Regresión Simple

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

Indicadores de problemas de multicolinealidad

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.

Modelos Múltiples

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

Diagnóstico de los modelos

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.

Formas de identificar las variables “perturbadoras”

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

Cálculo del Factor de Inflación de la Variaza (VIF)

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.

Interpretación del VIF

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:

Modelos Múltiples y VIF

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

¿Qué hacer cuando detectamos multicolinealidad?

Posible solución en este caso:

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

Código en R para los resultados de esta presentación

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