= read.table("https://rnoremlas.quarto.pub/un_rincon_para_r/posts/15_multicolinealidad/Wooldridge.txt", header=T, sep=";")
wooldridge = wooldridge[,1]
r3 = wooldridge[,2]
r6 = wooldridge[,3]
r12 #
= lm(r6~r3)
reg0 = residuals(reg0) # parte de r6 no relacionada con r3 e.r6
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:
- al igual que no todas las medidas de detección propuestas en el post anterior son capaces de detectar todos los tipos de multicolinealidad aproximada comentados (esencial y no esencial),
- no todos los tratamientos propuestas son útiles para mitigar la multicolinealidad aproximada esencial y no esencial.
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.
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")
= lm(r12~r3+r6)
reg1 = lm(r12~r3+e.r6)
reg2 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)
#
= rep(1, length(r12))
cte1 = cbind(cte1, r3, r6)
wooldridge1 = CVs(wooldridge1)
cvs1 = VIF(wooldridge1)
vif1 = CNs(wooldridge1)
cns1 = cbind(cte1, r3, e.r6)
wooldridge2 = CVs(wooldridge2)
cvs2 = VIF(wooldridge2)
vif2 = CNs(wooldridge2)
cns2 = data.frame(cvs1, cvs2)
cvs colnames(cvs) = c("Modelo inicial", "Modelo residualizado")
rownames(cvs) = c("r3", "r6")
= data.frame(vif1, vif2)
vifs colnames(vifs) = c("Modelo inicial", "Modelo residualizado")
= data.frame(unlist(cns1), unlist(cns2))
cns colnames(cns) = c("Modelo inicial", "Modelo residualizado")
#
library(knitr)
kable(cvs, align = "c", caption = "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")
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")
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'
= theil[,2]
consume = theil[,3]
income = theil[,4]
relprice = income - mean(income)
income.c #
= lm(consume~income+relprice)
reg3 = lm(consume~income.c+relprice)
reg4 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:
= rep(1, length(consume))
cte2 = cbind(cte2, income, relprice)
theil1 = CVs(theil1)
cvs3 = VIF(theil1)
vif3 = CNs(theil1)
cns3 #
= cbind(cte2, income.c, relprice)
theil2 = CVs(theil2)
cvs4 = VIF(theil2)
vif4 = CNs(theil2)
cns4 = data.frame(cvs3, cvs4)
cvs colnames(cvs) = c("Modelo inicial", "Modelo centrado")
rownames(cvs) = c("income", "relprice")
= data.frame(vif3, vif4)
vifs colnames(vifs) = c("Modelo inicial", "Modelo centrado")
= data.frame(unlist(cns3), unlist(cns4))
cns colnames(cns) = c("Modelo inicial", "Modelo centrado")
#
library(knitr)
kable(cvs, align = "c", caption = "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")
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")
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.