在 R 中编写嵌套的 while 循环

Writing a nested while loop in R

我知道已经有很多关于 R 中的 while 循环的问题,但我已经看过其中的大部分并且 none 似乎解决了这个问题。

我正在运行对无法准确模拟的变量 (vanq) 进行模拟研究。因此,我不是随机生成两组 vanq 的值然后测试各种测试的稳健性,而是使用 vanq 观察的大型数据集并随机为其分配组(基本上做同样的事情,但向后)。要正确执行此操作,我需要生成满足以下所有条件的组:

  1. 每组的平均 vanq 值相差小于 0.0001
  2. 每组的中值 vanq 值相差小于 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)
}

但是,满足这些条件需要一个多小时,因为获得 p.values 大约需要 12 秒,并且有几百次尝试满足所有条件。通常我会让它 运行,但我需要对另外三个组执行此操作,然后执行相同的程序,但直到均值相差 > 1,中位数相差 > 1,并且所有 p.values < 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    
}

我的想法是,通过仅在满足均值和中值条件后进行测试,我可以大大加快此过程。我曾尝试添加各种其他流量控制(ifbreaknext 等),但没有成功。我真正需要的是 go to line 命令,但在 R 中似乎不存在。非常感谢任何帮助。

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

老实说,我不确定您的控制流程是什么,但也许这就是您需要的?

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)
    }
}