我有一个矩阵(5,000 x 5,000),这是我随时间变化的因变量,随着时间的推移,我有几个独立变量矩阵,格式相同。两个矩阵都会不时包含NA,因此必须通过na.exclude
来处理这些。
我制作了一些示例数据来说明我的问题:
y <- matrix(rnorm(25000),5000,5000)
x1 <- matrix(rnorm(25000),5000,5000)
x2 <- matrix(rnorm(25000),5000,5000)
x3 <- matrix(rnorm(25000),5000,5000)
x4 <- matrix(rnorm(25000),5000,5000)
x5 <- matrix(rnorm(25000),5000,5000)
x6 <- matrix(rnorm(25000),5000,5000)
lx <- list()
test <- lapply(1:nrow(y), function(i){lm(y[i,]~x1[i,]+x2[i,]+x3[i,]+x4[i,]+x5[i,]+x6[i,],na.action="na.exclude")})
但请注意我这里没有任何NA(我不知道如何对NA数据进行采样?)。当我使用我的真实数据运行回归时,最多需要10分钟。这里的数据更快,可能是因为没有NA。 10分钟并不是很长,但我想优化速度,因为我必须多次这样做。
问:有没有办法更快地运行回归?最后,我特别需要所有回归的系数,但是后来也可能有更多的信息。如果我想逐行执行回归,我认为我不能避免循环。从我读到的,这里昂贵的部分似乎是lm对象本身的产生。谢谢你的任何提示!答案 0 :(得分:1)
也许RcppArmadillo::fastLm()
可以满足您的目的。这是一个非常简单的实现,也许回归算法的性能不够好。但它的速度非常快。
y <- matrix(rnorm(250000), 500, 500)
x1 <- matrix(rnorm(250000), 500, 500)
x2 <- matrix(rnorm(250000), 500, 500)
x3 <- matrix(rnorm(250000), 500, 500)
x4 <- matrix(rnorm(250000), 500, 500)
x5 <- matrix(rnorm(250000), 500, 500)
x6 <- matrix(rnorm(250000), 500, 500)
library(RcppArmadillo)
library(rbenchmark)
benchmark(
lm = {lapply(
1:nrow(y),
function(i){
lm(
y[i,]~x1[i,]+x2[i,]+x3[i,]+x4[i,]+x5[i,]+x6[i,],
na.action = "na.exclude"
)
}
)},
fastLmPure = {lapply(
1:nrow(y),
function(i){
fastLmPure(
X = as.matrix(data.frame(x1[i,], x2[i,], x3[i,], x4[i,], x5[i,], x6[i,])),
y = y[i,]
)
}
)},
replications = 10
)
一个随机结果:
test replications elapsed relative user.self sys.self user.child sys.child
2 fastLmPure 10 4.690 1.000 4.69 0 0 0
1 lm 10 11.143 2.376 11.13 0 0 0