Я знаю, что есть много вопросов о циклах в R, но я смотрел, хотя большинство из них и никто, кажется, не затрагивает эту проблему.Запись вложенного цикла while в R
Я запускаю симуляционное исследование переменной (vanq), которая не может быть точно смоделирована. Таким образом, вместо случайного генерирования значений vanq для двух групп, а затем тестирования надежности различных тестов, я использую большой набор данных наблюдений ван и случайным образом назначая группы (в основном, делая то же самое, но наоборот). Для того, чтобы сделать это правильно, мне нужно, чтобы создать группы, которые удовлетворяют все следующие условия:
- о среднем Ванга значение каждой группы отличается менее чем 0,0001
- медианного Вангом значения каждой группы отличается менее чем 0.0001 (оптимально 0)
- три испытания, которые я использую все дают 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.
Закрыть. При этом он останавливается после того, как p.values> 0,5 и не оценивает средние или медианные различия. – JRF1111
@ JRF1111 В этом случае я считаю, что единственным средством правовой защиты является оценка * всех * условий в одной и той же головке цикла. Тем не менее, вы можете/должны использовать короткозамкнутые логические операторы '&&' и '||' вместо некороткозамкнутых, '|' и '&'. Таким образом, оцениваются только необходимые условия: если первый тест уже выполняется, остальное не нужно тестировать на '||'. –
это позор. Ну, я думаю, я просто позволю ему зайти на день (или два). RE коротких замыкающих логических операторов, я действительно хочу, чтобы все условия были выполнены. – JRF1111