r - 使用 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
下降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()
?
解决方案
推荐阅读
- sql - Oracle SQL-插入语句-SQL 错误:ORA-00984:此处不允许列
- react-native - textContentType=oneTimeCode 不适用于 iOS
- c++ - 如何在结束 C++ 命令行应用程序时运行函数?
- php - 这个 PHP 类常量声明有什么问题?
- reactjs - npm run build - 尽管开发版本工作正常,但无法编译
- node.js - 无法在 Webpack 3 中将 Sass 添加到 Vue 项目
- javascript - 如何使用 Javascript 计算 Acrobat PDF 中的字段?
- react-native - 如何将原生 ios 第三方库集成到 React Native 应用程序中?
- python - 在包中使用动态文件
- jinja2 - saltstack jinja for 并行循环