Uji eksak Fisher memberikan nilai-p yang tidak seragam

12

Saya mencoba menerapkan uji eksak Fisher dalam masalah genetika yang disimulasikan, tetapi nilai-p tampaknya condong ke kanan. Menjadi seorang ahli biologi, saya kira saya hanya kehilangan sesuatu yang jelas bagi setiap ahli statistik, jadi saya akan sangat menghargai bantuan Anda.

Setup saya adalah ini: (setup 1, marjinal tidak tetap)
Dua sampel 0s dan 1s dihasilkan secara acak dalam R. Setiap sampel n = 500, probabilitas pengambilan sampel 0 dan 1 sama. Saya kemudian membandingkan proporsi 0/1 dalam setiap sampel dengan uji eksak Fisher (hanya fisher.test; juga mencoba perangkat lunak lain dengan hasil yang sama). Pengambilan sampel dan pengujian diulang 30.000 kali. Nilai-p yang dihasilkan didistribusikan seperti ini: distribusi nilai-p

Nilai tengah dari semua nilai-p adalah sekitar 0,55, persentil ke-5 pada 0,0577. Bahkan distribusinya tampak terputus-putus di sisi kanan.

Saya sudah membaca semua yang saya bisa, tetapi saya tidak menemukan indikasi bahwa perilaku ini normal - di sisi lain, itu hanya data simulasi, jadi saya tidak melihat sumber untuk bias. Apakah ada penyesuaian yang saya lewatkan? Ukuran sampel terlalu kecil? Atau mungkin itu tidak seharusnya didistribusikan secara seragam, dan nilai-p ditafsirkan secara berbeda?
Atau haruskah saya mengulangi ini satu juta kali, menemukan kuantil 0,05, dan menggunakannya sebagai batas signifikan ketika saya menerapkan ini pada data aktual?

Terima kasih!


Memperbarui:

Michael M menyarankan untuk memperbaiki nilai marginal dari 0 dan 1. Sekarang nilai-p memberikan distribusi yang jauh lebih baik - sayangnya, itu tidak seragam, atau bentuk lain yang saya kenal:

p-vals dengan margin tetap

menambahkan kode R aktual: (pengaturan 2, marjinal tetap)

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

Suntingan terakhir:
Seperti ditunjukkan whuber dalam komentar, area hanya terlihat terdistorsi karena binning. Saya melampirkan plot-QQ untuk pengaturan 1 (marjin bebas) dan pengaturan 2 (marjin tetap). Plot serupa terlihat dalam simulasi Glen di bawah ini, dan semua hasil ini pada kenyataannya tampak agak seragam. Terima kasih untuk bantuannya!

pval-qqplot

anak muda
sumber
2
Coba ulangi simulasi Anda sambil menahan tidak hanya ukuran grup (masing-masing 500) tetapi juga jumlah "1" (lebih dari sampel yang dikumpulkan) konstan. Nilai p dari uji eksak Fisher diturunkan di bawah pengaturan "distribusi marginal tetap" ini. Apakah gambarnya terlihat lebih baik? Btw. Anda tidak dapat mengharapkan distribusi nilai-p persis sama dengan sifat distribusi sampel yang terpisah (yaitu hipergeometrik).
Michael M
1
Mungkin bermanfaat untuk melihat kode R Anda.
conjugateprior
1
@ Glen menurut saya dari kode bahwa dalam setiap iterasi kedua sampel memiliki jumlah 0s dan 1s yang sama (yaitu hipotesis nol seharusnya berlaku) atau apakah saya salah?
bdeonovic
5
Histogram ini terlihat sangat seragam bagi saya. Anda harus ingat bahwa histogram menampilkan probabilitas (atau frekuensi) melalui area . Meningkatnya celah ke kanan (karena diskresi yang tak terhindarkan dari distribusi nilai-p dari setiap tes data diskrit yang tidak diacak) menyebabkan ketinggian batang meningkat, tetapi area mereka tampaknya hampir konstan. Alih-alih menggunakan histogram untuk menilai keseragaman, buatlah grafik CDF empiris.
whuber
2
Selain dari distribusi spesifik, pertanyaan ini tampaknya sepenuhnya dijawab di sini
Glen_b -Reinstate Monica

Jawaban:

10

Masalahnya adalah data itu diskrit sehingga histogram bisa menipu. Saya membuat kode simulasi dengan qqplots yang menunjukkan perkiraan distribusi seragam.

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

masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini

Lembah kecil
sumber
5
Paku dan kemiringan seperti itu dalam histogram atau bagan batang data diskrit sering kali merupakan artefak dari prosedur binning. Jangan mempercayai mereka: gunakan plot distribusi yang lebih cerdas, seperti plot QQ atau grafik ECDF. Bahkan jika mereka nyata, tidak ada yang akan peduli asalkan distribusi nilai-p kurang lebih seragam dan dengan kepadatan yang tepat di mana hal itu penting untuk pengambilan keputusan: dalam interval mendekati nol (dan tentu saja kurang dari 0,5).
whuber
Excellent point @whuber, saya akan memperbarui dengan qqplots.
Glen
2
@whuber, Glen, terima kasih banyak! Sebenarnya binning itu menipu, karena hanya dengan memecah histogram Glen menjadi lebih banyak istirahat memberikan pola yang sama dengan saya. Dan saya juga mendapatkan CDF / QQ empiris linier dengan simulasi saya, jadi masalahnya tampaknya diselesaikan.
juod
@juod: akan sangat dihargai jika Anda bisa menambahkan qqplot untuk ilustrasi, bahkan mungkin untuk kedua simulasi?
Michael M
Plot qq sangat membantu - terima kasih. Namun, Anda tidak ingin mengubah paragraf pertama jawaban Anda? Apakah Anda masih mempertahankan ada masalah dengan simulasi dan bahwa ada "lonjakan" dalam distribusi nilai-p?
whuber