La prueba exacta de Fisher da valores p no uniformes

12

Estoy tratando de aplicar la prueba exacta de Fisher en un problema genético simulado, pero los valores p parecen estar sesgados a la derecha. Siendo biólogo, creo que me falta algo obvio para todos los estadísticos, por lo que agradecería mucho su ayuda.

Mi configuración es la siguiente: (configuración 1, marginales no fijos)
Se generan aleatoriamente dos muestras de 0 y 1 en R. Cada muestra n = 500, las probabilidades de muestreo 0 y 1 son iguales. Luego comparo las proporciones de 0/1 en cada muestra con la prueba exacta de Fisher (solo fisher.test; también probé otro software con resultados similares). El muestreo y las pruebas se repiten 30 000 veces. Los valores p resultantes se distribuyen así: distribución del valor p

La media de todos los valores de p es de alrededor de 0.55, 5 ° percentil a 0.0577. Incluso la distribución parece discontinua en el lado derecho.

He estado leyendo todo lo que puedo, pero no encuentro ninguna indicación de que este comportamiento sea normal; por otro lado, son solo datos simulados, por lo que no veo fuentes de sesgo. ¿Hay algún ajuste que me haya perdido? Tamaños de muestra demasiado pequeños? ¿O tal vez no se supone que esté distribuido uniformemente, y los valores p se interpretan de manera diferente?
¿O debería repetir esto un millón de veces, encontrar el cuartil 0.05 y usarlo como el límite de significancia cuando aplico esto a los datos reales?

¡Gracias!


Actualizar:

Michael M sugirió arreglar los valores marginales de 0 y 1. Ahora los valores p dan una distribución mucho más agradable; desafortunadamente, no es uniforme ni de ninguna otra forma que reconozca:

p-vals w marginales fijos

agregando el código R real: (configuración 2, marginales corregidos)

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

Edición final:
como señala Whuber en los comentarios, las áreas solo se ven distorsionadas debido al binning. Adjunto los gráficos QQ para la configuración 1 (marginales libres) y la configuración 2 (marginales fijos). Se observan tramas similares en las simulaciones de Glen a continuación, y todos estos resultados, de hecho, parecen bastante uniformes. ¡Gracias por la ayuda!

pval-qqplot

juod
fuente
2
Intente repetir su simulación mientras mantiene constantes no solo los tamaños de grupo (500 cada uno) sino también la suma de "1" (sobre la muestra agrupada). El valor p de la prueba exacta de Fisher se deriva bajo esta configuración de "distribución marginal fija". ¿La imagen se ve mejor entonces? Por cierto. no puede esperar que la distribución del valor p sea exactamente uniforme por la naturaleza discreta de la distribución de muestreo (es decir, la hipergeométrica).
Michael M
1
Puede ser útil echar un vistazo a su código R.
conjugateprior
1
@ Glen me parece por el código que en cada iteración ambas muestras tienen el mismo número de 0s y 1s (es decir, la hipótesis nula debería ser válida) o ¿me equivoco?
bdeonovic
55
Estos histogramas me parecen notablemente uniformes. Debe recordar que los histogramas muestran la probabilidad (o frecuencia) por medio del área . Las brechas crecientes a la derecha (debido a la discreción inevitable de la distribución del valor p de cualquier prueba no aleatoria de datos discretos) hacen que las alturas de las barras aumenten, pero sus áreas parecen ser casi constantes. En lugar de usar un histograma para evaluar la uniformidad, graficar el CDF empírico.
whuber
2
Aparte de la distribución específica, esta pregunta parece estar completamente respondida aquí
Glen_b -Reinstate Monica

Respuestas:

10

El problema es que los datos son discretos, por lo que los histogramas pueden ser engañosos. Codifiqué una simulación con qqplots que muestran una distribución uniforme aproximada.

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

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

Cañada
fuente
55
Tales picos y caídas en histogramas o gráficos de barras de datos discretos a menudo son artefactos del procedimiento de agrupamiento. No confíe en ellos: use gráficos más exigentes de las distribuciones, como gráficos QQ o gráficos de los ECDF. Incluso si son reales, a nadie le importará, siempre y cuando las distribuciones de los valores p sean aproximadamente uniformes y de la densidad correcta donde sea importante para la toma de decisiones: en el intervalo cercano a cero (y ciertamente menos de 0.5).
whuber
Excelente punto @whuber, lo actualizaré con qqplots.
Glen
2
@whuber, Glen, ¡muchas gracias! De hecho, el binning fue engañoso, ya que simplemente dividir los histogramas de Glen en más descansos dio un patrón similar al mío. Y también obtengo CDF / QQ empírico lineal con mis simulaciones, por lo que el problema parece estar resuelto.
juod
@juod: sería muy apreciado si pudieras agregar qqplot para ilustración, ¿tal vez incluso para ambas simulaciones?
Michael M
Las parcelas qq realmente ayudan, gracias. Sin embargo, ¿no quieres cambiar el primer párrafo de tu respuesta? ¿Sigue manteniendo que hay un problema con la simulación y que hay un "pico" en la distribución del valor p?
whuber