在回归模型中筛选(多)共线性

时间:2010-06-15 02:10:14

标签: r statistics regression

我希望这个问题不会成为“问答”的问题......这里有: (多)共线性是指回归模型中预测变量之间的极高相关性。如何治愈它们......好吧,有时你不需要“治愈”共线性,因为它不会影响回归模型本身,而是解释个体预测因子的影响。

发现共线性的一种方法是将每个预测变量作为因变量,将其他预测变量作为自变量,确定R 2 ,如果它大于.9(或.95),我们可以考虑预测器冗余。这是一种“方法”......其他方法呢?其中一些是耗时的,比如从模型中排除预测变量并观察b系数变化 - 它们应该明显不同。

当然,我们必须始终牢记分析的具体背景/目标......有时,只有补救措施才能重复研究,但是现在,我对筛选多余预测因子的各种方法感兴趣(多重共线性发生在回归模型中。

5 个答案:

答案 0 :(得分:39)

kappa()功能可以提供帮助。这是一个模拟的例子:

> set.seed(42)
> x1 <- rnorm(100)
> x2 <- rnorm(100)
> x3 <- x1 + 2*x2 + rnorm(100)*0.0001    # so x3 approx a linear comb. of x1+x2
> mm12 <- model.matrix(~ x1 + x2)        # normal model, two indep. regressors
> mm123 <- model.matrix(~ x1 + x2 + x3)  # bad model with near collinearity
> kappa(mm12)                            # a 'low' kappa is good
[1] 1.166029
> kappa(mm123)                           # a 'high' kappa indicates trouble
[1] 121530.7

我们进一步使第三个回归量越来越共线:

> x4 <- x1 + 2*x2 + rnorm(100)*0.000001  # even more collinear
> mm124 <- model.matrix(~ x1 + x2 + x4)
> kappa(mm124)
[1] 13955982
> x5 <- x1 + 2*x2                        # now x5 is linear comb of x1,x2
> mm125 <- model.matrix(~ x1 + x2 + x5)
> kappa(mm125)
[1] 1.067568e+16
> 

这使用了近似值,有关详细信息,请参阅help(kappa)

答案 1 :(得分:34)

只是添加Dirk所说的条件数方法,一条经验法则是CN > 30 indicate severe collinearity的值。除条件编号外,其他方法包括:

1)协方差的决定因素    矩阵,范围从0(完美    共线性)至1(无共线性)

# using Dirk's example
> det(cov(mm12[,-1]))
[1] 0.8856818
> det(cov(mm123[,-1]))
[1] 8.916092e-09

2)使用对角矩阵的行列式是特征值=&gt;的乘积的事实。一个或多个小特征值的存在表明共线性

> eigen(cov(mm12[,-1]))$values
[1] 1.0876357 0.8143184

> eigen(cov(mm123[,-1]))$values
[1] 5.388022e+00 9.862794e-01 1.677819e-09

3)方差膨胀因子(VIF)的值。预测器i的VIF是1 /(1-R_i ^ 2),其中R_i ^ 2是来自预测器i与其余预测器的回归的R ^ 2。当至少一个自变量的VIF很大时,存在共线性。经验法则:VIF > 10 is of concern。对于R中的实现,请参阅here。我还想评论使用R ^ 2来确定共线性应该与散点图的视觉检查同时进行,因为单个异常值可以“导致”不存在的共线性,或者可以隐藏共存性。

答案 2 :(得分:17)

你可能会喜欢Vito Ricci的参考卡“R函数用于回归分析” http://cran.r-project.org/doc/contrib/Ricci-refcard-regression.pdf

它简洁地列出了R中许多有用的回归相关函数,包括诊断函数。 特别是,它列出了vif包中可以评估多重共线性的car函数。 http://en.wikipedia.org/wiki/Variance_inflation_factor

多重共线性的考虑通常与评估变量重要性的问题密切相关。如果这适用于您,请查看relaimpo包:http://prof.beuth-hochschule.de/groemping/relaimpo/

答案 3 :(得分:8)

另见本书第9.4节:Practical Regression and Anova using R [Faraway 2002]

可以通过多种方式检测共线性:

  1. 对预测变量的相关矩阵的检验将揭示出大的成对共线性。

  2. x_i对所有其他预测变量的回归得出R ^ 2_i。对所有预测变量重复。接近1的R ^ 2_i表示存在问题 - 可以找到有问题的线性组合。

  3. 检查t(X) %*% X的特征值,其中X表示模型矩阵;小的特征值表明存在问题。 2范数条件数可以显示为矩阵的最大非零奇异值的比率($ \ kappa = \ sqrt {\ lambda_1 / \ lambda_p} $;请参阅?kappa) ; \kappa >= 30被认为很大。

答案 4 :(得分:7)

由于目前尚未提及VIF,我将添加我的答案。方差膨胀因子> 10通常表示预测变量之间的严重冗余。 VIF表示如果变量与其他变量不高度相关,变量系数的方差会增加的因素。

vif()在包cars中可用,并应用于类(lm)的对象。它返回x1,x2的vif。 。 。对象lm()中的xn。最好使用vif> 10排除变量,或者使用vif> 10将变换引入变量。