2017-01-27 2 views
0

많은 질문이 이미 R에있는 동안 알고 있지만 그 중 대부분이 보이지만 아무도이 문제를 해결하지 못하는 것 같습니다.중첩 된 while 루프 쓰기 R

정확하게 시뮬레이션 할 수없는 변수 (vanq)에 대한 시뮬레이션 스터디를 실행 중입니다. 그래서, 두 그룹에 대해 임의로 vanq 값을 생성 한 다음 다양한 테스트의 견고성을 테스트하는 대신, vanq 관측치의 큰 데이터 세트를 사용하고 그룹에 무작위로 그룹을 할당합니다 (기본적으로 동일한 작업을 수행하지만 역순으로 수행합니다). 각 그룹의 평균 vanq 값보다 작은 차이 각 그룹의

  1. 평균 vanq 값 미만 0.0001
  2. 차이 : 제대로 이렇게하려면, 나는 다음과 같은 조건을 모두 충족 그룹을 생성해야 나는 모두를 사용하고 0.0001 (최적 0)
  3. 세 가지 시험은 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) 
} 
,536,

그러나 p.values를 가져 오는 데 약 12 ​​초가 걸리고 모든 조건을 충족시키는 데 수백 시간이 걸리기 때문에 이러한 조건을 충족하는 데 1 시간 이상이 걸립니다. 일반적으로 나는 그것을 작동 시키도록 할 것이지만, 세 개의 다른 그룹에 대해 이것을 수행 할 필요가있다. 그리고 동일한 절차를 수행하지만, 평균이> 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.

답변

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

그것은 수치 스럽습니다. 오 잘, 나는 그것이 단지 하루 (또는 2) 동안 달리게 할 것이다 고 생각한다. RE 단락 논리 연산자, 나는 실제로 모든 조건을 충족시켜야합니다. – JRF1111