多个矩阵的加权平均值 - 逐个元素

use*_*534 4 r matrix mean weighted

我有“mylist” - 相同大小矩阵的列表:

mylist <- vector("list", 5) 
set.seed(123)
for(i in 1:5){
  mylist[[i]] <- matrix(rnorm(9), nrow = 3)
}
Run Code Online (Sandbox Code Playgroud)

我还有一个权重向量“mywgts” - 与“mylist”长度相同

mywgts <- c(0.8, 0.9, 1, 1.1, 1.2)
Run Code Online (Sandbox Code Playgroud)

我需要逐个元素计算这些矩阵的加权平均值。结果将是一个 3 x 3 矩阵,其中第一个元素是:

mylist[[1]][1,1]*mywgts[1] + mylist[[2]][1,1]*mywgts[2] + 
mylist[[3]][1,1]*mywgts[3] + mylist[[4]][1,1]*mywgts[4] + 
mylist[[5]][1,1]*mywgts[5]
Run Code Online (Sandbox Code Playgroud)

我知道如何通过循环矩阵的所有元素来做到这一点。但我正在寻找一种更简洁/优雅的类似 R 的解决方案。另外 - 'mylist' 的实际长度事先并不知道。

谢谢您的任何提示!

akr*_*run 5

你可以尝试

 res <- Reduce(`+`,Map(`*`, mylist, mywgts))
 res
 #         [,1]       [,2]      [,3]
 #[1,]  0.6852912  0.2116715 0.7993867
 #[2,] -0.8815045 -1.9811868 1.2558095
 #[3,]  1.5150166  0.8780412 0.7254080
Run Code Online (Sandbox Code Playgroud)

Map是 的包装器mapply,它是 的多元版本sapply。函数 ( *) 应用于第一个元素 ('mylist') 和第二个元素 ('mywgts') 的相应元素,然后用于对Reduce的相应元素求和list

如果您需要mean,请除以 'mylist` 的长度。

  res/length(mylist)
Run Code Online (Sandbox Code Playgroud)

使用OP的计算

mylist[[1]][1,1]*mywgts[1] + mylist[[2]][1,1]*mywgts[2] + 
mylist[[3]][1,1]*mywgts[3] + mylist[[4]][1,1]*mywgts[4] + 
mylist[[5]][1,1]*mywgts[5]
#[1] 0.6852912

mylist[[1]][1,2]*mywgts[1] + mylist[[2]][1,2]*mywgts[2] + 
mylist[[3]][1,2]*mywgts[3] + mylist[[4]][1,2]*mywgts[4] + 
mylist[[5]][1,2]*mywgts[5]
#[1] 0.2116715
Run Code Online (Sandbox Code Playgroud)