该练习的总体目标是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()?