【问题标题】:Remove perfectly multicollinear variables from data frame从数据框中删除完全多重共线性的变量
【发布时间】:2016-02-15 13:35:32
【问题描述】:

我有一个带有变量的数据框,其中一些包含相同的信息

x1 = runif(1000)
x2 = runif(1000)
x3 = x1 + x2
x4 = runif(1000)
x5 = runif(1000)*0.00000001 +x4
x6 = x5 + x3
x = data.frame(x1, x2, x3, x4, x5, x6)

在下一步中,我想摆脱所有完全多重共线性的变量,例如x3 和 x6 列(可能还有其他组合)。

在 Stata 中这相当简单:_rmcoll varlist

如何在 R 中有效地完成这项工作?

编辑: 请注意,最终目标是计算观测值之间的马氏距离。为此,我需要删除冗余变量。而且据我所知,对于这个应用程序,我放弃 x1、x2 还是 x3 都无关紧要

【问题讨论】:

  • 请注意,如果变量(列)完全共线,那么删除哪个变量是任意的。
  • 这就是我所说的“可能还有其他组合”。然而,在我的上下文中,删除哪些并不重要
  • 对于多共线性数据,我要么使用主成分回归(参见包pls),要么使用某种正则化方法,例如套索(参见包glmnet)。
  • 谢谢。我不是 100% 确定你的建议。并不是说我不针对运行回归或任何东西。我在我的问题中粘贴了澄清评论
  • 注意:任何希望此线程移动到交叉验证的人都应该注意它之前已在那里发布并被搁置。 (原则上它在这两个地方都可能是题外话,但我自己的观点是它属于这里。)

标签: r statistics stata


【解决方案1】:

我不知道内置的便利功能,但 QR 分解会做到。

我们需要数据框是一个矩阵:

X <- as.matrix(x)

使用略低于默认容差来保留稍微非多重共线的列:

qr.X <- qr(X, tol=1e-9, LAPACK = FALSE)
(rnkX <- qr.X$rank)  ## 4 (number of non-collinear columns)
(keep <- qr.X$pivot[seq_len(rnkX)])
## 1 2 4 5 
X2 <- X[,keep]

这严格回答了您的问题;您也许还可以使用奇异值分解 (svd()) 直接在此类数据上实现马氏距离 ...

【讨论】:

    【解决方案2】:

    为了完整起见,我发布了我到目前为止使用的快速而肮脏的解决方案。我实际上认为它与其他方法相比并没有那么糟糕。

    x1 = runif(1000)
    x2 = runif(1000)
    x3 = x1 + x2
    x4 = runif(1000)
    x5 = runif(1000)*0.00000001 +x4
    x6 = x5 + x3
    x = data.frame(x1, x2, x3, x4, x5, x6)
    
    const = rep(1,1000)
    a<-lm(const ~ ., data=x)
    names(a$coefficients[!is.na(a$coefficients)])[c(-1)]
    

    【讨论】:

      猜你喜欢
      • 2017-12-28
      • 2019-01-05
      • 2020-11-09
      • 2016-11-01
      • 2016-01-28
      • 1970-01-01
      • 2016-03-09
      • 2012-07-01
      • 2017-09-16
      相关资源
      最近更新 更多