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

提问人:stats_noob 提问时间:11/25/2021 最后编辑:user438383stats_noob 更新时间:11/25/2021 访问量:51

问:

在前面的问题(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) { : 参数的长度 零

R 循环 仿真 数据操作

评论

0赞 rg255 11/25/2021
@stats555 我刚刚更新了答案以修复您现有的代码 - 您需要处理几个问题

答:

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 循环的开头。xwhile()any()FALSEnTRUE


关于您的代码,该函数返回一个向量,而不是一个矩阵,因此这两个值都进入 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 列感到困惑。将来,我会记得将模拟结果存储到矩阵中!