【问题标题】:Weighted mean across several matrices - element by element多个矩阵的加权平均值 - 逐个元素
【发布时间】:2015-10-23 02:09:58
【问题描述】:

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

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

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

mywgts <- c(0.8, 0.9, 1, 1.1, 1.2)

我需要逐个元素地计算这些矩阵的加权平均值。 结果将是一个 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]

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

感谢您的任何提示!

【问题讨论】:

    标签: r matrix mean weighted


    【解决方案1】:

    你可以试试

     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
    

    Mapmapply 的包装器,它是sapply 的多变量版本。将函数(*)应用于第一个('mylist')和第二个元素('mywgts')的对应元素,然后使用Reducelist的对应元素求和。

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

      res/length(mylist)
    

    使用 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
    

    【讨论】:

    • 哇,非常感谢 - 这正是我正在寻找的解决方案类型!
    猜你喜欢
    • 2020-03-20
    • 2021-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-16
    • 2023-03-23
    • 1970-01-01
    相关资源
    最近更新 更多