2017-01-27 3 views
0

Ich weiß, es gibt bereits zahlreiche Fragen über While-Schleifen in R, aber ich habe die meisten von ihnen untersucht und keines scheint dieses Problem zu lösen.Ich schreibe eine geschachtelte while-Schleife in R

Ich führe eine Simulationsstudie über eine Variable (vanq) durch, die nicht genau simuliert werden kann. Anstatt also willkürlich Werte von vanq für zwei Gruppen zu erzeugen und dann die Robustheit verschiedener Tests zu testen, verwende ich einen großen Datensatz von vanq-Beobachtungen und zufallsbestimmenden Gruppen dazu (im Grunde dasselbe, aber rückwärts). Richtig machen dies, ich brauche Gruppen zu erzeugen, die alle folgenden Bedingungen erfüllen:

  1. Die mittlere Vanq Werte jeder Gruppe unterscheiden sich von weniger als 0,0001
  2. Die mittlere Vanq Werte jeder Gruppe von weniger unterscheiden als 0,0001 (optimal 0)
  3. die drei Tests, die ich alle sind mit geben p.values> 0,5

Bisher ist der Code, den ich habe, ist dies:

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

Es dauert jedoch über eine Stunde, diese Bedingungen zu erfüllen, denn es dauert etwa 12 Sekunden, um die p.Values ​​zu erhalten, und ein paar hundert Versuche, um alle Bedingungen zu erfüllen. Normalerweise würde ich es einfach laufen lassen, aber ich muss dies für drei weitere Gruppen tun, und mache dann die gleiche Prozedur, aber bis sich die Mittelwerte um> 1 unterscheiden, unterscheiden sich die Medianwerte um> 1, und alle p.Werte sind < 0,05, das dauert wesentlich länger.

Was ich möchte, ist, etwas zu tun wie folgt aus:

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  
} 

Die Idee ist, dass nur die Prüfung, wenn der Mittelwert und Median Bedingungen erfüllt sind, habe ich diesen Prozess viel nach oben beschleunigen kann. Ich habe versucht, verschiedene andere Flusskontrollen (if, break, next, etc.) ohne Glück hinzuzufügen. Was ich wirklich brauche, ist ein go to line Befehl, aber das scheint in R nicht zu existieren. Jede Hilfe wird sehr geschätzt.

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

Antwort

0

Ich bin ehrlich gesagt nicht sicher, was Ihr Steuerfluss ist aber vielleicht ist es das, was Sie brauchen?

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

Das Ganze kann besser lesbar gemacht werden durch Umwickeln der Tests in Funktion aufruft:

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

Schließen. Damit stoppt es, sobald die p-Werte> 0,5 sind und bewertet nicht die mittleren oder mittleren Unterschiede. – JRF1111

+0

@ JRF1111 In diesem Fall denke ich, dass die einzige Möglichkeit darin besteht, * alle * Bedingungen im selben Schleifenkopf zu bewerten. Sie können/sollten jedoch kurzgeschlossene logische Operatoren '&&' und '||' anstelle der nicht kurzgeschlossenen, '|' und '&' verwenden. Auf diese Weise werden nur die notwendigen Bedingungen ausgewertet: Wenn der erste Test bereits erfolgreich ist, muss der Rest nicht auf '||' getestet werden. –

+0

das ist eine Schande. Naja, ich denke, ich lasse es einfach einen oder zwei Tage laufen. RE die kurzgeschlossenen logischen Operatoren, ich möchte eigentlich, dass alle Bedingungen erfüllt sind. – JRF1111

Verwandte Themen