Повтаряйте цикъл, докато не удовлетвори определено условие

Някой може ли да ми помогне по въпроса? Да предположим, че "p" е напълно екзогенно и следва равномерно разпределение. След това искам да генерирам "z", което е TRUE(=1) или FALSE(=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, за да проверите за суми от три последователни елемента. Ако е така, тогава трябва да имате един цикъл, за да генерирате нови 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
         } 

      } 
person TheComeOnMan    schedule 26.09.2013