0

任何人都可以帮助我吗?假设“p”是完全外生的并且服从均匀分布。然后我想生成“z”,它是一个 TRUE(=1) 或 FALSE(=0) 虚拟对象,并且具有每个三个元素(1-3、4-6、7-9、. .., 58-60) in "z" 应该大于 0。

例如,如果我得到一个像 {1 0 0 1 1 0 0 0 0 0 1 0...} 这样的“z”,我希望再次重复循环(因为 sum(z[7:9])=0 )绘制一个不同的“错误”,直到我得到一个新的“z”,例如 {1 1 0 0 0 1 0 1 0 1 0 0...},其中每三个元素的所有总和都大于 0。我使用的代码是如下。我哪里错了?

   set.seed(005)
   p<-runif(60, 0, 1)

   for (i in 1:20) {

     repeat {
       error= -0.2*log((1/runif(60, 0, 1))-1) # a random component
       z=(p<0.5+error) # TRUE/FALSE condition
       z=replace(z, z==TRUE, 1) # replace z to 1 if z is true, else z=0

       if (sum(z[(3*i-2):(3*i)])>0) {break}
      }

   }
4

1 回答 1

4

您的 for 循环为每个 i 生成一个新 z。我不认为那是你想要做的。据我了解,您正在尝试生成一个新 z ,然后使用带有计数器 i 的 for 循环来检查三个连续元素的总和。如果是这样,那么你需要有一个循环来生成新的 zs,然后在这个循环中再有一个循环来检查三个连续元素的总和。

我认为这可以满足您的要求。但是当我运行它时,您似乎不太可能很快得到满意的 z。

   set.seed(005)
   p<-runif(60, 0, 1)

   invalidentriesexist =1

      while(invalidentriesexist == 1) {
         error = -0.2*log((1/runif(60, 0, 1))-1) # a random component
         z=(p<0.5+error) # TRUE/FALSE condition

         z=replace(z, z==TRUE, 1) # replace z to 1 if z is true, else z=0
         z=replace(z, z==FALSE, 0) # replace z to 1 if z is true, else z=0

         invalidentriesexist = 0
         i = 1
         while ( i <=20 & invalidentriesexist == 0 ) {
            invalidentriesexist = 0
            if (sum(z[((3*i)-2):(3*i)])==0) {invalidentriesexist = 1}
            cat(i,'\n')
            cat(invalidentriesexist,'\n')
            cat(paste(z,collapse = ","),'\n')
            cat(z[((3*i)-2):(3*i)],'\n\n')
            i = i + 1
         } 

      } 
于 2013-09-26T20:06:22.590 回答