该练习的总体目标是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
下降X
。base
我们可以使用以下方法快速估计 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()
?