逐行执行许多回归
perform many regressions row by row
我有一个矩阵 (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分钟不算太长,但我想优化一下速度,因为我要做很多次。
问:有什么方法可以更快地 运行 回归?最后,我特别需要所有回归的系数,还需要 R^2 以后可能有更多信息。如果我想逐行执行回归,我认为我无法避免循环。从我读到的内容来看,这里代价高昂的部分似乎是 lm 对象本身的生成。感谢您的任何提示!
也许 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
我有一个矩阵 (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分钟不算太长,但我想优化一下速度,因为我要做很多次。
问:有什么方法可以更快地 运行 回归?最后,我特别需要所有回归的系数,还需要 R^2 以后可能有更多信息。如果我想逐行执行回归,我认为我无法避免循环。从我读到的内容来看,这里代价高昂的部分似乎是 lm 对象本身的生成。感谢您的任何提示!
也许 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