Fisher kesin testi düzgün olmayan p değerleri verir


12

Fisher'in kesin testini simüle edilmiş bir genetik problemde uygulamaya çalışıyorum, ancak p değerleri sağa eğik görünüyor. Bir biyolog olarak, sanırım her istatistikçi için açık bir şey eksik, bu yüzden yardımlarınız için çok minnettar olurum.

Benim kurulumum şu şekildedir : (kurulum 1, marjinaller sabit değildir)
R'de 0 ve 1'lerden oluşan iki örnek rastgele üretilir. Her n = 500 örneği, 0 ve 1 örnekleme olasılıkları eşittir. Daha sonra her numunedeki 0/1 oranlarını Fisher kesin testi ile karşılaştırırım (sadece fisher.test; benzer sonuçlara sahip diğer yazılımları da denedim). Örnekleme ve test 30.000 kez tekrarlanır. Ortaya çıkan p değerleri şu şekilde dağıtılır: p-değeri dağılımı

Tüm p-değerlerinin ortalaması 0.0577'de 0.55, 5. persentildir. Dağıtım bile sağ tarafta süreksiz görünür.

Yapabildiğim her şeyi okudum, ancak bu davranışın normal olduğuna dair herhangi bir gösterge bulamıyorum - öte yandan, sadece simüle edilmiş veriler, bu yüzden herhangi bir önyargı için kaynak görmüyorum. Kaçırdığım herhangi bir düzenleme var mı? Çok küçük numune boyutları? Ya da belki tekdüze olarak dağılmaması ve p-değerlerinin farklı yorumlanması gerekir mi?
Yoksa bunu sadece bir milyon kez tekrarlamalı mıyım, 0,05 kantili bulmalı mıyım ve bunu gerçek verilere uyguladığımda bunu anlamlılık olarak mı kullanmalıyım?

Teşekkürler!


Güncelleme:

Michael M, 0 ve 1'in marjinal değerlerini düzeltmeyi önerdi. Şimdi p-değerleri çok daha iyi bir dağılım veriyor - maalesef, tekdüze değil, tanıdığım başka bir şekle sahip:

Sabit kenarlı p-vals

gerçek R kodunu ekleyerek: (kurulum 2, marjinaller düzeltildi)

samples=c(rep(1,500),rep(2,500))
alleles=c(rep(0,500),rep(1,500))
p=NULL
for(i in 1:30000){
  alleles=sample(alleles)
  p[i]=fisher.test(samples,alleles)$p.value
}
hist(p,breaks=50,col="grey",xlab="p-values",main="")

Son düzenleme:
Whuber'ın yorumlarda belirttiği gibi, alanlar binning nedeniyle bozuk görünüyor. Kurulum 1 (serbest marjinaller) ve kurulum 2 (sabit marjinaller) için QQ grafiklerini ekliyorum. Glen'in aşağıdaki simülasyonlarında da benzer grafikler görülüyor ve tüm bu sonuçlar aslında oldukça homojen görünüyor. Yardım için teşekkürler!

PVAL-qqplot


2
Simülasyonunuzu yalnızca grup boyutlarını (her biri 500) değil, aynı zamanda "1" (havuzlanmış örnek üzerinde) sabitini tutarken tekrarlamaya çalışın. Fisher kesin testinin p değeri bu "sabit marjinal dağılım" ayarı altında türetilir. Resim o zaman daha iyi görünüyor mu? Btw. p-değeri dağılımının, örnekleme dağılımının (yani hipergeometrik) ayrık doğasıyla tam olarak aynı olmasını bekleyemezsiniz.
Michael M

1
R kodunuza bakmanız faydalı olabilir.
konjugateprior

1
@Glen bana her yinelemede her iki örnek aynı sayıda 0s ve 1s (yani boş hipotez tutmak gerekir) veya yanlış mı?
bdeonovic

5
Bu histogramlar benim için oldukça eşit görünüyor. Histogramların olasılığı (veya frekansı) alan aracılığıyla gösterdiğini hatırlamanız gerekir . Sağdaki artan boşluklar (herhangi bir ayrıştırılmamış veri testinin p-değeri dağılımının kaçınılmaz ayrıklığı nedeniyle) çubuk yüksekliklerinin artmasına neden olur, ancak alanları neredeyse sabit gibi görünmektedir. Düzgünlüğü değerlendirmek için bir histogram kullanmak yerine, ampirik CDF'yi grafiğe alın.
whuber

2
Spesifik dağılımın yanı sıra, bu sorunun tamamen burada
yanıtlandığı görülüyor

Yanıtlar:


10

Sorun, verilerin ayrık olması, böylece histogramların aldatıcı olabilmesidir. Yaklaşık bir düzgün dağılım gösteren qqplots ile bir simülasyon kodladım.

library(lattice)
set.seed(5545)
TotalNo=300
TotalYes=450

pvalueChi=rep(NA,10000)
pvalueFish=rep(NA,10000)

for(i in 1:10000){
  MaleAndNo=rbinom(1,TotalNo,.3)
  FemaleAndNo=TotalNo-MaleAndNo
  MaleAndYes=rbinom(1,TotalYes,.3)
  FemaleAndYes=TotalYes-MaleAndYes
  x=matrix(c(MaleAndNo,FemaleAndNo,MaleAndYes,FemaleAndYes),nrow=2,ncol=2)
  pvalueChi[i]=chisq.test(x)$p.value
  pvalueFish[i]=fisher.test(x)$p.value
}

dat=data.frame(pvalue=c(pvalueChi,pvalueFish),type=rep(c('Chi-Squared','Fishers'),each=10000))
histogram(~pvalue|type,data=dat,breaks=10)
qqmath(~pvalue|type,data=dat,distribution=qunif,
       panel = function(x, ...) {
         panel.qqmathline(x, ...)
         panel.qqmath(x, ...)
       })

resim açıklamasını buraya girin

resim açıklamasını buraya girin


5
Histogramlardaki ya da ayrık verilerin çubuk grafiklerindeki bu tür ani yükselmeler ve düşüşler genellikle binicilik prosedürünün eserleridir. Onlara güvenmeyin: QQ grafikleri veya ECDF'lerin grafikleri gibi daha fazla dağılım grafiği kullanın. Gerçek olsalar bile, hiç kimse p-değerlerinin dağılımlarının karar vermek için önemli olduğu yerde yaklaşık olarak eşit ve doğru yoğunlukta olmasını sağlamayacaktır: sıfıra yakın aralıkta (ve kesinlikle 0,5'ten az).
whuber

Mükemmel nokta @whuber, qqplots ile güncelleyeceğim.
Glen

2
@whuber, Glen, çok teşekkürler! Aslında binicilik aldatıcıydı, çünkü Glen'in histogramlarını daha fazla aralara bölmek benimkine benzer bir desen verdi. Ayrıca simülasyonlarımla doğrusal ampirik CDF / QQ elde ediyorum, bu yüzden problem çözülmüş görünüyor.
juod

@ juod: örnek için qqplot ekleyebilirseniz, belki de her iki simülasyon için bile çok takdir edilecektir?
Michael M

Qq grafikleri gerçekten yardım ediyor - teşekkürler. Yine de cevabınızın ilk paragrafını değiştirmek istemiyor musunuz? Simülasyonla ilgili bir sorun olduğunu ve p-değeri dağılımında bir "artış" olduğunu hala sürdürüyor musunuz?
whuber
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.