El problema de la multicolinealidad, intuirlo y detectarlo

El modelo líneal se puede escribir de forma matricial como Y = X • Beta + Error. Donde Y es el vector con nuestra variable dependiente, X la matriz con las variables regresoras, Beta el vector de parámetros y el error esa parte aleatoria que tiene que tener todo modelo. La matriz con nuestras variables regresoras X ha de tener rango completo es decir, todas sus columnas tienen que ser linealmente independientes. Eso nos garantiza que a la hora de estimar por mínimos cuadrados ordinarios X’ X es invertible. Si no es invertible la estimación por mínimos cuadrados ordinarios “se vuelve inestable” ya que X’X =0 y 1/ X’X será muy complicado de calcular ya que los Beta son inversa(X’ X) •X’Y; por ello los resultados que arroja el modelo tienen una alta variabilidad. Cuando esto nos pasa tenemos colinealidad.

Hay varias formas de intuir si hay relación lineal entre nuestras variables independientes. La primera es analizar el coeficiente de correlación. Si tenemos variables altamente correladas es muy probable que el modelo pueda tener colinealidad entre esas variables. Otro de los síntomas se produce cuando nuestro modelo tiene un alto coeficiente de correlación y muchas variables no son significativas. En estos casos es muy probable la existencia de colinealidad.

Cuando hemos intuido que tenemos multicolinealidad pero hemos de detectarla, disponemos de tres métodos:

  • Determinante de la matriz de correlaciones. Si hay dos variables que son linealmente dependientes el determinante de la matriz de correlaciones será muy parecido a 0. Lo ideal si no hay correlación entre las variables dependientes es una matriz de correlaciones con unos en su diagonal y valores muy próximos a 0 en el resto de valores.
  • El coeficiente entre el autovalor más grande de X’ X entre el autovalor más pequeño no nulo de X’X. Si la raíz de esta división es superior a 10 podríamos tener multicolinealidad, si es superior a 30 hay multicolinealidad. Y esto por qué, pues porque si hay mucha diferencia entre estos autovalores esto implica una mayor inestabilidad en la matriz invertida.
  • El VIF, el variance inflation factor. ¿Cuánto se me “hincha” la varianza si elimino esa variable del modelo? ¿Cuánta inestabilidad aporta a mi modelo? Yo recomiendo emplear este método. Y va a ser sobre el que vamos a trabajar.

Para ilustrar el problema vamos a trabajar con R:

#install.packages("car")
library(car)
head(mtcars)
?mtcars
#Matriz de correlaciones
cor(mtcars[,-1])

Un clásico, el data mtcars, no hace falta presentación. Ya con la matriz de correlaciones podemos pensar que habrá problemas:

            cyl       disp         hp        drat         wt        qsec         vs
cyl   1.0000000  0.9020329  0.8324475 -0.69993811  0.7824958 -0.59124207 -0.8108118
disp  0.9020329  1.0000000  0.7909486 -0.71021393  0.8879799 -0.43369788 -0.7104159
hp    0.8324475  0.7909486  1.0000000 -0.44875912  0.6587479 -0.70822339 -0.7230967
drat -0.6999381 -0.7102139 -0.4487591  1.00000000 -0.7124406  0.09120476  0.4402785
wt    0.7824958  0.8879799  0.6587479 -0.71244065  1.0000000 -0.17471588 -0.5549157
qsec -0.5912421 -0.4336979 -0.7082234  0.09120476 -0.1747159  1.00000000  0.7445354
vs   -0.8108118 -0.7104159 -0.7230967  0.44027846 -0.5549157  0.74453544  1.0000000
am   -0.5226070 -0.5912270 -0.2432043  0.71271113 -0.6924953 -0.22986086  0.1683451
gear -0.4926866 -0.5555692 -0.1257043  0.69961013 -0.5832870 -0.21268223  0.2060233
carb  0.5269883  0.3949769  0.7498125 -0.09078980  0.4276059 -0.65624923 -0.5696071
              am       gear        carb
cyl  -0.52260705 -0.4926866  0.52698829
disp -0.59122704 -0.5555692  0.39497686
hp   -0.24320426 -0.1257043  0.74981247
drat  0.71271113  0.6996101 -0.09078980
wt   -0.69249526 -0.5832870  0.42760594
qsec -0.22986086 -0.2126822 -0.65624923

Hay mucha correlación entre algunas variables presentes en el conjunto de datos. Realizamos el modelo:

modelo
Call:
lm(formula = mpg ~ wt + hp + disp + qsec + drat + cyl + carb, 
    data = mtcars)

Residuals:
    Min      1Q  Median      3Q     Max 
-3.9445 -1.6098 -0.4142  1.1533  5.5584 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)  
(Intercept) 26.15955   15.06469   1.736   0.0953 .
wt          -4.28429    1.80664  -2.371   0.0261 *
hp          -0.01889    0.02050  -0.921   0.3661  
disp         0.01412    0.01744   0.809   0.4264  
qsec         0.42307    0.60358   0.701   0.4901  
drat         1.28705    1.57651   0.816   0.4223  
cyl         -0.82473    0.83245  -0.991   0.3317  
carb         0.05386    0.73259   0.074   0.9420  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 

Residual standard error: 2.61 on 24 degrees of freedom
Multiple R-squared: 0.8549,	Adjusted R-squared: 0.8125 
F-statistic: 20.19 on 7 and 24 DF,  p-value: 1.284e-08

Un gran modelo con un R cuadrado de 0.8125 donde sólo tenemos una variable significativa si fijamos un nivel de 0.05, eso es un contrasentido. Otro síntoma claro de la existencia de multicolinealidad. Pero es necesario comprobar esta primera impresión y para ello vamos a utilizar la función vif del paquete car:

vif(modelo)
       wt        hp      disp      qsec      drat       cyl      carb 
14.224688  8.996796 21.277170  5.295516  3.234394 10.061251  6.373673

Es evidente que hay multicolinealidad, tenemos factores que hinflan mucho la variabilidad en nuestro modelo. ¿Fijar un valor para el VIF? Yo entiendo que a partir de 4 merece la pena pararse a ver que pasa, he leído por ahí que a partir de 5 hay que disparar las alarmas. Un valor de 14 o 10 es para asustarse. ¿Cómo solucionamos esto? Directamente os digo, no debemos eliminar variables, nuestro modelo es muy bueno. Se trata de que le demos estabilidad a los parámetros resultantes. Podemos introducirles un sesgo para hacerlos más pequeños y que tengan más estabilidad… En otra entrada. Saludos.

14 comentarios en “El problema de la multicolinealidad, intuirlo y detectarlo

  1. Buena entrada. Yo tb suelo usar vif del paquete car.. Para estabilizar parámetros supongo que estás pensando en métodos de regularización.. Ridge, lasso

  2. Muy aclaratorio el aspecto teorico/pRactico de la entrada. Dos cosas:
    1.”Un gran modelo con un R cuadrado de 0.8125 donde sólo tenemos una variable significativa si fijamos un nivel de 0.05, eso es un contrasentido.” ¿Por qué es un contrasentido?.
    2. Con un vif alto yo suelo eliminar variables, desconocía que hubiera alternativas, ¿algún anticipo?
    Gracias

  3. El R2 (hablo del ajustado) es 1 menos la suma de cuadrados de los errores corregidos por la media entre la suma de las observaciones corregidas por la media. Es un buen modelo si la suma de cuadrados de los errores corregidos por la media es muy próximo a 1. Si el modelo es bueno, mis estimaciones recogen recogen mucha varianza.

    Sin embargo las pruebas de hipótesis de cada uno de los coeficientes de regresión salen muy pequeños porque su contribución se calcula a partir de la diagonal de X’X que es la que nos está haciendo polvo por la presencia de relación lineal entre las variables.

    Entonces, si las variables “desaportan” como es posible que el modelo salga bueno. Por la forma en la que medimos la contribución de las variables independientes.

    No elimines las variables, hay técnicas, como dice Jose Luis, que nos permiten corregir la jodida matriz X’X. En breve veremos alguna. En algún sitio también he leído que se solventa aumentando el número de observaciones y se me ocurre alguna aberración matemática.

    Saludos.

  4. Hola Raul,
    En primer lugar, animarte a que sigas con este blog tan útil. Lo consulto con frecuencia.
    Quiero hacerte una consulta. Trabajo con SAS como analista de B.I., nunca he trabajado con modelos, pero voy a tener que hacer alguna incursión. Para empezar, quiero hacer un modelo sencillo montado con SAS/BASE y utilizando los procs que sean necesarios para realizar un modelo sencillo de previsión de bajas. Parto de un histórico de varios años con tablas sas que contienen las bajas mensuales con el contrato del cliente y las variables que más influyen en la baja (segmento de valor del cliente, meses para finalizar su compromiso permanencia y antiguedad total del cliente en meses). Puedo añadir más variables, pero estás son las que tienen más peso y no quiero complicar más el modelo en su inicio. Las bajas no presentan efectos de estacionalidad en ningún mes, y no hay cambios bruscos de un mes para otro, aunque si ligeras tendencias. Mi idea es un modelo que se base en el pasado para predecir el futuro. No dispongo de módulos de sas estadísticos tipo MINER o similar. Mis conocimientos en estadística son básicos (soy Lic en Físicas y con expe prof en informática).
    Domino perfectamente SAS/BASE, macros, etc…¿qué me recomiendas para empezar?, procedimientos SAS que me puedan ser de utilidad, etc…
    Muchas gracias, un saludo,

  5. Hola Juan, para realizar ese tipo de modelos no es necesario que tengas módulos de minería de datos. Puedes emplear el módulo STAT de SAS o bien trabajar con R, hoy en día R se “traga” millones de registros.

    Por lo que comentas tienes bien depurados los datos. Como primer paso te recomendaría que empezaras con regresión logística. El proc logistic de SAS es muy potente y no tiene mucha dificultad. Empieza por ahí. Siempre ten en cuenta que has de validar tu modelo y lo más importante, que tenga sentido.

    Suerte.

  6. Hola Raul,

    Quería hacerte una consulta a nivel de carrera profesional.
    Soy informático, trabajo como consultor de T.I. en proyectos Business Intelligence y me gustaría seguir en este mundo del B.I, pero desde una perspectiva de B.I. más orientado a negocio.
    Mi idea es intentar hacer un cambio hacía analista de negocio B.I., como te digo mi formación es informático y me gustaría saber que formación complementaria me vendría bien para hacer este cambio.

    Como consultor he trabajado montando sistemas datawarehouse o B.I. , tengo experiencia en diferentes BBDDs y en diferentes herramientas B.I. (ejemplo SAS, Microstraregy, SAP Business Objects y Microsoft B.I.), conozco bastante SAS/BASE y mi formación estadística es básica, no he manejado modelos estadísticos, ni he realizado dataminig predectivo, etc..

    Creo que hay muchos puestos en los departamentos de B.I. que quizás no hagan analítica muy avanzada y en los que pueda tener cabida. Es decir, trabajo de reporting tirando de los sistemas B.I. de la compañía, extracciones de datos, realización de estudios (sin entrar en modelos avanzados), perfiles con capacidad analística y manejo de BBDDs y herramientas de análisis de datos (ejemplo SAS).

    Mi pregunta es doble:
    1) ¿Es necesario tener formación estadística para optar a estos puestos?
    2) ¿Qué formación complementaria me vendría bien?

    Muchas gracias,

  7. Hola Juan,

    Te respondo:

    1) Hay dos tipos de perfiles, por un lado tienes el analista de negocio que se dedica a realizar seguimiento de los principales indicadores de negocio y por otro lado tienes a los estadísticos, al final gran parte de su trabajo es el mismo que el analista de negocio y complementa su trabajo con el análisis estadístico. Para este segundo perfil además de formación es muy importante la experiencia sobre todo si entras en proyectos muy complejos.

    2) Yo creo que es importante, si quieres decicarte a negocio, conocer ese negocio. Si te especializas en Banca conocer bien productos financieros, si te especializas en telecos conocer bien la tecnología y los datos que son susceptibles de explotarse. En muchos años en el negocio me he encontrado muy buenos estadísticos que no saben definir una anulación de una línea telefónica.

    Haces bien en cambiar de perfil. Los sistemas relacionales tienen sus días contados (creo).

  8. Muchas gracias por la ayuda Raul.
    Aprovecho para preguntarte otra cosa: SPSS.
    ¿Es complicado?, lo poco que he visto son gráficos y tratamiento de datos vía interfaz (sin tirar código). ¿Tiene código tipo SAS/BASE?, ¿a qué lenguaje es parecido?.
    Muchas gracias,

  9. Hola Juan, he trabajado en algunas de las aseguradoras más importantes de España, en dos entidades bancarias y en telecos. Sólo en una teleco empleé Clementine que es el módulo específico de minería de datos de SPSS. Nunca he trabajado con SPSS.

    Creo que es mejor aprender python y R.

  10. Muchas gracias de nuevo, Raul!!
    ¿Puede ser que la programación en R sea similar a la programación en C?. Es algo que he oído.

  11. Genial!!!, pero… no entendí el final jaj
    cómo o con qué introduces dicho sesgo?

    AYUDA! mis VIF’s salen altos y no quiero eliminar variables :(((
    Saludos y gracias a quien pueda orientarme
    PD.También estoy trabajando con R

  12. Hola tengo dudas acerca de los modelos logísticos, cuando uso vif() con una regresión binomial en glm() no me salen esos valores me salen GVIF, Df, y GVIF^(1/2*Df), lo que encuentro acerca de la relación entre GVIF y VIF me confunde aun más ya que definen al GIF de la siguiente forma GVIF=VIF^(1/2*Df) entonces ¿Debo elevar los valores de la columna GVIF con respecto a los de la columna Df de la siguiente forma?

    VIF=GVIF^(2*Df)

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *