当对线性统计模型进行预测时,我们通常具有与我们想要进行预测的点相对应的预测因子的模型矩阵X
;系数beta
的向量;和方差-协方差矩阵V
。计算预测值只是X %*% beta
。计算预测值的 * 方差 * 的最直接方法是
diag(X %*% V %*% t(X))
或者稍微更有效地
diag(X %*% tcrossprod(V,X))
然而,这是非常低效的,因为它构造了一个n*n矩阵,而我们真正想要的是对角线。我知道我可以写一些Rcpp循环的东西,只计算对角线项,但我想知道是否有一个现有的线性代数技巧在R中,将很好地做我想要的...(如果有人想为我写一个Rcpp-loopy的东西作为答案,我不会反对,但我更喜欢一个纯R的解决方案)
FWIWx 1 m4n1x似乎做了一些聪明的事情,将X
乘以lm
的QR分解的R分量的逆;我不确定这是否总是可用的,但这可能是一个很好的起点(见此处)
3条答案
按热度按时间sqxo8psd1#
沿着Octave/Matlab问题的思路,对于两个矩阵
A
和B
,我们可以利用AB
的nth
对角元素将是A
的nth
行与B
的nth
列的乘积这一事实,我们可以简单地将其扩展到三个矩阵的情况,我还没有考虑如何在C=A^T
的情况下进行优化,但除此之外,这段代码看起来有望实现加速:当我运行这段代码时,使用
tcrossprod
似乎并没有加速结果,然而,仅仅使用row-sum-dot-product方法似乎已经高效得多了,至少在这个愚蠢的例子中是这样,* 建议 *(尽管我不确定)rowSums
在返回对角项之前 * 没有 * 计算整个中间矩阵,正如我所预料的diag
。bttbmeg02#
我不太确定这有多有效,
1.求U使得
V = U %*% t(U)
;这是可能,因为V是覆盖矩阵。XU = X %*% U
result = apply(XU, 1, function(x) sum(x^2))
演示
使用SVD
另一种方法-这也不会比@davewy的更快
bpzcxfmw3#
我最近找到了
emulator::quad.diag()
,它只是这比@davewy的解决方案稍微好一点(尽管总体上的差异比我想象的要小)。