是否可以缓存`lm()`矩阵以适应新数据?

时间:2019-09-04 23:02:02

标签: r lm

我写了一种算法,该算法适合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()来实现高效并自动处理不完整的秩矩阵。

2 个答案:

答案 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)