从数据框中删除完美的多线性变量

she*_*heß 2 statistics r stata

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

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)
Run Code Online (Sandbox Code Playgroud)

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

在Stata中,这很容易: _rmcoll varlist

如何在R中有效地完成?

编辑:请注意,最终目标是计算观测值之间的马哈拉诺比斯距离.为此,我需要删除冗余变量.而且据我所知,对于这个应用程序,我是否放弃x1,x2或x3并不重要

Ben*_*ker 5

我不知道内置的便利功能,但QR分解会做到这一点.

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

X <- as.matrix(x)
Run Code Online (Sandbox Code Playgroud)

使用略低于默认的公差来保留略微非多线性的列:

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]
Run Code Online (Sandbox Code Playgroud)

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