Повторяйте цикл до тех пор, пока он не будет удовлетворять определенному условию.

Кто-нибудь может помочь мне в этом? Предположим, что «р» является полностью экзогенным и подчиняется равномерному распределению. Затем я хочу сгенерировать «z», который является фиктивным ИСТИНА (= 1) или ЛОЖЬ (= 0) и имеет свойство, состоящее в том, что суммирование каждых трех элементов (1-3, 4-6, 7-9,. .., 58-60) в "z" должно быть больше 0.

Например, если я получаю "z", например {1 0 0 1 1 0 0 0 0 0 1 0...}, я надеюсь повторить цикл снова (поскольку 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}
      }

   }

person Chen    schedule 26.09.2013    source источник
comment
Вы никуда не сохраняете результаты своего цикла for... вы хотели? Можете ли вы описать, почему показанный вами код работает неправильно?   -  person Justin    schedule 26.09.2013


Ответы (1)


Ваш цикл for генерирует новый z для каждого i. Я не думаю, что это то, что вы пытаетесь сделать. Насколько я понимаю, вы пытаетесь создать новый z, а затем используете цикл for со счетчиком i для проверки сумм трех последовательных элементов. Если это так, то вам нужно иметь один цикл для генерации новых z, а затем еще один внутри этого цикла, который проверяет сумму трех последовательных элементов.

Я думаю, это делает то, что вы хотите. Но когда я запускаю его, кажется маловероятным, что вы скоро получите удовлетворительный 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
         } 

      } 
person TheComeOnMan    schedule 26.09.2013