Multicolinealidad

Tratamiento.
read.table
install.packages
multiColl
rvif
memics
mtable
knitr
CVs
VIF
CNs
unlist
data.frame
rownames
colnames
Author

Román Salmerón Gómez

Published

March 10, 2023

En el momento que se determina que la multicolinealidad aproximada existente en un modelo de regresión lineal múltiple afecta al análisis del modelo, se hace necesario aplicar herramientas que permitan mitigar dichos efectos nocivos.

Existen diversas propuestas para ello, desde aumentar la muestra a aplicar técnicas de estimación alternativas a los Mínimos Cuadrados Ordinarios como la estimación cresta. Sin embargo, hay que tener presente que el tratamiento a usar debe de ir en consonancia con el tipo de multicolinealdiad detectada ya que:

A continuación trataremos los problemas de multicolinealidad aproximada detectados en los datos de Wooldridge y Theil.

Residualización

En los datos de Wooldridge se analizan los tipos de interés a doce meses a partir de los tipo de interes a tres y seis meses: \[\mathbf{r12} = \beta_{1} + \beta_{2} \mathbf{r3} + \beta_{3} \mathbf{r6} + \mathbf{u},\] donde existe un problema de multicolinealidad esencial (la no esencial no es preocupante) por la relación existente entre los tipos de interés a tres y seis meses.

Para mitigar este problema, se va a aplicar una técnica conocida como residualización. Para aplicar esta técnica se van a considerar los residuos de la regresión: \[\mathbf{r6} = \alpha_{1} + \alpha_{2} \mathbf{r3} + \mathbf{v},\] donde éstos se pueden interpretar como la parte de los tipos de interés a seis meses no relacionados con los tipos de interés a tres meses, es decir, los tipos de interés a cuatro, cinco y seis meses.

Además, la estimación por Mínimos Cuadrados Ordinarios garantiza que estos residuos no tienen relación alguna con el término independiente y los tipos de interés a tres meses.

wooldridge = read.table("https://rnoremlas.quarto.pub/un_rincon_para_r/posts/15_multicolinealidad/Wooldridge.txt", header=T, sep=";")
r3 = wooldridge[,1]
r6 = wooldridge[,2]
r12 = wooldridge[,3]
#
reg0 = lm(r6~r3)
e.r6 = residuals(reg0) # parte de r6 no relacionada con r3

Por tanto, planteando el modelo de regresión: \[\mathbf{r12} = \delta_{1} + \delta_{2} \mathbf{r3} + \delta_{3} \mathbf{e.r6} + \mathbf{w},\] se consigue, por un lado, mitigar el problema de multicolinealidad y, por otro, obtener una nueva interpretación del coeficiente de los residuos.

Al comparar la estimación de los dos modelos, el inicial y el residualizado, se observa que el signo no esperado del primero se corrige en el segundo:

library(memisc) # install.packages("memisc")
reg1 = lm(r12~r3+r6)
reg2 = lm(r12~r3+e.r6)
mtable(reg1, reg2)

Calls:
reg1: lm(formula = r12 ~ r3 + r6)
reg2: lm(formula = r12 ~ r3 + e.r6)

=======================================
                  reg1        reg2     
---------------------------------------
  (Intercept)    0.225***    0.440***  
                (0.040)     (0.039)    
  r3            -0.629***    1.006***  
                (0.066)     (0.005)    
  r6             1.593***              
                (0.064)                
  e.r6                       1.593***  
                            (0.064)    
---------------------------------------
  R-squared      0.997       0.997     
  N            124         124         
=======================================
  Significance: *** = p < 0.001;   
                ** = p < 0.01;   
                * = p < 0.05  

Además, no cambia ninguna de las restantes características salvo la estimación y varianza estimada asociada al término independiente y los tipos de interés a tres meses.

Finalmente, comparando las medidas de detección en ambos casos:

library(multiColl) # install.packages(multiColl)
library(rvif) # install.packages(rvif)
#
cte1 = rep(1, length(r12))
wooldridge1 = cbind(cte1, r3, r6)
    cvs1 = CVs(wooldridge1)
    vif1 = VIF(wooldridge1)
    cns1 = CNs(wooldridge1)
wooldridge2 = cbind(cte1, r3, e.r6)
    cvs2 = CVs(wooldridge2)
    vif2 = VIF(wooldridge2)
    cns2 = CNs(wooldridge2) 
cvs = data.frame(cvs1, cvs2) 
colnames(cvs) = c("Modelo inicial", "Modelo residualizado")
rownames(cvs) = c("r3", "r6")
vifs = data.frame(vif1, vif2) 
colnames(vifs) = c("Modelo inicial", "Modelo residualizado")
cns = data.frame(unlist(cns1), unlist(cns2)) 
colnames(cns) = c("Modelo inicial", "Modelo residualizado")
#
library(knitr)
kable(cvs, align = "c", caption = "Comparación de los coeficientes de variación")
Comparación de los coeficientes de variación
Modelo inicial Modelo residualizado
r3 0.4666176 4.666176e-01
r6 0.4588348 4.113151e+16
kable(vifs, align = "c", caption = "Comparación de los factores de inflación de la varianza")
Comparación de los factores de inflación de la varianza
Modelo inicial Modelo residualizado
r3 146.1685 1
r6 146.1685 1
kable(cns, align = "c", caption = "Comparación de los números de condición")
Comparación de los números de condición
Modelo inicial Modelo residualizado
Condition Number without intercept 56.56906 1.000000
Condition Number with intercept 69.00941 4.507993
Increase (in percentage) 18.02704 77.817180

Se tiene que el factor de inflación de la varianza pasa a ser igual a su mínimo valor, lo que indica que la multicolinealidad aproximada del tipo esencial ha sido totalmente eliminada.

Al mismo tiempo, el valor del número de condición (4.507993) estaría recogiendo la relación existente entre los tipos de interés a tres meses con el término independiente, que no es preocupante.

Centrado de variables

Es bien sabido que cuando existe multicolinealidad aproximada de tipo no esencial, la solución idónea consiste en centrar la variable que provoca el problema; es decir, restar la media de la variable a todos y cada uno de sus elementos.

En el caso de los datos de Theil, se tiene que la variable income es responsable de un problema de multicolinealidad aproximada no esencial. Centrando esta variable y comparando el modelo inicial y el centrado, se obtienen los siguientes resultados:

data(theil) # datos disponibles en librería 'multiColl'
consume = theil[,2]
income = theil[,3]
relprice = theil[,4]
income.c = income - mean(income)
#
reg3 = lm(consume~income+relprice)
reg4 = lm(consume~income.c+relprice)
mtable(reg3, reg4)

Calls:
reg3: lm(formula = consume ~ income + relprice)
reg4: lm(formula = consume ~ income.c + relprice)

=======================================
                  reg3        reg4     
---------------------------------------
  (Intercept)  130.707***  240.044***  
               (27.094)     (6.537)    
  income         1.062**               
                (0.267)                
  relprice      -1.383***   -1.383***  
                (0.084)     (0.084)    
  income.c                   1.062**   
                            (0.267)    
---------------------------------------
  R-squared      0.951       0.951     
  N             17          17         
=======================================
  Significance: *** = p < 0.001;   
                ** = p < 0.01;   
                * = p < 0.05  

Se observa que los únicos cambios se producen en la estimación y varianza estimada del término constante, produciéndose una importante dismunición en la segunda.

Al mismo tiempo, comparando las medidas de detección de ambos modelos, se observa un importante incremento en el coeficiente de variación de income y una disminución en el número de condición. En ambos casos, los nuevos valores están por debajo/arriba de los umbrales establecidos como preocupantes:

cte2 = rep(1, length(consume))
theil1 = cbind(cte2, income, relprice)
    cvs3 = CVs(theil1)
    vif3 = VIF(theil1)
    cns3 = CNs(theil1)
    #
theil2 = cbind(cte2, income.c, relprice)
    cvs4 = CVs(theil2)
    vif4 = VIF(theil2)
    cns4 = CNs(theil2)
cvs = data.frame(cvs3, cvs4) 
colnames(cvs) = c("Modelo inicial", "Modelo centrado")
rownames(cvs) = c("income", "relprice")
vifs = data.frame(vif3, vif4) 
colnames(vifs) = c("Modelo inicial", "Modelo centrado")
cns = data.frame(unlist(cns3), unlist(cns4)) 
colnames(cns) = c("Modelo inicial", "Modelo centrado")
#
library(knitr)
kable(cvs, align = "c", caption = "Comparación de los coeficientes de variación")
Comparación de los coeficientes de variación
Modelo inicial Modelo centrado
income 0.0499377 3.076165e+15
relprice 0.2144185 2.144185e-01
kable(vifs, align = "c", caption = "Comparación de los factores de inflación de la varianza")
Comparación de los factores de inflación de la varianza
Modelo inicial Modelo centrado
income 1.033043 1.033043
relprice 1.033043 1.033043
kable(cns, align = "c", caption = "Comparación de los números de condición")    
Comparación de los números de condición
Modelo inicial Modelo centrado
Condition Number without intercept 9.576912 1.038226
Condition Number with intercept 48.953474 9.591634
Increase (in percentage) 80.436707 89.175714

Finalmente, destaca que el factor de inflación de la varianza en ambos modelos coincide. Esto se debe a que esta medida es invariante ante cambios de origen y escala. De este hecho se puede deducir que el centrado de variables no es útil para mitigar la multicolinealdiad aproximada de tipo esencial.