2013-06-29 2 views
2

한 실험에서 4 그룹 (치료)이되도록 각 그룹에 50 명의 개체 (피험자)가 있도록 3000 회 실험을 설계했습니다. 각각의 실험에서 표준 일원 분산 분석을 수행하고 그들의 p.values가 null 가설 하에서 단일 확률 함수를 갖고 있는지 증명하지만, ks.test는이 가정을 거부하고 왜 그런지 볼 수 없습니까?Kolmogorov Smirnov Test in R

subject<-50 
treatment<-4 
experiment<-list() 
R<-3000 
seed<-split(1:(R*subject),1:R) 
for(i in 1:R){ 
    e<-c() 
    for(j in 1:subject){ 
    set.seed(seed[[i]][j]) 
    e<-c(e,rmvnorm(mean=rep(0,treatment),sigma=diag(3,4),n=1,method="chol")) 
    } 
    experiment<-c(experiment,list(matrix(e,subject,treatment,byrow=T))) 
} 

p.values<-c() 
for(e in experiment){ 
    d<-data.frame(response=c(e),treatment=factor(rep(1:treatment,each=subject))) 
    p.values<-c(p.values,anova(lm(response~treatment,d))[1,"Pr(>F)"]) 
} 

ks.test(p.values, punif,alternative = "two.sided") 
+1

"다중 비교를위한 수정"은 어떤 의미입니까? – zwol

+0

아니요. 사실, 위키 피 디아에서 읽었을 때 시뮬레이션 결과와 관련성이 없습니다. 저는 독립적 인 실험을 설계하고 각 실험마다 단 하나의 가설만을 테스트했습니다. – Klaus

+2

@Zack 시뮬레이션 연구입니다. OP는 실험 당 하나의 P 값을 계산하지만 P 값 통계의 속성을 검사하기 위해 여러 번 반복합니다. –

답변

8

코드에서 임의 시드를 변경하고 P 값이 .34 인 줄을 주석 처리했습니다. 그것은 알려지지 않은 씨앗 이었기 때문에 재현성을 위해 set.seed(1)을 실행하고 다시 실행했습니다. 이번에는 0.98의 P 값을 얻었다.

이것이 차이를 만드는 이유는 PRNGs의 전문가는 아니지만 괜찮은 발전기는 연속적인 추첨이 모든 실제적인 목적을 위해 통계적으로 독립적임을 보장합니다. 가장 좋은 것들은 더 큰 시차를 위해 동일하게 할 것입니다. 예를 들어 메르 센 트위스터는 R의 기본 PRNG가 623 (IIRC)까지 래깅을 보장합니다. 실제로, 씨앗에 간섭하면 추첨의 통계적 특성이 손상 될 가능성이 있습니다.

코드는 또한 실제로 비효율적 인 방식으로 작업을 수행합니다. 실험 목록을 만들고 각 실험에 하나의 항목을 추가하고 있습니다. 각 실험에서 내에서 행렬을 만들고 각 관측치에 행을 추가합니다. 그런 다음 P 값에 대해 매우 유사한 작업을 수행합니다. 내가 고칠 수 있는지 알게 될거야.

이것은 코드를 바꾸는 방법입니다. 엄밀히 말하면 수식을 피하고 맨손 모델 행렬을 만들고 lm.fit을 직접 호출하여 더 강하게 만들 수 있습니다. 그러나 이는 단지 anova을 호출하는 것보다 ANOVA 테스트를 직접 코딩해야한다는 것을 의미합니다. 이는 가치가있는 것보다 더 큰 문제입니다.

set.seed(1) # or any other number you like 

x <- factor(rep(seq_len(treatment), each=subject)) 
p.values <- sapply(seq_len(R), function(r) { 
    y <- rnorm(subject * treatment, s=3) 
    anova(lm(y ~ x))[1,"Pr(>F)"] 
}) 
ks.test(p.values, punif,alternative = "two.sided") 


     One-sample Kolmogorov-Smirnov test 

data: p.values 
D = 0.0121, p-value = 0.772 
alternative hypothesis: two-sided 
+0

모든 rn에 대해서만 set.seed (1) 세대, 그 실험의 디자인을 변경합니다. 코드의 효율성에 대한 귀하의 의견과 관련하여이 코드는 효율적이지는 않지만이 골격을 복잡한 복잡한 작업에 사용하고 위의 특정 디자인을 복사하여 붙여 넣으려고했습니다. 내 질문은 r.n. 세대. – Klaus

+0

루프 내에서'set.seed (1)'을 사용하지 않습니다. 한 번 시드를 ONCE로 설정 한 다음 코드를 실행합니다 (시드를 다시 설정하는 행을 주석 처리 한 후). –

+0

좋아, 나는 set.seed의 의미를 오해했다. 나는 r.n.의 모든 전화 전에 그것을 설정해야한다고 생각. 반복 가능한 데이터를 얻기위한 함수 생성.두 번째는 rnvorm을 사용할 경우 rnorm을 씨앗을 설정하는 데 사용하는 경우에도 "훌륭한 가치"를 얻는다는 것입니다. 그래서 시드를 설정하면 문제가 해결 될 것입니다. – Klaus