2014-09-23 32 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