I have 'mylist" - a list of same size matrices:
mylist <- vector("list", 5)
set.seed(123)
for(i in 1:5){
mylist[[i]] <- matrix(rnorm(9), nrow = 3)
}
I also have a vector of weights 'mywgts' - same length as 'mylist'
mywgts <- c(0.8, 0.9, 1, 1.1, 1.2)
I need to calculate a weighted mean of these matrices - element by element. The result will be a 3 by 3 matrix where the first element is:
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]
I know how to do it by looping through all elements of a matrix. But I am looking for a more parsimonious/elegant R-like solution. Also - the actual length of 'mylist' is not known in advance.
Thank you for any hint!
You may try
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
Map is a wrapper for mapply, which is a multivariate version of sapply. The function (*) is applied to the corresponding elements of first ('mylist') and second elements ('mywgts'), and then use Reduce to sum the corresponding elements of the list.
If you need the mean, divide by the length of 'mylist`.
res/length(mylist)
Using the OP's calculation
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With