【问题标题】:Screening (multi)collinearity in a regression model在回归模型中筛选(多重)共线性
【发布时间】:2011-03-03 19:06:45
【问题描述】:

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

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

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

【问题讨论】:

  • 我很高兴没有人将此标记为不够“程序化”,并且很多人对此投了赞成票。这是一个很好的问题,我们中的许多“用数据编程”的人都在苦苦思索。
  • 好问题,好答案。非常有益的阅读 - 谢谢。
  • 学分应该给我的朋友...她问我关于共线性的问题,在搜索 SO 上的主题后,我发现没有任何问题...这很奇怪,因为共线性问题在统计分析中很常见。谢谢小伙子们的这些好答案!
  • 好东西,我真的很高兴看到在 SO 涌现出一个 R 社区。​​span>
  • 这个问题似乎是题外话,因为它是关于统计实践的。它应该迁移到 CrossValidated (最初提出问题时不存在...)

标签: r statistics regression


【解决方案1】:

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)

【讨论】:

    【解决方案2】:

    另见本书第 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 &gt;= 30 被认为很大。

    【解决方案3】:

    除了 Dirk 所说的 Condition Number 方法,一个经验法则是 CN &gt; 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) 利用对角矩阵的行列式是特征值的乘积这一事实 => 一个或多个小特征值的存在表明共线性

    > 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 &gt; 10 is of concern。对于 R 中的实现,请参阅here。我还想评论说,使用 R^2 来确定共线性应该与散点图的视觉检查同时进行,因为单个异常值可以“导致”不存在的共线性,或者可以隐藏存在的共线性.

    【讨论】:

    • 感谢 Γιώργος,为此 +2!很好的答案!
    • 为什么协方差矩阵的行列式上限为 1??
    【解决方案4】:

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

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

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

    【讨论】:

    • 技术上和算术上,VIF = 1(1 - R^2),其中 R^2 指的是我在问题中陈述的示例。我忘了提到 VIF,所以感谢您对此的帮助! relaimpo 是一个很棒的发现!
    【解决方案5】:

    由于到目前为止还没有提到 VIF,我将添加我的答案。 Variance Inflation Factor>10 通常表示预测变量之间存在严重冗余。 VIF表示当一个变量与其他变量的相关性不高时,该变量的系数方差会增加多少。

    vif() 在包cars 中可用,并应用于类(lm) 的对象。它返回 x1, x2 的 vif。 . . xn 在对象 lm() 中。最好排除 vif >10 的变量或对 vif>10 的变量进行转换。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-21
      • 2019-10-09
      • 2016-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-11
      • 2014-05-01
      相关资源
      最近更新 更多