2017-01-02 45 views
1

我有一个矩阵(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分钟。有了这个数据,它可以更快,可能是因为没有NAs。 10分钟不是很长,但我想优化速度,因为我必须做很多次。

问:有什么办法可以更快地运行回归?最后,我特别需要所有回归的系数,而且R^2之后可能会有更多的信息。如果我想逐行执行回归,我不认为我可以避免循环。从我所读的内容来看,这里昂贵的部分似乎是lm对象本身的一代。感谢任何提示!

回答

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 
+0

感谢要去测试的明天! – user3032689