代码之家  ›  专栏  ›  技术社区  ›  aL3xa

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

  •  62
  • aL3xa  · 技术社区  · 16 年前

    我希望这个问题不会是“问答”问题…下面是: (多重)共线性是指回归模型中预测因子之间的高度相关性。如何治疗它们…嗯,有时你不需要“治愈”共线性,因为它不影响回归模型本身,而是解释个别预测因子的影响。

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

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

    5 回复  |  直到 12 年前
        1
  •  39
  •   Dirk is no longer here    16 年前

    这个 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
  •  34
  •   Yorgos    16 年前

    除了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)利用对角矩阵的行列式是特征值的乘积这一事实,一个或多个小特征值的存在表示共线性。

    > 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来确定共线性应该与对散点图的目视检查同时进行,因为一个孤立点可以在不存在的地方“引起”共线性,或者在存在的地方隐藏共线性。

        3
  •  17
  •   Jeromy Anglim    16 年前

    您可能会喜欢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/

        4
  •  8
  •   rcs    12 年前

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

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

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

    2. 所有其他预测因子的x_i回归得出r^2_i。对所有预测因子重复。r^2_i接近1表示有问题,可能会发现有问题的线性组合。

    3. 检验的特征值 t(X) %*% X 在哪里 X 表示模型矩阵;小特征值表示问题。2-范数条件数可以显示为矩阵的最大非零奇异值与最小非零奇异值之比($\kappa=\sqrt \lambda_1/\lambda_p;;请参见 ?kappa ; \kappa >= 30 被认为是大的。

        5
  •  7
  •   vagabond    12 年前

    既然到目前为止还没有提到VIF,我将添加我的答案。方差膨胀系数10通常表示预测变量之间存在严重的冗余。VIF表示如果一个变量与其他变量没有高度相关,那么它的协效方差将增加的因素。

    vif() 包中提供 cars 并应用于类(lm)的对象。它返回x1,x2的vif。…对象中的XN lm() . 最好使用vif>10排除变量,或使用vif>10引入变量转换。