首页 > 解决方案 > 使用 Matrix::qr() 在稀疏矩阵中完美共线性检测

问题描述

该练习的总体目标是X在线性回归问题的上下文中,在 R 中一个非常大但稀疏的矩阵中找到完全共线的列。不时出现的一种方法是利用底层的 QR 分解lm()来提取 OLS 系数并删除所有分配NA为估计值的变量。虽然base::qr()速度太慢而无法成为可行的选择,但它可以Matrix::qr()很好地处理稀疏矩阵并且速度非常快。不幸的是,这两种实现的结果是完全不同的。

考虑玩具数据集

# random design matrix
x1 <- rnorm(100)
x2 <- rnorm(100)
x3 <- x1 + x2
X  <- cbind(1, x1, x2, x3)

# random outcome variable
y  <- rnorm(100)

其中 variablex3是 和 的线性组合,x1因此x2目标是从x3下降Xbase我们可以使用以下方法快速估计 OLS 系数

# base implementation
qr.base   <- base::qr(X)
coef.base <- base::qr.coef(qr.base, y)
coef.base
                     x1          x2          x3 
-0.04330410 -0.04889519  0.07719935          NA

在这里,系数x3自动NA根据需要设置为 。X通过使用密集矩阵作为 的输入,可以获得类似的结果Matrix::qr()。但是,使用稀疏矩阵类时情况会发生变化:

# Matrix implementation (sparse)
X.sparse    <- Matrix::sparse.model.matrix(~ x1 + x2 + x3)
qr.matrix   <- Matrix::qr(X.sparse)
coef.matrix <- Matrix::qr.coef(qr.matrix, y)
coef.matrix
  (Intercept)            x1            x2            x3 
-3.125000e-02 -2.088811e+14 -2.088811e+14  2.088811e+14 

X由于没有满级而在某些时候明显出错的地方。有没有办法生成类似于base::qr()using的结果Matrix::qr()

标签: rmatrixsparse-matrixqr-decomposition

解决方案


推荐阅读