在R中编写嵌套的while循环

时间:2017-01-27 16:06:03

标签: r while-loop logic flow-control

我知道关于R中的while循环已经有很多问题,但是我看过大多数问题但似乎都没有解决这个问题。

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

  1. 每组的平均vanq值相差小于0.0001
  2. 每组的中值vanq值相差小于0.0001(最佳为0)
  3. 我正在使用的三项测试都给出了p.values> 0.5
  4. 到目前为止,我的代码是:

    #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秒,并且需要几百次才能满足所有条件。通常我会让它运行,但我需要为另外三个组执行此操作,然后执行相同的过程,但直到平均值因为&gt; 1,中位数相差> 1,所有p值均<1。 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.

1 个答案:

答案 0 :(得分:0)

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

import matplotlib.pylab as plt

ax = plt.subplot(111)

ax.axvspan(0, 0.5, color = 'red', alpha = 0.13, lw=0)
ax.axvspan(0.5, 1, color = 'blue', alpha = 0.13, lw=0)

plt.show()

通过在函数调用中包装测试,可以使整个事物更具可读性:

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