多重共线性
------主要参考何晓群《应用回归分析》
------仅用于个人学习知识整理和R语言代码整理
------看到本站的另一篇总结多重共线性文章,觉得不错,附上链接:多重共线性的产生原因、判别、检验、解决方法
1.定义
若:
则称自变量间存在完全多重共线性
2.影响
- 估计值方差变大
- 回归系数置信区间变宽,影响估计精度
- 一些系数无法通过显著性检验
- 回归系数的正负号可能出错
3.诊断
另外找到一个比较详细的诊断方法的列举:线性回归多重共线性的诊断方法和R语言实现
- 方差扩大因子法
###理论来自于何晓群书本上
R语言实现
###数据来自何晓群书本p150例5.6
y<c(172.9,352.94,447.67,404.02,409.51,619.71,1121.17,1506.94,1105.79,933.03,1008.54,1567.56,1960.06,2884.88,2556.72)
x1<c(11246,10335,13156,6127,27419,25633,95684,105987,46230,37165,48787,75808,123128,371406,198569)
x2<-c(681,791,607,714,911,1231,2760,2651,2105,3030,2810,2649,3031,3644,3690)
x3<c(105.9,107.4,114.4,110.8,99.4,91.4,90.8,86.3,125.3,107.4,106.6,115.7,110.1,105.8,101.6)
x4<c(10183,10414,13134,15033,17389,21715,27075,31827,35393,38823,46079,47871,54372,65602,74917)
x5<c(4110,3996,4689,6876,8636,12339,16623,19937,24787,25112,24414,22970,24403,30531,37861)
x6<c(11242,12693,16681,22131,31353,43528,70752,125989,99468,82478,54936,87135,129884,153044,215033)
x7<-c(9,6.5,6,4.75,4.75,9.5,10,16,10.5,10.5,8.5,6,6.5,5,5.25)
data<-as.data.frame(cbind(y,x1,x2,x3,x4,x5,x6,x7))
reg<-lm(y~.,data=data)
#计算方差扩大因子VIF
#install.packages("car")
library(car)
vif(reg)#方差扩大因子
###这里有一个疑问:老师给的例子其实是没有标准化数据的,那vif计算的时候会自动标准化吗?还是说不需要标准化?
得到结果:
当VIF大于等于10时,说明自变量x可能和其他自变量有多重共线性,这里的x2,x4,x5,x6可能导致多重共线性
-
特征根判别法
###理论来自于何晓群书本上
有多少个特征根接近0,设计矩阵X就有多少个多重共线性关系 -
条件数
###理论来自于何晓群书本上
当k属于(0,10)时,认为X没有多重共线性
当k属于[10,100)时,存在较强的多重共线性
当k大于等于100时,存在严重的多重共线性
x0<-rep(1,length(x1))
X<-cbind(x0,x1,x2,x3,x4,x5,x6,x7)
XX<-t(X)%*%X
MX<-X
for (i in 1:8) MX[,i]<-X[,i]/sqrt(XX[i,i])
MX2<-t(MX)%*%MX
ci<-sqrt(kappa(MX2,exact=T))#求条件数max
ei<-eigen(MX2)#求特征根和特征向量
##########
max(ei$values)
k<-numeric()
for (i in 1:8) k[i]<-max(ei$values)/(ei$values[i])
sqrt(k)
可以得到最大的条件数为60.31679,所以存在较强的多重共线性
- 直观判定法
1.增加或删除一个自变量,或改变一个观测值,回归系数的估计值有较大变化
2.一些重要的变量没有通过显著性检验
3.有些自变量的系数正负号与定性分析结果相违背
4.自变量的相关矩阵中,自变量间的相关系数较大
5.一些重要的自变量的回归系数的标准误差较大
4.解决办法
-
剔除一些不显著的变量
-
增大样本量
-
回归系数的有偏估计
如岭回归,主成分法,偏最小二乘法等,后续会继续整理