[英]Speed-up inverse calculation of weighted least squares mean estimate in R
我需要加快R中WLS中beta的均值估計的計算- 由於有了SO ,我能夠加快協方差計算,現在我想知道是否還有另一個技巧可以加快均值計算(或如果我正在做的事情已經足夠有效)。
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中的技巧,以加快整個均值計算的速度,還是不需要? 謝謝!
在回答您的最后一個問題時,您已經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
通過一些矩陣代數技巧,可能還會有更多的性能改進,但這不是我的專長。
性能上的主要增益將通過沿途沒有任何n×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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.