2017-01-02 24 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