2017-01-02 12 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のデータをサンプリングすることができます方法がわからない?)ここで任意のNASに必要はありません。実際のデータで回帰を実行すると、最大10分かかります。このデータはここでははるかに速く、たぶんNAsが存在しないためです。 10分は長くなるわけではありませんが、何度もやらなければならないので、スピードを最適化したいと思います。

Q:回帰をより迅速に実行する方法はありますか?結局、私は特にすべての回帰の係数を必要としますが、R^2は後でもっと多くの情報を必要とします。回帰分析を行ごとに実行したい場合は、ループを避けることはできないと私は思います。私が読んだところでは、ここで高価な部分は、オブジェクトそのものの生成であるようです。何かヒントありがとう!

答えて

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

関連する問題