簡體   English   中英

在R中使用Kolmogorov Smirnov檢驗

[英]Using Kolmogorov Smirnov Test in R

我設計了3000個實驗,因此在一個實驗中有4組(治療),每組有50個人(受試者)。 對於每個實驗,我做一個標准的單因素方差分析並證明它們的p值是否在零假設下具有單概率函數,但是ks.test拒絕這個假設,我不明白為什么?

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

我注釋掉了代碼中改變隨機種子的行,得到的P值為.34。 這是一個未知的種子,所以為了重現性,我做了set.seed(1)並再次運行它。 這一次,我的P值為0.98。

至於為什么這會產生影響,我不是PRNG的專家,但任何體面的發電機都會確保連續的抽獎在統計上獨立於所有實際目的。 最好的那些將確保相同的更大的滯后,例如Mersenne Twister是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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM