2014-06-13 5 views
0

R에서 WLS의 베타 평균 추정 속도를 높일 필요가 있습니다. 공분산 계산을 가속화 할 수 있었는데 thanks to SO입니다. 궁극적 인 계산을 빠르게하는 또 다른 속임수가 있는지 궁금하다. (또는 내가하고있는 것이 이미 충분히 효율적이라면).R의 가중 최소 제곱 평균 추정의 속도 증가 역 계산

n = 10000 
y = rnorm(n, 3, 0.4) 
X = matrix(c(rnorm(n,1,2), sample(c(1,-1), n, replace = TRUE), rnorm(n,2,0.5)), nrow = n, ncol = 3) 
Q = diag(rnorm(n, 1.5, 0.3)) 
wls.cov.matrix = crossprod(X/sqrt(diag(Q))) 
Q.inv = diag(1/diag(Q)) 
wls.mean = wls.cov.matrix%*%t(X)%*%Q.inv%*%y 
system.time(wls.cov.matrix%*%t(X)%*%Q.inv%*%y) 

wls.cov.matrix crossprod에서와 비슷한 또 다른 속임수가있어 평균 계산 속도를 높이거나 필요가 없습니다. 감사!

+0

귀하의 코드가 오류없이 실행되지 않습니다. 또한 성능 질문에는 벤치 마크 및 성능 요구 사항 사양이 포함되어야합니다. – Roland

+0

@Roland는 캐치에 대한 감사, 버그가 수정되었습니다. 성능 요구 사항 측면에서 나는 잠재적 개선 (또는 향상 될 수 없음을 정당화하는 답변)을 찾고 있으며 속도 향상이 가능한지 더 많이 알 수 있습니다. – Dnaiel

답변

2

성능의 주된 이득은 길을 따라 n-by-n 행렬을 갖지 않음으로써 얻을 수 있습니다. 나는 Q 행렬을 가지지 않고 단지 대각선으로 만 작업한다는 것을 의미합니다. @Roland에 의해 대답에

건물 :

Qdiag = rnorm(n, 1.5, 0.3); 
Q = diag(Qdiag); 

wls.mean3 <- wls.cov.matrix %*% crossprod(X/Qdiag, y); 
all.equal(wls.mean, wls.mean3) 
microbenchmark(wls.cov.matrix %*% t(X) %*% Q.inv %*% y, 
       wls.cov.matrix %*% crossprod(X, Q.inv) %*% y, 
       wls.cov.matrix %*% crossprod(X/Qdiag, y), 
      times=5) 
#  wls.cov.matrix %*% t(X) %*% Q.inv %*% y 358050.195 363713.250 368820.818 372414.747 374824.56  5 
# wls.cov.matrix %*% crossprod(X, Q.inv) %*% y 79449.856 81411.195 84616.706 85351.968 88108.62  5 
#  wls.cov.matrix %*% crossprod(X/Qdiag, y) 279.092 284.867 285.252 291.796 295.26  5 
+0

고마워요! 멋진 답변! – Dnaiel

2

마지막 질문에 대한 답변에서 당신은 crossprod이라고 가르쳐졌습니다. 해당 함수를 다시 사용하십시오 :

n = 1e4 
set.seed(42) 
y = rnorm(n, 3, 0.4) 
X = matrix(c(rnorm(n,1,2), sample(c(1,-1), n, replace = TRUE), rnorm(n,2,0.5)), nrow = n, ncol = 3) 
Q = diag(rnorm(n, 1.5, 0.3)) 
wls.cov.matrix = crossprod(X/sqrt(diag(Q))) 
Q.inv = diag(1/diag(Q)) 
wls.mean = wls.cov.matrix%*%t(X)%*%Q.inv%*%y 
wls.mean2 <- wls.cov.matrix %*% crossprod(X, Q.inv) %*% y 
all.equal(wls.mean, wls.mean2) 
#[1] TRUE 

library(microbenchmark) 
microbenchmark(wls.cov.matrix %*% t(X) %*% Q.inv %*% y, 
       wls.cov.matrix %*% crossprod(X, Q.inv) %*% y, 
       times=5) 

#Unit: milliseconds 
#          expr  min  lq median  uq  max neval 
#  wls.cov.matrix %*% t(X) %*% Q.inv %*% y 1019.3955 1022.1679 1022.2766 1024.540 1025.9131  5 
#wls.cov.matrix %*% crossprod(X, Q.inv) %*% y 314.0622 315.3588 315.3933 317.024 317.1142  5 

일부 매트릭스 대수 트릭에서는 성능이 향상 될 수 있지만 그게 장점이 아닙니다.