我写了一种算法,该算法适合lm()
的线性模型,然后迭代地“更新”响应变量。问题是:在高维方案中,拟合线性模型会产生瓶颈。
另一方面,所需的大部分工作是仅依赖协变量矩阵X
的矩阵求逆,即系数由solve(t(X) %*% X) %*% X %*% y
给出。
通过阅读lm()
代码,我知道R使用QR分解。
是否可以恢复使用的内部矩阵运算并更快地用新的y
值拟合新模型?
这是一个最小的例子:
set.seed(1)
X <- matrix(runif(400*150000), nrow = 150000)
y1 <- runif(150000)
y2 <- runif(150000)
mod1 <- lm(y1 ~ X)
mod2 <- lm(y2 ~ X)
从理论上讲,mod2
“重复”了与第一次lm()
调用中相同的昂贵的矩阵运算。
我想继续使用lm()
来实现高效并自动处理不完整的秩矩阵。
答案 0 :(得分:1)
# Data
set.seed(1)
n = 5
X <- matrix(runif(5*n), nrow = n)
y1 <- runif(n)
y2 <- runif(n)
# lm models
mod1 <- lm(y1 ~ X)
mod2 <- lm(y2 ~ X)
# Obtain QR decomposition of X
q = qr(X)
# Reuse 'q' to obtain fitted values repeatedly
mod1_fv = qr.fitted(q, y1)
mod2_fv = qr.fitted(q, y2)
# Compare fitted values from reusing 'q' to fitted values in 'lm' models
Vectorize(all.equal)(unname(mod1$fitted.values), mod1_fv)
#> [1] TRUE TRUE TRUE TRUE TRUE
Vectorize(all.equal)(unname(mod2$fitted.values), mod2_fv)
#> [1] TRUE TRUE TRUE TRUE TRUE
由reprex package(v0.3.0)于2019-09-06创建
答案 1 :(得分:1)
您是否尝试过仅拟合多元模型?我没有检查代码,但是在我的系统上,它的速度几乎是单独安装的速度的一半,因此,如果它在做您在幕后提出的建议,我不会感到惊讶。也就是说,
mods <- lm(cbind(y1, y2) ~ X)