在較早的問題(R:不尊重邏輯條件)中,我學習了如何進行以下模擬:
步驟1:不斷生成兩個亂數“a”和“b”,直到“a”和“b”都大于12
第 2 步:跟蹤在完成第 1 步之前必須生成多少亂數
步驟 3:重復步驟 1 和步驟 2 100 次
res <- matrix(0, nrow = 0, ncol = 3)
for (j in 1:100){
a <- rnorm(1, 10, 1)
b <- rnorm(1, 10, 1)
i <- 1
while(a < 12 | b < 12) {
a <- rnorm(1, 10, 1)
b <- rnorm(1, 10, 1)
i <- i 1
}
x <- c(a,b,i)
res <- rbind(res, x)
}
head(res)
[,1] [,2] [,3]
x 12.14232 12.08977 399
x 12.27158 12.01319 1695
x 12.57345 12.42135 302
x 12.07494 12.64841 600
x 12.03210 12.07949 82
x 12.34006 12.00365 782
問題:現在,我想對上面的代碼做一點修改 - 而不是“a”和“b”分別產生,我希望它們“一起”產生(在數學術語中:“a”和“b” " 由兩個獨立的單變數正態分布產生,現在我希望它們來自雙變數正態分布)。
我試圖自己修改這段代碼:
library(MASS)
Sigma = matrix(
c(1,0.5, 0.5, 1), # the data elements
nrow=2, # number of rows
ncol=2, # number of columns
byrow = TRUE) # fill matrix by rows
res <- matrix(0, nrow = 0, ncol = 3)
for (j in 1:100){
e_i = data.frame(mvrnorm(n = 1, c(10,10), Sigma))
e_i$i <- 1
while(e_i$X1 < 12 | e_i$X2 < 12) {
e_i = data.frame(mvrnorm(n = 1, c(10,10), Sigma))
e_i$i <- i 1
}
x <- c(e_i$X1, e_i$X2 ,i)
res <- rbind(res, x)
}
res = data.frame(res)
但這會產生以下錯誤:
while (e_i$X1 < 12 | e_i$X2 < 12) { 中的錯誤:引數長度為零
uj5u.com熱心網友回復:
如果我正確理解了您的代碼,您是在嘗試查看在兩個值 >=12 之前出現了多少個樣本,并進行了 100 次試驗?這是我將采取的方法:
library(MASS)
for(i in 1:100){
n <- 1
while(any((x <- mvrnorm(1, mu=c(10,10), Sigma=diag(0.5, nrow=2) 0.5))<12)) n <- n 1
if(i==1) res <- data.frame("a"=x[1], "b"=x[2], n)
else res <- rbind(res, data.frame("a"=x[1], "b"=x[2], n))
}
在這里,我分配mvrnorm的結果x的范圍內while()呼叫。在同一個呼叫中,它使用該any()函式評估任一值是否小于 12 。如果計算結果為FALSE,n(計數器)增加并重復該程序。一次TRUE,將值附加到您的 data.frame 并回傳到 for 回圈的開頭。
關于您的代碼,該mvrnorm()函式回傳一個向量,而不是一個矩陣,當n=1兩個值都進入 data.frame 中的單個變數時:
data.frame(mvrnorm(n = 1, c(10,10), Sigma))
回傳:
mvrnorm.n...1..c.10..10...Sigma.
1 9.148089
2 10.605546
matrix()您data.frame()呼叫中的函式以及對 使用的一些調整i將修復您的代碼:
library(MASS)
Sigma = matrix(
c(1,0.5, 0.5, 1), # the data elements
nrow=2, # number of rows
ncol=2, # number of columns
byrow = TRUE) # fill matrix by rows
res <- matrix(0, nrow = 0, ncol = 3)
for (j in 1:10){
e_i = data.frame(matrix(mvrnorm(n = 1, c(10,10), Sigma), ncol=2))
i <- 1
while(e_i$X1[1] < 12 | e_i$X2[1] < 12) {
e_i = data.frame(matrix(mvrnorm(n = 1, c(10,10), Sigma), ncol=2))
i <- i 1
}
x <- c(e_i$X1, e_i$X2 ,i)
res <- rbind(res, x)
}
res = data.frame(res)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/368657.html
