如何在 R 中对多个均值向量使用 mvrnorm

how to use mvrnorm for multiple mean vector in R

mu是两个均值向量的矩阵(col-1和col-2是两个均值向量)

mu=matrix(c(1,5,4,
                5,8,9), nrow =3,ncol=2)
mu
         [,1] [,2]
    [1,]    1    5
    [2,]    5    8
    [3,]    4    9

对应的协方差矩阵为

sig1=matrix(c(diag(1,3,3),
            diag(4,3,3)), nrow = 3, ncol = 3*2, byrow = F)
sig1
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    1    0    0    4    0    0
[2,]    0    1    0    0    4    0
[3,]    0    0    1    0    0    4

前三列是均值向量-1(i,e col-1 of mu) 的协方差矩阵,最后三列是均值向量-2(i,e, col-2 of mu) 的协方差矩阵mu) 我想使用 mvrnorm 为每个均值向量和协方差矩阵生成数据

我想创建一个 2 by 3 阶矩阵,其中第一行是 mvrnorm(1,mu[,1],sig1[,1:3]) 的输出,第二行是 mvrnorm(1,mu[,2],sig1[,4:6]) 的输出 我可以使用任何循环或内置函数来完成吗? 感谢任何帮助

您可以创建一个序列,在每一列对 mu 进行子集化,并在每 3 列对 sig1 进行子集化,并将其传递给 mvrnorm 函数。

t(sapply(seq_len(ncol(mu)), function(x) {
   ind <- (x - 1) * 3 
   MASS::mvrnorm(1,mu[,x],sig1[, (ind + 1):(ind + 3)])
}))

#       [,1]   [,2]   [,3]
#[1,] 1.0665 3.5964 4.4052
#[2,] 4.9421 9.7464 9.6109

我们可以使用 for 循环

out <- vector('list', ncol(mu))
sig2 <- list(sig1[, 1:3], sig1[, 4:6])
for(i in seq_len(ncol(mu))) out[[i]] <- MASS::mvrnorm(1, mu[, i], sig2[[i]])

mapply

mapply(function(x, y) MASS::mvrnorm(n = 1, mu = c(x), Sigma = y), 
         asplit(mu, 2), list(sig1[, 1:3], sig1[, 4:6]))

split 'sig1' 和 rep

的列序列
mapply(function(x, y) MASS::mvrnorm(n = 1, mu = c(x), 
        Sigma = sig1[, y]), 
          asplit(mu, 2),  split(seq_len(ncol(sig1)), rep(1:2, each = 3)))

如果您只关心均值,一个更简单的解决方案是简单地从标准多元数据生成数据,即 MVN(0, Sigma) - 然后向其添加不同的均值。如果您有大量数据,这可能会更快。

例如mus + rmvnorm(n, sigma=Sig)