In statistics, multicollinearity (also collinearity) is a phenomenon in which one predictor variable in a multiple regression model can be linearly predicted from the others with a substantial degree of accuracy. In this situation the coefficient estimates of the multiple regression may change erratically in response to small changes in the model or the data. Multicollinearity does not reduce the predictive power or reliability of the model as a whole, at least within the sample data set; it only affects calculations regarding individual predictors. That is, a multivariate regression model with collinear predictors can indicate how well the entire bundle of predictors predicts the outcome variable, but it may not give valid results about any individual predictor, or about which predictors are redundant with respect to others.
These data consist of a random sample of 534 persons from the CPS, with information on wages and other characteristics of the workers, including sex, number of years of education, years of work experience, occupational status, region of residence and union membership. Source: Berndt, ER. The Practice of Econometrics. 1991. NY: Addison-Wesley. (Therese.A.Stukel_AT_Dartmouth.EDU) (MS Word format) [21/Jul/98] (23 kbytes)
library(mctest)
omcdiag(CPS85[, -1], CPS85$WAGE)
Call:
omcdiag(x = CPS85[, -1], y = CPS85$WAGE)
Overall Multicollinearity Diagnostics
MC Results detection
Determinant |X'X|: 0.000 1
Farrar Chi-Square: 4833.575 1
Red Indicator: 0.198 0
Sum of Lambda Inverse: 10068.844 1
Theil's Method: 1.226 1
Condition Number: 739.734 1
1 --> COLLINEARITY is detected by the test
0 --> COLLINEARITY is not detected by the test
结果表明模型中存在共线性的现象。然后是 F 检验看看具体哪些变量的问题:
imcdiag(CPS85[, -1], CPS85$WAGE)
Call:
imcdiag(x = CPS85[, -1], y = CPS85$WAGE)
All Individual Multicollinearity Diagnostics Result
VIF TOL Wi Fi Leamer CVIF Klein
OCCUPATION 1.298 0.770 1.736e+01 1.957e+01 0.878 1.328 0
SECTOR 1.199 0.834 1.157e+01 1.304e+01 0.913 1.226 0
UNION 1.121 0.892 7.037e+00 7.931e+00 0.945 1.146 0
EDUCATION 231.196 0.004 1.340e+04 1.511e+04 0.066 236.473 1
EXPERIENCE 5184.094 0.000 3.018e+05 3.401e+05 0.014 5302.419 1
AGE 4645.665 0.000 2.704e+05 3.048e+05 0.015 4751.700 1
SEX 1.092 0.916 5.335e+00 6.013e+00 0.957 1.117 0
MARR 1.096 0.912 5.597e+00 6.309e+00 0.955 1.121 0
RACE 1.037 0.964 2.162e+00 2.437e+00 0.982 1.061 0
SOUTH 1.047 0.955 2.726e+00 3.073e+00 0.977 1.071 0
1 --> COLLINEARITY is detected by the test
0 --> COLLINEARITY is not detected by the test
OCCUPATION , SECTOR , EDUCATION , EXPERIENCE , AGE , MARR , RACE , SOUTH , coefficient(s) are non-significant may be due to multicollinearity
R-square of y on all x: 0.28
* use method argument to check which regressors may be the reason of collinearity
===================================
VIF、TOL 和 Wi 列分别为 variance inflation factor, tolerance 和 Farrar-Glauber F 检验结果。
检验结果显示 EDUCATION,EXPERIENCE 和 AGE 确实存在共线性,而且 VIF 也确实很大。
主要参考博文 :
引子
如果现在我们预测一个国家,比如说中国,2018 年全年的旅游收入(美元)。因变量是中国 2018 年度的旅游收入 Y,自变量 X 我们假设存在下面两组:
另一组:
上面两个情况,那种情况下预测得到 Y 会更准确呢?相信大家都会选第二组 X,因为从直觉来看第二组 X 有 3 个不同的变量,而每一个变量对可以为我们预测 Y 提供一些不一样的信息。而且,这 3 个变量都不是直接从其他变量转换来的。或者说,没有哪个变量能与其他变量构成一个线性组合。
反之,在第一组 X 里,只有两个变量提供了有用的信息,而第 3 个变量只是前两个变量的线性组合。不考虑这个变量直接构建模型的话,其实最终的模型中也包含了这个组合。
在第一组出现的这种情况就是两个变量的共线性(multicollinearity)。在这组变量里,有的变量与其他变量之间强相关(不一定要求所有变量之间都相关,但至少是两个)。此时第一组变量得到的模型将不如第二组变量得到的模型准确,因为第二组变量提供的信息比第一组要多。因此,在做回归分析的时候,研究如何鉴定和处理共线性很有必要。
概念和基础
维基百科的 Multicollinearity 词条 写道:
多重回归时,一个自变量能被其他自变量在一定程度上线性预测时就是共线性。此时,模型或者数据中的微小的变化就可能会引起回归系数异常的变化。共线性不会降低模型整体的预测效力和可信度(在相同样本数据前提下),但它将影响对个体的预测。即,在存在共线性情况下,模型仍能反映所有自变量对因变量的预测能力,但对于单个自变量所给出的预测,或者关于自变量是否冗余的结论则都不可信。
共线性的出现可以有很多原因。比如哑变量的引入或者不正确的使用可能会导致共线性。使用通过其他变量转换生成的变量也会导致共线性,上面的例子就是这样的。另外,如果引入的变量之间本身就是相关的,或者提供的信息相似也有可能造成共线性(下面会出现例子)。共线性在总体上不会导致什么问题,但是却对单个变量及其预测效能影响巨大。它可能使得我们根本没办法鉴定哪些变量是显著性的。有时候你会发现一组变量的预测结果非常相似,或者一些变量相对其他一些变量完全就是冗余的。总结起来,共线性可能导致这些后果:
好的,现在我们知道共线性不是个好事。那要怎么识别共线性呢?方法有很多:
例子
下面来通过一个列子看看怎么鉴别数据中的共线性以及简单的处理。
我们用到的数据叫做
CPS_85_Wages data
,来源与介绍:这里可以下载到:https://www.economicswebinstitute.org/data/wagesmicrodata.xls 。
我也上传到了 GitHub repo:wagesmicrodata.xls 。
R 的
mosaic
包也附带了这个数据,library(mosaic)
然后data("CPS85")
就可以加载这个数据了,但是这个数据和我们直接下载的稍微形式变了一点,我嫌麻烦就直接用了 xls 文件了。但是其实?CPS85
查看帮助看看关于数据的细节也不错的。简单来说,这个数据是来自 534 人的样本的薪水和其他一些信息,比如年龄、性别、人种、受教育年限、工作年限、工作状态、居住地、工会状态、婚姻状态等等。而我们现在就是想通过这一系列变量来预测薪水。
先来看看数据长什么样子:
数据这样子:
更直观一点:
首先我们先用所有变量建立线性模型。这里,由于薪水之间差别很大导致方差也会很大,我们把它 Log 一下。
看看效果如何
summary(fit1)
:R 方 0.318,对于一个 只有 534 个样本的数据来说还行。F 统计量高度显著,提示模型中多个变量对因变量的解释具有统计学意义。但仔细看的话会发现 4 个变量 (occupation, education, experience, age) 没有统计学意义,有 2 个变量(marital status 及 south) 在 0.1 的统计学水平上有显著性。
下面我们来画图看看模型诊断信息所反映的误差正态性、方差齐性等等:
得图:
图看着也还行。所以问题可能在于得到的显著变量为什么这么少。
进一步,我们看看变量间的关系:
得图:
或者
得图:
从两张图都可以发现,AGE 和 EXPERIENCE 以及 EDUCATION 之间关联性很高。来看看偏相关系数:
一样的,我们发现AGE 和 EXPERIENCE 以及 EDUCATION 之间关联性很高。
接下来,我们来做 Farrar-Glauber 检验看看。
mctest
包的omcdiag (Overall Multicollinearity Diagnostics Measures)
函数计算不同的检测总体共线性的指标:结果表明模型中存在共线性的现象。然后是 F 检验看看具体哪些变量的问题:
VIF、TOL 和 Wi 列分别为 variance inflation factor, tolerance 和 Farrar-Glauber F 检验结果。
检验结果显示 EDUCATION,EXPERIENCE 和 AGE 确实存在共线性,而且 VIF 也确实很大。
最后 t 检验看看是什么样的关系:
和前面结果一致,EDUCATION,EXPERIENCE 和 AGE 三个变量 p 值显著,三者之间偏相关系数接近 1 。
同时发现其实有的相关性很低的变量之间相关性也是显著的。
现在我们明白状况了,那接下来要怎么办呢?解决的办法很多,比如主成分回归,岭回归和逐步回归等等。
这里呢,我们简单点,直接选一个 VIF > 10 的变量剔除出去看看。显然,年龄和工作经验这个肯定是高度相关的,没必要两个都纳入模型。年龄本身就可以反映工作经验。我们直接把 EXPERIENCE 剔除掉然后看看模型怎么样:
现在 9 个变量里大部分都是显著的,而且 F 检验也显示没什么问题。我们在检查下 VIF:
嗯,现在所有变量 VIF < 4,共线性问题没了。
虽然博客看懂了,代码也都照做并且确实解决了共线性问题,但其实这里面涉及到的统计方法我都不是很熟悉,只能算是一知半解吧。有空还是要好好看看这部分的统计基础,以及
mctest
的 Manual 要看看。