逐行执行许多回归

时间:2017-01-02 17:25:39

标签: r performance lm

我有一个矩阵(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对象本身的产生。谢谢你的任何提示!

1 个答案:

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