将双重求和转为矩阵形式并优化R代码去除t求和循环的实现
矩阵运算改写方案
你的循环逻辑可以完全改写为无循环的向量化运算,核心是利用二次型的化简和R的逐元素运算特性:
原理推导
你循环内的每一项本质是二次型计算:
$$e_t^T \text{diag}(Z_{diff}[,t]) e_t = \sum_{i=1}^n e_{i,t}^2 \cdot Z_{diff}[i,t]$$
其中$e_t = Y - XB[,t]$是第t次的残差向量。对t求和等价于对所有$i,t$位置的$e_{i,t}^2 \cdot Z_{diff}[i,t]$求和,无需逐次遍历。
实现代码
# 1. 更高效生成Z_diff(替代原来的mapply逻辑,结果完全一致) Z_diff <- outer(Z, Z, `-`) # 2. 一次性计算所有t对应的残差矩阵,每列对应一个t的残差向量 E <- Y - X %*% B # 3. 逐元素运算后直接求和,得到最终rss rss <- sum(E^2 * Z_diff)
说明
上述代码运算结果和你原有循环逻辑完全等价,且去掉了所有显式遍历,n越大时性能提升越明显,代码可读性也更高。
内容的提问来源于stack exchange,提问作者MOHAMMED
相关产品推荐
相关产品推荐

