2017-01-27 7 views
0

私は既にRのwhileループについて多くの疑問があることを知っていますが、ほとんどが見えましたが、どれもこの問題に対処していないようです。入れ子のwhileループを書くには

正確にシミュレートできない変数(vanq)についてシミュレーション研究を行っています。したがって、2つのグループのためにvanqの値を無作為に生成し、さまざまなテストの頑健性をテストする代わりに、vanq観測の大きなデータセットを使用してグループをランダムに割り当てます(基本的に同じことをしますが、後方に)。各グループの中央vanq値がより少ないことにより、異なる各グループの

  1. 平均vanq値が0.0001未満
  2. によって異なります。これを適切に行うために、私は、以下の条件をすべて満たすグループを生成する必要があります0.0001(最適0)
  3. 私はすべてを使用しています3つのテストは0.5

これまでのところ、私が持っているコードはこれです> p.valuesを与える:

#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時間以上かかる。通常、私はそれを実行させようとしますが、3つ以上のグループに対してこれを行う必要があります。同じ手順を実行しますが、手段が> 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.

答えて

0

私は正直にあなたの制御フローが何であるかわからないが、多分これは何が必要でしょうか?

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

閉じます。それで、p.valuesが> 0.5になると停止し、平均値または中央値の差を評価しません。 – JRF1111

+0

@ JRF1111その場合、私は、同じループヘッド内のすべての条件を評価することだけが唯一の手段だと思います。しかし、短絡されていない論理演算子 '&&'と '&|'の代わりに '<'と '&'を使うことができます。そうすれば、必要な条件だけが評価されます。最初のテストがすでに成功している場合、残りのテストは '||'のためにテストする必要はありません。 –

+0

それは残念です。ああ、私はそれを1日(または2日)実行させてくれると思う。 RE短絡された論理演算子、私は実際にすべての条件を満たすことを望む。 – JRF1111

関連する問題