Der exakte Fisher-Test ergibt ungleichmäßige p-Werte

12

Ich versuche, den exakten Fisher-Test bei einem simulierten genetischen Problem anzuwenden, aber die p-Werte scheinen nach rechts verschoben zu sein. Als Biologe vermisse ich wohl jedem Statistiker etwas Offensichtliches, daher würde ich mich sehr über Ihre Hilfe freuen.

Mein Setup lautet wie folgt: (Setup 1, Ränder nicht festgelegt)
Zwei Stichproben von 0 und 1 werden zufällig in R generiert. Bei jeder Stichprobe n = 500 sind die Wahrscheinlichkeiten für die Stichproben 0 und 1 gleich. Ich vergleiche dann die Anteile von 0/1 in jeder Probe mit dem exakten Fisher-Test (nur fisher.test; habe auch andere Software mit ähnlichen Ergebnissen ausprobiert). Die Probenahme und Prüfung wird 30 000 Mal wiederholt. Die resultierenden p-Werte sind wie folgt verteilt: p-Wert-Verteilung

Der Mittelwert aller p-Werte liegt bei 0,55, 5. Perzentil bei 0,0577. Sogar die Verteilung erscheint auf der rechten Seite diskontinuierlich.

Ich habe alles gelesen, was ich kann, aber ich finde keinen Hinweis darauf, dass dieses Verhalten normal ist. Andererseits handelt es sich nur um simulierte Daten, sodass ich keine Quellen für Verzerrungen sehe. Gibt es eine Anpassung, die ich verpasst habe? Zu kleine Stichprobengrößen? Oder soll es nicht gleichmäßig verteilt sein und die p-Werte unterschiedlich interpretiert werden?
Oder sollte ich dies einfach millionenfach wiederholen, das 0,05-Quantil finden und es als Signifikanzgrenzwert verwenden, wenn ich dies auf tatsächliche Daten anwende?

Vielen Dank!


Aktualisieren:

Michael M schlug vor, die Randwerte von 0 und 1 festzulegen. Jetzt ergeben die p-Werte eine viel schönere Verteilung - leider ist sie weder einheitlich noch von einer anderen Form, die ich erkenne:

p-vals w feste Ränder

Hinzufügen des tatsächlichen R-Codes: (Setup 2, Ränder fest)

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

Endgültige Bearbeitung:
Wie Whuber in den Kommentaren hervorhebt, sehen die Bereiche aufgrund von Binning nur verzerrt aus. Ich füge die QQ-Plots für Setup 1 (freie Ränder) und Setup 2 (feste Ränder) hinzu. Ähnliche Diagramme sind in Glen's Simulationen unten zu sehen, und alle diese Ergebnisse scheinen tatsächlich ziemlich einheitlich zu sein. Danke für die Hilfe!

pval-qqplot

juod
quelle
2
Versuchen Sie, Ihre Simulation zu wiederholen, während Sie nicht nur die Gruppengrößen (jeweils 500), sondern auch die Summe von "1" (über der gepoolten Stichprobe) konstant halten. Der p-Wert des exakten Fisher-Tests wird unter dieser Einstellung "feste Randverteilung" abgeleitet. Sieht das Bild dann besser aus? Übrigens. Sie können nicht erwarten, dass die p-Wert-Verteilung aufgrund der diskreten Natur der Stichprobenverteilung (dh der hypergeometrischen Verteilung) exakt gleichförmig ist.
Michael M
1
Es kann nützlich sein, sich Ihren R-Code anzusehen.
Conjugateprior
1
@Glen scheint mir aus dem Code, dass in jeder Iteration beide Samples die gleiche Anzahl von Nullen und Einsen haben (dh Nullhypothese sollte gelten) oder irre ich mich?
Bdeonovic
5
Diese Histogramme sehen für mich bemerkenswert einheitlich aus. Sie müssen sich daran erinnern, dass Histogramme die Wahrscheinlichkeit (oder Häufigkeit) anhand der Fläche anzeigen . Die zunehmenden Lücken rechts (aufgrund der unvermeidbaren Diskretion der p-Wert-Verteilung eines nicht randomisierten Tests diskreter Daten) führen zu einer Zunahme der Balkenhöhen, aber ihre Bereiche scheinen nahezu konstant zu sein. Anstatt ein Histogramm zur Beurteilung der Gleichmäßigkeit zu verwenden, stellen Sie die empirische CDF grafisch dar.
whuber
2
Abgesehen von der spezifischen Verteilung scheint diese Frage vollständig beantwortet werden hier
Glen_b -Reinstate Monica

Antworten:

10

Das Problem ist, dass die Daten diskret sind, so dass Histogramme täuschen können. Ich habe eine Simulation mit qqplots codiert, die eine ungefähre Gleichverteilung zeigen.

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

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

Tal
quelle
5
Solche Spitzen und Einbrüche in Histogrammen oder Balkendiagrammen diskreter Daten sind häufig Artefakte des Binning-Verfahrens. Vertrauen Sie ihnen nicht: Verwenden Sie anspruchsvollere Diagramme der Verteilungen, z. B. QQ-Diagramme oder Diagramme der ECDFs. Selbst wenn sie real sind, wird es niemanden interessieren, vorausgesetzt, die Verteilungen der p-Werte sind ungefähr gleichmäßig und von der richtigen Dichte, wo es für die Entscheidungsfindung wichtig ist: im Intervall nahe Null (und sicherlich weniger als 0,5).
whuber
Hervorragender Punkt @whuber, ich werde mit qqplots aktualisieren.
Glen
2
@ Whuber, Glen, vielen Dank! Tatsächlich täuschte das Binning, da das einfache Aufteilen von Glen's Histogrammen in weitere Pausen ein ähnliches Muster ergab wie meins. Außerdem erhalte ich mit meinen Simulationen eine lineare empirische CDF / QQ, sodass das Problem gelöst zu sein scheint.
Juod
@juod: Es wäre sehr dankbar, wenn Sie den qqplot zur Veranschaulichung hinzufügen könnten, vielleicht sogar für beide Simulationen?
Michael M
Die qq-Diagramme helfen wirklich - danke. Möchten Sie den ersten Absatz Ihrer Antwort nicht ändern? Behaupten Sie immer noch, dass es ein Problem mit der Simulation gibt und dass die p-Wert-Verteilung eine "Spitze" aufweist?
whuber