2014-09-23 157 views
0

所以,我试图用不同的方法从多元正态分布中生成随机数。我也试图使用apply函数,而不是for循环,这是问题发生的地方。这里是我的代码:R中的多元多元正态分布与应用

library(MASS) 
set.seed(123) 

# X and Y means 
Means<-cbind(c(.2,.2,.8),c(.2,.6,.8)) 
Means 
Sigma<-matrix(c(.01,0,0,.01),nrow=2) 
Sigma 

data<-apply(X=Means,MARGIN=1,FUN=mvrnorm,n=10,Sigma=Sigma) 
data 

而是获得两个向量与X和Y分三个手段,我得到的X和Y点堆叠三个矢量。获得这两个向量的最佳方式是什么?我知道我可以手动拆除它们,但是我觉得R应该有一些很好的方法来完成这个工作。

+0

WTB在这种情况下,行1:10属于'X'还是交替行? – akrun 2014-09-23 19:16:35

+0

如果您运行代码并查看“数据”的第二列,则前10个大约为0.2(秒X平均值),而后10个大约为0.6(第二个Y均值)。所以,我假设1:10行属于X. – WTB 2014-09-23 19:24:00

+0

WTB,通过使用'lapply'进行检查,似乎并非如此。 – akrun 2014-09-23 19:25:35

回答

0

结果它不知道检查,如果是我所说的“滑头”,但如果你真的想使用应用(而不是lapply如前所述),您可以强制应用返回您的结果作为矩阵列表。那么这只是一个坚持结果的问题。我预计这会比尝试重建一个两列矩阵更不容易出错。

data <- apply(Means, 1, function(x) { 
    list(mvrnorm(n=10, mu=x, Sigma=Sigma)) 
}) 
data <- do.call('rbind', unlist(data, recursive=FALSE)) 
0

尝试:

set.seed(42) 
res1 <- lapply(seq_len(nrow(Means)), function(i) mvrnorm(Means[i,], n=10, Sigma)) 

apply

set.seed(42) 
res2 <- apply(X=Means,MARGIN=1,FUN=mvrnorm,n=10,Sigma=Sigma) 
dim(res2) <- c(10,2, 3) 
res3 <-lapply(1:dim(res2)[3], function(i) res2[,,i]) 
all.equal(res3, res1, check.attributes=FALSE) 
#[1] TRUE