我知道关于R中的while循环已经有很多问题,但是我看过大多数问题但似乎都没有解决这个问题。
我正在对无法准确模拟的变量(vanq)进行模拟研究。因此,我不是随机生成两组的vanq值,然后测试各种测试的稳健性,而是使用vanq观察的大型数据集并随机分配组(基本上做同样的事情,但是向后)。为了正确地做到这一点,我需要生成满足以下所有条件的组:
到目前为止,我的代码是:
#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
}
这个想法是,只要测试一次平均值和中位数条件,我就可以加快这个过程。我试过添加各种其他流量控件(if
,break
,next
等等,但没有运气。我真正需要的是一个go to line
命令,但在R中似乎没有。任何帮助都非常感谢。
答案 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)
}
}