2017-01-02 6 views
1

시간이 흐르면서 종속 변수 인 행렬 (5,000 x 5,000)이 있고 시간이 지남에 따라 여러 형식의 행렬이 같은 형식으로 있습니다. 두 매트릭스 모두 NA를 포함하기 때문에 na.exclude을 통해 처리해야합니다. (내가뿐만 아니라 NA의 데이터를 샘플링하는 방법을 몰라?)많은 회귀를 행 단위로 수행합니다.

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가없는주의 :

나는 내 문제를 설명하기 위해 일부 샘플 데이터를했다. 실제 데이터로 회귀 분석을 실행하면 최대 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