Dokładny test Fishera daje niejednolite wartości p

12

Próbuję zastosować dokładny test Fishera w symulowanym problemie genetycznym, ale wartości p wydają się być przekrzywione po prawej stronie. Będąc biologiem, chyba brakuje mi czegoś oczywistego dla każdego statystyki, więc byłbym bardzo wdzięczny za twoją pomoc.

Moja konfiguracja jest następująca: (konfiguracja 1, marginesy nie są ustalone)
Dwie próbki 0 i 1 są losowo generowane w R. Każda próbka n = 500, prawdopodobieństwo próbkowania 0 i 1 są równe. Następnie porównuję proporcje 0/1 w każdej próbce z dokładnym testem Fishera (właśnie fisher.test; wypróbowałem także inne oprogramowanie z podobnymi wynikami). Pobieranie próbek i testowanie powtarza się 30 000 razy. Wynikowe wartości p są podzielone w następujący sposób: rozkład wartości p

Średnia wszystkich wartości p wynosi około 0,55, 5 percentyl przy 0,0577. Nawet rozkład wydaje się nieciągły po prawej stronie.

Czytałem wszystko, co mogłem, ale nie znajduję żadnych oznak, że takie zachowanie jest normalne - z drugiej strony są to tylko symulowane dane, więc nie widzę żadnych źródeł żadnych stronniczości. Czy brakuje mi korekty? Zbyt małe próbki? A może nie powinien być równomiernie rozłożony, a wartości p są interpretowane inaczej?
Czy powinienem powtórzyć to milion razy, znaleźć kwantyl 0,05 i użyć tego jako wartości odcięcia istotności, gdy zastosuję to do rzeczywistych danych?

Dzięki!


Aktualizacja:

Michael M zasugerował naprawienie krańcowych wartości 0 i 1. Teraz wartości p dają znacznie ładniejszy rozkład - niestety nie jest on jednolity ani żadnego innego kształtu, który rozpoznaję:

p-vals w ustalonych marginesach

dodanie faktycznego kodu R: (setup 2, poprawiono marginesy)

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

Ostateczna edycja:
jak whuber wskazuje w komentarzach, obszary wyglądają po prostu zniekształcone z powodu binowania. Dołączam wykresy QQ dla zestawu 1 (wolne marginesy) i zestawu 2 (stałe marginesy). Podobne wykresy widać w poniższych symulacjach Glena, a wszystkie te wyniki wydają się raczej jednolite. Dzięki za pomoc!

pval-qqplot

juod
źródło
2
Spróbuj powtórzyć symulację, zachowując nie tylko rozmiary grup (po 500), ale także sumę stałej „1” (na próbce zbiorczej). Wartość p dokładnego testu Fishera wyprowadza się przy tym ustawieniu „ustalonego rozkładu krańcowego”. Czy obraz wygląda lepiej? Btw. nie można oczekiwać, że rozkład wartości p będzie dokładnie jednorodny z uwagi na dyskretny charakter rozkładu próbkowania (tj. hipergeometryczny).
Michael M.
1
Przydatne może być sprawdzenie kodu R.
conjugateprior
1
@Glen, wydaje mi się z kodu, że w każdej iteracji obie próbki mają tę samą liczbę zer i jedynek (tj. Hipoteza zerowa powinna się utrzymywać) czy mam rację?
bdeonovic
5
Te histogramy wydają mi się wyjątkowo jednolite. Musisz pamiętać, że histogramy pokazują prawdopodobieństwo (lub częstotliwość) według obszaru . Rosnące odstępy po prawej stronie (z powodu nieuniknionej dyskrecji rozkładu wartości p dowolnego niezandomizowanego testu danych dyskretnych) powodują wzrost wysokości słupków, ale ich obszary wydają się prawie stałe. Zamiast używać histogramu do oceny jednorodności, wykreśl empiryczny CDF.
whuber
2
Oprócz konkretnego podziału, wydaje się, że na to pytanie jest kompletna odpowiedź tutaj
Glen_b -Reinstate Monica

Odpowiedzi:

10

Problem polega na tym, że dane są dyskretne, więc histogramy mogą wprowadzać w błąd. Symulowałem kodowanie za pomocą wykresów qq, które pokazują przybliżony równomierny rozkład.

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

wprowadź opis zdjęcia tutaj

wprowadź opis zdjęcia tutaj

Dolina górska
źródło
5
Takie skoki i spadki w histogramach lub wykresach słupkowych dyskretnych danych są często artefaktami procedury binowania. Nie ufaj im: używaj bardziej wymagających wykresów rozkładów, takich jak wykresy QQ lub wykresy ECDF. Nawet jeśli są prawdziwe, nikogo to nie obchodzi, pod warunkiem, że rozkłady wartości p są w przybliżeniu jednolite i mają odpowiednią gęstość tam, gdzie ma to znaczenie przy podejmowaniu decyzji: w przedziale bliskim zera (a na pewno mniej niż 0,5).
whuber
Doskonały punkt @ Whuber, zaktualizuję za pomocą qqplots.
Glen
2
@whuber, Glen, wielkie dzięki! W rzeczywistości podział ten był zwodniczy, ponieważ zwykłe podzielenie histogramów Glena na więcej przerw dało podobny wzór do mojego. Otrzymuję też liniowe empiryczne CDF / QQ z moimi symulacjami, więc wydaje się, że problem został rozwiązany.
juod
@juod: byłoby bardzo mile widziane, gdybyś mógł dodać qqplot do ilustracji, może nawet do obu symulacji?
Michael M
Wykresy qq naprawdę pomagają - dziękuję. Nie chcesz jednak zmienić pierwszego akapitu swojej odpowiedzi? Czy nadal utrzymuje się, że występuje problem z symulacją i że występuje „skok” w rozkładzie wartości p?
whuber