2017-01-27 9 views
0

Я знаю, что есть много вопросов о циклах в R, но я смотрел, хотя большинство из них и никто, кажется, не затрагивает эту проблему.Запись вложенного цикла while в R

Я запускаю симуляционное исследование переменной (vanq), которая не может быть точно смоделирована. Таким образом, вместо случайного генерирования значений vanq для двух групп, а затем тестирования надежности различных тестов, я использую большой набор данных наблюдений ван и случайным образом назначая группы (в основном, делая то же самое, но наоборот). Для того, чтобы сделать это правильно, мне нужно, чтобы создать группы, которые удовлетворяют все следующие условия:

  1. о среднем Ванга значение каждой группы отличается менее чем 0,0001
  2. медианного Вангом значения каждой группы отличается менее чем 0.0001 (оптимально 0)
  3. три испытания, которые я использую все дают p.values> 0,5

до сих пор код у меня есть это:

#generate two random groups of equal size 
mydata$X.5.NS = rbinom(nrow(mydata),1,0.5) 

while(

    #any of the tests give p.values less than 0.5 
    min(
     t.test(mydata$vanq~mydata$X.5.NS, var.equal = TRUE)$p.value, 
     t.test(mydata$vanq~mydata$X.5.NS, var.equal = FALSE)$p.value, 
     wilcox.test(mydata$vanq~mydata$X.5.NS)$p.value) < 0.5 | 

    # or the means differ by more than 0.0001 
    abs(mean(mydata$vanq[ mydata$X.5.NS == 0]) - 
     mean(mydata$vanq[ mydata$X.5.NS == 1])) > 0.0001 | 

    #or the medians differ by more than 0 
    abs(median(mydata$vanq[ mydata$X.5.NS == 0]) - 
     median(mydata$vanq[ mydata$X.5.NS == 1])) > 0 
) 

{ 
#re-assign the random groups 
mydata$X.5.NS = rbinom(nrow(mydata),1,0.5) 
} 

Однако для удовлетворения этих условий требуется час, потому что требуется около 12 секунд, чтобы получить p.values ​​и пару сотен попыток выполнить все условия. Обычно я просто позволял ему работать, но мне нужно сделать это еще для трех групп, а затем выполнить ту же процедуру, но до тех пор, пока средства не будут отличаться на> 1, медианы будут отличаться на> 1, а все p.значения равны < 0,05, которая занимает значительно больше времени.

То, что я хотел бы сделать что-то вроде этого:

while(
#the means differ by more than 0.0001 
    abs(mean(mydata$vanq[ mydata$X.5.NS == 0]) - 
     mean(mydata$vanq[ mydata$X.5.NS == 1])) > 0.0001 | 

    #or the medians differ by more than 0 
    abs(median(mydata$vanq[ mydata$X.5.NS == 0]) - 
     median(mydata$vanq[ mydata$X.5.NS == 1])) > 0 
) 

{ 
#re-assign the random groups 
mydata$X.5.NS = rbinom(nrow(mydata),1,0.5) 
} 

#once the above conditions have been met, then perform the tests, 
if(min(
     t.test(mydata$vanq~mydata$X.5.NS, var.equal = TRUE)$p.value, 
     t.test(mydata$vanq~mydata$X.5.NS, var.equal = FALSE)$p.value, 
     wilcox.test(mydata$vanq~mydata$X.5.NS)$p.value) < 0.5) 
{ 
#if any of the p.values were > 0.5, go back to the top of the while loop  
} 

Идея заключается в том, что, тестируя только один раз среднее значение и медиана условия были выполнены, я могу ускорить этот процесс много. Я попытался добавить различные другие элементы управления потоком (if, break, next и т. Д.), Не повезло. Мне действительно нужна команда go to line, но, похоже, она не существует в R. Любая помощь очень ценится.

Here's a flow chart of the process I'm trying to code.

ответ

0

Я честно не уверен, что ваш поток управления, но, возможно, это то, что вам нужно?

while (min(t.test(mydata$vanq~mydata$X.5.NS, var.equal = TRUE)$p.value, 
      t.test(mydata$vanq~mydata$X.5.NS, var.equal = FALSE)$p.value, 
      wilcox.test(mydata$vanq~mydata$X.5.NS)$p.value) < 0.5)) { 
    while (
     # the means differ by more than 0.0001 
     abs(mean(mydata$vanq[ mydata$X.5.NS == 0]) - 
     mean(mydata$vanq[ mydata$X.5.NS == 1])) > 0.0001 || 

     # or the medians differ by more than 0 
     abs(median(mydata$vanq[ mydata$X.5.NS == 0]) - 
     median(mydata$vanq[ mydata$X.5.NS == 1])) > 0 
    ) { 
     # re-assign the random groups 
     mydata$X.5.NS = rbinom(nrow(mydata), 1, 0.5) 
    } 
} 

Все это можно сделать более удобным для чтения, обернув тесты в вызовы функций:

while (any_significant_p_value(mydata, alpha = 0.05)) { 
    while (mean_difference(mydata) > 0.0001 || median_difference(mydata) > 0) { 
     mydata = mydata$X.5.NS = rbinom(nrow(mydata), 1, 0.5) 
    } 
} 
+0

Закрыть. При этом он останавливается после того, как p.values> 0,5 и не оценивает средние или медианные различия. – JRF1111

+0

@ JRF1111 В этом случае я считаю, что единственным средством правовой защиты является оценка * всех * условий в одной и той же головке цикла. Тем не менее, вы можете/должны использовать короткозамкнутые логические операторы '&&' и '||' вместо некороткозамкнутых, '|' и '&'. Таким образом, оцениваются только необходимые условия: если первый тест уже выполняется, остальное не нужно тестировать на '||'. –

+0

это позор. Ну, я думаю, я просто позволю ему зайти на день (или два). RE коротких замыкающих логических операторов, я действительно хочу, чтобы все условия были выполнены. – JRF1111