如何将mvrnorm用于R中的多个均值向量

问题描述 投票:0回答:2

[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(mu的e,e col-1)的协方差矩阵,后三列是均值向量2(mu的均值向量(i,e,col-2))我想使用mvrnorm为每个均​​值向量和协方差矩阵生成数据

我想创建一个顺序为2 by 3的矩阵,其中第一行是mvrnorm(1,mu[,1],sig1[,1:3])的输出,第二行是mvrnorm(1,mu[,2],sig1[,4:6])的输出我可以使用任何循环或内置功能吗?任何帮助表示赞赏

r loops normal-distribution
2个回答
1
投票
您可以创建一个序列以在每列的mu子集和每三列的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


2
投票
我们可以使用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)))

© www.soinside.com 2019 - 2024. All rights reserved.