[英]Speed-up inverse of weighted least squares covariance matrix in R
我需要加快R中WLS协方差矩阵的逆的计算速度,其中的矩阵wls.cov.matrix
由(下面的完整示例)给出:
n = 10000
X = matrix(c(rnorm(n,1,2), sample(c(1,-1), n, replace = TRUE), rnorm(n,2,0.5)), nrow = 1000, ncol = 3)
Q = diag(rnorm(n, 1.5, 0.3))
wls.cov.matrix = solve(t(X)%*%diag(1/diag(Q))%*%X)
是否可以加快计算速度?
与最终目标非常相关的更多信息:这仍然是很少的信息,让我解释更多我的目标,并且如果有加速我的代码的方法,将会更加清楚。
我运行wls.cov.matrix的次数为1万次,所以我需要它要快得多。
但是,每次运行时,我都使用相同的X,唯一改变的矩阵是Q,它是对角矩阵。
如果X
是一个与Q
暗淡的方阵,我可以预先计算X^-1
和(X^T)^(-1)
,
X.inv = solve(X)
X.inv.trans = solve(t(X))
然后对于每次迭代运行:
Q.inv = diag(1/diag(Q))
wls.cov.matrix = X.inv%*%Q.inv%*%X.inv.trans
但是我的X
不是方形的,所以还有其他技巧吗?
Q
是对角矩阵,因此它的逆仅由对角项的逆给出。 您可以这样做
X = matrix(c(rnorm(n,1,2), sample(c(1,-1), n, replace = TRUE), rnorm(n,2,0.5)), nrow = 1000, ncol = 3)
Qinv = diag(1/rnorm(n, 1.5, 0.3))
wls.cov.matrix = solve(t(X)%*%Qinv%*%X)
实际上,这可以使事情加速大约20倍。
这里主要的耗时部分是t(X)%*%diag(1/diag(Q))%*%X
,而不是其逆的计算。
一个不错的技巧是将其计算为
crossprod(X / sqrt(diag(Q)));
确认:
all.equal( (t(X) %*% diag(1/diag(Q)) %*% X) , crossprod(X / sqrt(diag(Q))) );
[1] TRUE
要比较计时运行:
Qdiag = diag(Q);
system.time({(t(X) %*% diag(1/Qdiag) %*% X)})
system.time({crossprod(X / sqrt(Qdiag))})
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.