2013-09-26 4 views
0

Кто-нибудь может мне помочь? Предположим, что «р» является полностью экзогенным и следует за равномерным распределением. Затем я хочу сгенерировать «z», который является фиктивным (= 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} 
     } 

    } 
+3

Вы не сохраняете результаты своего цикла 'for' в любом месте ... вы хотели? Можете ли вы описать, как код, который вы показали, работает неправильно? – Justin

ответ

4

Ваш цикл 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 
     } 

     } 
+0

THX так много! это то, что я хочу ~ – Chen

Смежные вопросы