逐行执行许多回归

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