Le test exact de Fisher donne des valeurs de p non uniformes

12

J'essaie d'appliquer le test exact de Fisher dans un problème génétique simulé, mais les valeurs de p semblent être biaisées vers la droite. En tant que biologiste, je suppose qu'il me manque quelque chose d'évident pour chaque statisticien, donc j'apprécierais grandement votre aide.

Ma configuration est la suivante: (configuration 1, marginaux non fixés)
Deux échantillons de 0 et de 1 sont générés de manière aléatoire dans R. Chaque échantillon n = 500, les probabilités d'échantillonnage 0 et 1 sont égales. Je compare ensuite les proportions de 0/1 dans chaque échantillon avec le test exact de Fisher (juste fisher.test; j'ai également essayé d'autres logiciels avec des résultats similaires). L'échantillonnage et les tests sont répétés 30 000 fois. Les valeurs p résultantes sont distribuées comme ceci: distribution de la valeur de p

La moyenne de toutes les valeurs de p est d'environ 0,55, 5e centile à 0,0577. Même la distribution apparaît discontinue sur le côté droit.

J'ai lu tout ce que je pouvais, mais je ne trouve aucune indication que ce comportement est normal - d'un autre côté, ce ne sont que des données simulées, donc je ne vois aucune source de biais. Y a-t-il un ajustement que j'ai manqué? Échantillons trop petits? Ou peut-être que ce n'est pas censé être distribué uniformément et que les valeurs de p sont interprétées différemment?
Ou devrais-je simplement répéter cela un million de fois, trouver le quantile 0,05 et l'utiliser comme seuil de signification lorsque j'applique cela à des données réelles?

Merci!


Mise à jour:

Michael M a suggéré de fixer les valeurs marginales de 0 et 1. Maintenant, les valeurs de p donnent une distribution beaucoup plus agréable - malheureusement, ce n'est pas uniforme, ni d'aucune autre forme que je reconnais:

p-vals w marginaux fixes

ajout du code R réel: (configuration 2, marginaux fixes)

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


Modification finale: Comme le souligne Whuber dans les commentaires, les zones semblent juste déformées en raison du binning. J'attache les tracés QQ pour la configuration 1 (marginaux libres) et la configuration 2 (marginaux fixes). Des graphiques similaires sont visibles dans les simulations de Glen ci-dessous, et tous ces résultats semblent en fait plutôt uniformes. Merci pour l'aide!

pval-qqplot

juod
la source
2
Essayez de répéter votre simulation en maintenant non seulement la taille des groupes (500 chacun) mais également la somme de "1" (sur l'échantillon groupé) constante. La valeur p du test exact de Fisher est dérivée sous ce paramètre de «distribution marginale fixe». L'image est-elle meilleure alors? Btw. vous ne pouvez pas vous attendre à ce que la distribution de la valeur p soit exactement uniforme par la nature discrète de la distribution d'échantillonnage (c.-à-d. l'hypergéométrique).
Michael M
1
Il pourrait être utile de consulter votre code R.
conjugateprior
1
@Glen, il me semble d'après le code qu'à chaque itération, les deux échantillons ont le même nombre de 0 et de 1 (c'est-à-dire que l'hypothèse nulle devrait tenir) ou je me trompe?
bdeonovic
5
Ces histogrammes me semblent remarquablement uniformes. Vous devez vous rappeler que les histogrammes affichent la probabilité (ou la fréquence) au moyen de l' aire . Les écarts croissants vers la droite (en raison de la discrétion inévitable de la distribution de la valeur de p de tout test non aléatoire de données discrètes) entraînent une augmentation des hauteurs des barres, mais leurs surfaces semblent presque constantes. Au lieu d'utiliser un histogramme pour évaluer l'uniformité, représentez graphiquement le CDF empirique.
whuber
2
Mis à part la distribution spécifique, cette question semble avoir une réponse complète ici
Glen_b -Reinstate Monica

Réponses:

10

Le problème est que les données sont discrètes, donc les histogrammes peuvent être trompeurs. J'ai codé une simulation avec qqplots qui montrent une distribution uniforme approximative.

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

entrez la description de l'image ici

entrez la description de l'image ici

Glen
la source
5
De tels pics et creux dans les histogrammes ou les graphiques à barres de données discrètes sont souvent des artefacts de la procédure de regroupement. Ne leur faites pas confiance: utilisez des graphiques plus intelligents des distributions, tels que des graphiques QQ ou des graphiques des ECDF. Même s'ils sont réels, personne ne s'en souciera à condition que les distributions des valeurs de p soient approximativement uniformes et de la bonne densité là où cela compte pour la prise de décision: dans l'intervalle proche de zéro (et certainement inférieur à 0,5).
whuber
Excellent point @whuber, je vais mettre à jour avec qqplots.
Glen
2
@whuber, Glen, merci beaucoup! En fait, le binning était trompeur, car le simple fait de diviser les histogrammes de Glen en plusieurs cassures donnait un schéma similaire au mien. Et j'obtiens également des CDF / QQ empiriques linéaires avec mes simulations, donc le problème semble être résolu.
juod
@juod: ce serait très apprécié si vous pouviez ajouter le qqplot pour l'illustration, peut-être même pour les deux simulations?
Michael M
Les parcelles qq aident vraiment - merci. Vous ne voulez cependant pas modifier le premier paragraphe de votre réponse? Maintenez-vous toujours qu'il y a un problème avec la simulation et qu'il y a un "pic" dans la distribution de la valeur de p?
whuber