在 R 中编写嵌套的 while 循环
Writing a nested while loop in R
我知道已经有很多关于 R 中的 while 循环的问题,但我已经看过其中的大部分并且 none 似乎解决了这个问题。
我正在运行对无法准确模拟的变量 (vanq) 进行模拟研究。因此,我不是随机生成两组 vanq 的值然后测试各种测试的稳健性,而是使用 vanq 观察的大型数据集并随机为其分配组(基本上做同样的事情,但向后)。要正确执行此操作,我需要生成满足以下所有条件的组:
- 每组的平均 vanq 值相差小于 0.0001
- 每组的中值 vanq 值相差小于 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)
}
但是,满足这些条件需要一个多小时,因为获得 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
}
我的想法是,通过仅在满足均值和中值条件后进行测试,我可以大大加快此过程。我曾尝试添加各种其他流量控制(if
、break
、next
等),但没有成功。我真正需要的是 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)
}
}
我知道已经有很多关于 R 中的 while 循环的问题,但我已经看过其中的大部分并且 none 似乎解决了这个问题。
我正在运行对无法准确模拟的变量 (vanq) 进行模拟研究。因此,我不是随机生成两组 vanq 的值然后测试各种测试的稳健性,而是使用 vanq 观察的大型数据集并随机为其分配组(基本上做同样的事情,但向后)。要正确执行此操作,我需要生成满足以下所有条件的组:
- 每组的平均 vanq 值相差小于 0.0001
- 每组的中值 vanq 值相差小于 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)
}
但是,满足这些条件需要一个多小时,因为获得 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
}
我的想法是,通过仅在满足均值和中值条件后进行测试,我可以大大加快此过程。我曾尝试添加各种其他流量控制(if
、break
、next
等),但没有成功。我真正需要的是 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)
}
}