Econometria UES: Multicolinealidad
Datos del modelo ejemplo
carga de datos, archivo disponible en hprice.dta
library(haven)
<- read_dta("G:/UES 2021/Econometria/hprice1.dta")
hprice1 head(hprice1,n=6)
## # A tibble: 6 x 10
## price assess bdrms lotsize sqrft colonial lprice lassess llotsize lsqrft
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 300 349. 4 6126 2438 1 5.70 5.86 8.72 7.80
## 2 370 352. 3 9903 2076 1 5.91 5.86 9.20 7.64
## 3 191 218. 3 5200 1374 0 5.25 5.38 8.56 7.23
## 4 195 232. 3 4600 1448 1 5.27 5.45 8.43 7.28
## 5 373 319. 4 6095 2514 1 5.92 5.77 8.72 7.83
## 6 466. 414. 5 8566 2754 1 6.14 6.03 9.06 7.92
Modelo estimado
library(stargazer)
<-lm(price~assess+bdrms+lotsize+colonial+llotsize,data = hprice1)
modelo_estimadostargazer(modelo_estimado,type = "html",title = "modelo estimado")
Dependent variable: | |
price | |
assess | 0.940*** |
(0.072) | |
bdrms | 8.620 |
(6.791) | |
lotsize | 0.001 |
(0.001) | |
colonial | 10.031 |
(10.580) | |
llotsize | -13.357 |
(17.813) | |
Constant | 68.090 |
(146.133) | |
Observations | 88 |
R2 | 0.832 |
Adjusted R2 | 0.822 |
Residual Std. Error | 43.364 (df = 82) |
F Statistic | 81.224*** (df = 5; 82) |
Note: | p<0.1; p<0.05; p<0.01 |
Indice de Condición
El número de condición mide la sensibilidad de las estimaciones mínimo cuadráticas ante pequeños cambios en los datos.
El número de condición,\(\color{red}{\kappa(x)}\) , es igual a la raíz cuadrada de la razón entre la raíz característica más grande (\(\lambda_{max}\)) y la raíz característica más pequeña (\(\lambda_{min}\)) de la matriz \(\color{blue}{X^t X}\), normalizada, es decir: \[\color{red}{\kappa\left(x\right)=\sqrt{\frac{\lambda_{max}}{\lambda_{min}}}}\]
Interpretación:
- Sí \(\color{red}{\kappa(x)}\) es inferior o igual a 20, la multicolinealidad es leve, no se considera un problema.
- Para 20<\(\color{red}{\kappa(x)}\)<30, la multicolinealidad se considera moderada.
- En el caso de que \(\color{red}{\kappa(x)}\)≥30 la multicolinealidad es severa.
Cálculo “manual”:
Se basa la matriz \({X^t X}\):
library(stargazer)
<-model.matrix(modelo_estimado)
X_matstargazer(head(X_mat,n=6),type="html")
(Intercept) | assess | bdrms | lotsize | colonial | llotsize | |
1 | 1 | 349.100 | 4 | 6,126 | 1 | 8.720 |
2 | 1 | 351.500 | 3 | 9,903 | 1 | 9.201 |
3 | 1 | 217.700 | 3 | 5,200 | 0 | 8.556 |
4 | 1 | 231.800 | 3 | 4,600 | 1 | 8.434 |
5 | 1 | 319.100 | 4 | 6,095 | 1 | 8.715 |
6 | 1 | 414.500 | 5 | 8,566 | 1 | 9.056 |
<-t(X_mat)%*%X_mat
XX_matrixstargazer(XX_matrix,type = "html")
(Intercept) | assess | bdrms | lotsize | colonial | llotsize | |
(Intercept) | 88 | 27,784.800 | 314 | 793,748 | 61 | 783.649 |
assess | 27,784.800 | 9,563,053.000 | 102,507.500 | 278,300,049.000 | 19,578.900 | 250,005.600 |
bdrms | 314 | 102,507.500 | 1,182 | 2,933,767 | 228 | 2,802.953 |
lotsize | 793,748 | 278,300,049.000 | 2,933,767 | 16,165,159,010 | 555,967 | 7,457,452.000 |
colonial | 61 | 19,578.900 | 228 | 555,967 | 61 | 544.060 |
llotsize | 783.649 | 250,005.600 | 2,802.953 | 7,457,452.000 | 544.060 | 7,004.230 |
La matriz \({X^t X}\) debe ser normalizada, para evitar sesgo de la escala de las variables.
Cálculo de la matriz de normalización: \[S_n=\left\{\begin{matrix}\frac{1}{\sqrt{{X^tX}_{ij}}}&;\ i=j\\0&;\ i\neq j\\\end{matrix}\right\}\]
library(stargazer)
options(scipen = 999)
<-solve(diag(sqrt(diag(XX_matrix))))
Snstargazer(Sn,type = "html")
0.107 | 0 | 0 | 0 | 0 | 0 |
0 | 0.0003 | 0 | 0 | 0 | 0 |
0 | 0 | 0.029 | 0 | 0 | 0 |
0 | 0 | 0 | 0.00001 | 0 | 0 |
0 | 0 | 0 | 0 | 0.128 | 0 |
0 | 0 | 0 | 0 | 0 | 0.012 |
\({X^t X}\) normalizada:
library(stargazer)
<-(Sn%*%XX_matrix)%*%Sn
XX_normstargazer(XX_norm,type = "html",digits = 4)
1 | 0.9578 | 0.9736 | 0.6655 | 0.8326 | 0.9982 |
0.9578 | 1 | 0.9642 | 0.7078 | 0.8106 | 0.9660 |
0.9736 | 0.9642 | 1 | 0.6712 | 0.8491 | 0.9742 |
0.6655 | 0.7078 | 0.6712 | 1 | 0.5599 | 0.7008 |
0.8326 | 0.8106 | 0.8491 | 0.5599 | 1 | 0.8323 |
0.9982 | 0.9660 | 0.9742 | 0.7008 | 0.8323 | 1 |
Autovalores de \({X^t X}\) Normalizada:
library(stargazer)
#autovalores
<-eigen(XX_norm,symmetric = TRUE)
lambdasstargazer(lambdas$values,type = "html")
5.193 | 0.492 | 0.237 | 0.049 | 0.028 | 0.0005 |
Cálculo de \(\color{red}{\kappa\left(x\right)=\sqrt{\frac{\lambda_{max}}{\lambda_{min}}}}\):
<-sqrt(max(lambdas$values)/min(lambdas$values))
Kprint(K)
## [1] 106.4903
Como \(\kappa(x)>30\) se considera que la multicolinealidad es severa.
Cálculo del Indice de Condición usando librería “mctest”
library(mctest)
<-model.matrix(modelo_estimado)
X_matmctest(mod = modelo_estimado)
##
## Call:
## omcdiag(mod = mod, Inter = TRUE, detr = detr, red = red, conf = conf,
## theil = theil, cn = cn)
##
##
## Overall Multicollinearity Diagnostics
##
## MC Results detection
## Determinant |X'X|: 0.1420 0
## Farrar Chi-Square: 164.9525 1
## Red Indicator: 0.3832 0
## Sum of Lambda Inverse: 12.3289 0
## Theil's Method: -0.8940 0
## Condition Number: 106.4903 1
##
## 1 --> COLLINEARITY is detected by the test
## 0 --> COLLINEARITY is not detected by the test
Cálculo del Indice de Condición usando librería “olsrr”
library(olsrr)
ols_eigen_cindex(model = modelo_estimado)
## Eigenvalue Condition Index intercept assess bdrms
## 1 5.1933823834 1.000000 0.00003563203 0.0013514449 0.001229095
## 2 0.4923113019 3.247919 0.00004447199 0.0001049883 0.001469387
## 3 0.2365049515 4.686030 0.00028607748 0.0112620908 0.004101462
## 4 0.0490596083 10.288762 0.00483247587 0.4576465408 0.014764598
## 5 0.0282837924 13.550531 0.00119864705 0.2138228412 0.907363692
## 6 0.0004579625 106.490334 0.99360269558 0.3158120940 0.071071766
## lotsize colonial llotsize
## 1 0.003714445 0.007882944 0.00003054565
## 2 0.296269130 0.061464755 0.00001170881
## 3 0.032237901 0.854490636 0.00020426106
## 4 0.010083947 0.002127499 0.00265275719
## 5 0.009254094 0.069640172 0.00167335230
## 6 0.648440482 0.004393993 0.99542737500
Prueba de Farrar-Glaubar
(implementación de la prueba de Bartlett) Esta prueba identifica si a nivel poblacional, los regresores del modelo presentan independencia estadistica (son ortogonales), a través de la matriz de correlación muestral R, y se verifica si a nivel poblacional dicha matriz de correlación corresponde a una matriz identidad, las hipótesis de la prueba son las siguientes: \[\left\{\begin{matrix}H_0:&R\sim I\ \\H_1:&R\nsim I\\\end{matrix}\right.\] - Si no se rechaza \(H_0\), no hay evidencia de multicolinealidad, caso contrario - Si se rechaza \(H_0\) hay evidencia de multicolinealidad
El contraste se realiza a través de: \(\chi_{FG}^2=-\left(n-1-\frac{2m+5}{6}\right)\ln{\left(\left|R\right|\right)}\)
con, \(m=k−1\), \(gl=m(m−1)/2\)
Rechazar \(H_0\) si \(\chi_{FG}^2\)≥V.C., o si \(p \le \alpha\)
- Cálculo “manual”:
Calculo de \(|R|\)
library(stargazer)
<-scale(X_mat[,-1])
Znstargazer(head(Zn,n=6),type = "html")
assess | bdrms | lotsize | colonial | llotsize | |
1 | 0.350 | 0.513 | -0.284 | 0.662 | -0.340 |
2 | 0.375 | -0.675 | 0.087 | 0.662 | 0.543 |
3 | -1.029 | -0.675 | -0.375 | -1.495 | -0.641 |
4 | -0.881 | -0.675 | -0.434 | 0.662 | -0.866 |
5 | 0.035 | 0.513 | -0.287 | 0.662 | -0.349 |
6 | 1.036 | 1.702 | -0.045 | 0.662 | 0.277 |
Calcular la matriz R
library(stargazer)
<-nrow(Zn)
n<-(t(Zn)%*%Zn)*(1/(n-1))
R#También se puede calcular R a través de cor(X_mat[,-1])
stargazer(R,type = "html",digits = 4)
assess | bdrms | lotsize | colonial | llotsize | |
assess | 1 | 0.4825 | 0.3281 | 0.0829 | 0.5717 |
bdrms | 0.4825 | 1 | 0.1363 | 0.3046 | 0.1695 |
lotsize | 0.3281 | 0.1363 | 1 | 0.0140 | 0.8079 |
colonial | 0.0829 | 0.3046 | 0.0140 | 1 | 0.0386 |
llotsize | 0.5717 | 0.1695 | 0.8079 | 0.0386 | 1 |
Calcular \(|R|\)
<-det(R)
determinante_Rprint(determinante_R)
## [1] 0.1419755
Aplicando la prueba de Farrer Glaubar (Bartlett)
Estadistico \(\chi_{FG}^2\)
<-ncol(X_mat[,-1])
m<-nrow(X_mat[,-1])
n<--(n-1-(2*m+5)/6)*log(determinante_R)
chi_FGprint(chi_FG)
## [1] 164.9525
Valor Critico
<-m*(m-1)/2
gl<-qchisq(p = 0.95,df = gl)
VCprint(VC)
## [1] 18.30704
Regla de desición:
Como \(\chi_{FG}^2 \geq V.C.\) se rechaza \(H_0\), por lo tanto hay evidencia de colinealidad en los regresores
- Cálculo de FG usando “mctest”
library(mctest)
::omcdiag(mod = modelo_estimado) mctest
##
## Call:
## mctest::omcdiag(mod = modelo_estimado)
##
##
## Overall Multicollinearity Diagnostics
##
## MC Results detection
## Determinant |X'X|: 0.1420 0
## Farrar Chi-Square: 164.9525 1
## Red Indicator: 0.3832 0
## Sum of Lambda Inverse: 12.3289 0
## Theil's Method: -0.8940 0
## Condition Number: 106.4903 1
##
## 1 --> COLLINEARITY is detected by the test
## 0 --> COLLINEARITY is not detected by the test
- Cálculo de FG usando la “psych”
library(psych)
<-cortest.bartlett(X_mat[,-1])
FG_testprint(FG_test)
## $chisq
## [1] 164.9525
##
## $p.value
## [1] 0.000000000000000000000000000003072151
##
## $df
## [1] 10
Factores Inflacionarios de la Varianza (FIV)
Los denominados, variance inflation factor (VIF), por sus siglas en inglés, determinan el tamaño relativo de la varianza del j-ésimo parámetro estimado, respecto a la varianza esperada del estimador en ausencia de colinealidad.
- Estimador de la varianza para el j-ésimo parámetro: \[Var \big( \beta_{j} \big) = \frac{ \sigma_{ \varepsilon }^{2} }{(n-1) . Var \big(X_j\big) } . \frac{1}{1-R_{j}^{2}}\]
- Estimador mínimo de la varianza para el j-ésimo parámetro (en ausencia de colinealidad \(R_{j}^{2}=0\) ): \[Var \big( \beta_{j} \big)_{mín} = \frac{ \sigma_{ \varepsilon }^{2} }{(n-1) . Var \big(X_j\big) }\]
Fórmula para el cálculo de los VIF
\[VIF_j=\frac{Var \big( \beta_{j} \big) }{Var \big( \beta_{j} \big)_{mín}}= \frac{1}{1-R_{j}^{2}}\] Donde \(R_{j}^{2}\), es el coeficiente de determinación de la regresión de \(X_j\) contra el resto de regresores.
Matricialmente los VIF, se obtienen de la diagonal principal de la inversa de la matriz de Correlación: \[VIF_{j=1,2,...,k-1}=diag(R^{-1})\]
Referencia entre \(R^2_j\)
library(dplyr)
<-c(0,0.5,.8,.9)
R.cuadrado.regresoresas.data.frame(R.cuadrado.regresores) %>% mutate(VIF=1/(1-R.cuadrado.regresores))
## R.cuadrado.regresores VIF
## 1 0.0 1
## 2 0.5 2
## 3 0.8 5
## 4 0.9 10
Cálculo manual:
Matriz de Correlación de los regresores del modelo (Como se obtuvo con anterioridad):
print(R)
## assess bdrms lotsize colonial llotsize
## assess 1.00000000 0.4824739 0.32814633 0.08293582 0.5716654
## bdrms 0.48247394 1.0000000 0.13632563 0.30457549 0.1694902
## lotsize 0.32814633 0.1363256 1.00000000 0.01401865 0.8078552
## colonial 0.08293582 0.3045755 0.01401865 1.00000000 0.0386421
## llotsize 0.57166539 0.1694902 0.80785523 0.03864210 1.0000000
Inversa de la matriz de correlación \(R^{-1}\):
<-solve(R)
inversa_Rprint(inversa_R)
## assess bdrms lotsize colonial llotsize
## assess 2.1535576 -0.9010888 0.8347216 0.1520968 -1.7586001
## bdrms -0.9010888 1.5104833 -0.3640744 -0.4021983 0.5687703
## lotsize 0.8347216 -0.3640744 3.2049651 0.1130042 -3.0089889
## colonial 0.1520968 -0.4021983 0.1130042 1.1142184 -0.1531266
## llotsize -1.7586001 0.5687703 -3.0089889 -0.1531266 4.3456744
VIF’s para el modelo estimado:
<-diag(inversa_R)
VIFsprint(VIFs)
## assess bdrms lotsize colonial llotsize
## 2.153558 1.510483 3.204965 1.114218 4.345674
Cálculo de los VIF’s usando “performance”
library(performance)
<-multicollinearity(x = modelo_estimado,verbose = FALSE)
VIFs VIFs
## # Check for Multicollinearity
##
## Low Correlation
##
## Term VIF Increased SE Tolerance
## assess 2.15 1.47 0.46
## bdrms 1.51 1.23 0.66
## lotsize 3.20 1.79 0.31
## colonial 1.11 1.06 0.90
## llotsize 4.35 2.08 0.23
plot(VIFs)
Cálculo de los VIF’s usando “car”
library(car)
<-vif(modelo_estimado)
VIFs_carprint(VIFs_car)
## assess bdrms lotsize colonial llotsize
## 2.153558 1.510483 3.204965 1.114218 4.345674
Cálculo de los VIF’s usando “mctest”
library(mctest)
mc.plot(mod = modelo_estimado,vif = 2)