如何在 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)
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)