提问人:stats_noob 提问时间:11/25/2021 最后编辑:user438383stats_noob 更新时间:11/25/2021 访问量:51
Error in while (e_i$X1 < 12 | e_i$X2 < 12) { : 参数长度为零
Error in while (e_i$X1 < 12 | e_i$X2 < 12) { : argument is of length zero
问:
在前面的问题(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)
但这会产生以下错误:
Error in while (e_i$X1 < 12 | e_i$X2 < 12) { : 参数的长度 零
答:
2赞
rg255
11/25/2021
#1
如果我正确理解了您的代码,您是否正在尝试查看在两个值都 >=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 的结果分配给调用中。在同一调用中,它使用该函数评估两者是否小于 12。如果计算结果为 ,则增加(计数器)并重复该过程。一旦 ,这些值就会被附加到 data.frame 中,然后它又回到了 for 循环的开头。x
while()
any()
FALSE
n
TRUE
关于您的代码,该函数返回一个向量,而不是一个矩阵,因此这两个值都进入 data.frame 中的单个变量:mvrnorm()
n=1
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)
评论
0赞
stats_noob
11/26/2021
@RG255:非常感谢您的回答!我也注意到了这个问题“ mvrnorm.n...1..c.10..10...Sigma.“ 当我检查模拟的输出时,我对为什么输出有 2 行和 1 列,而不是 1 行和 2 列感到困惑。将来,我会记得将模拟结果存储到矩阵中!
评论