O teste exato de Fisher fornece valores p não uniformes

12

Estou tentando aplicar o teste exato de Fisher em um problema genético simulado, mas os valores de p parecem distorcidos à direita. Sendo biólogo, acho que estou perdendo algo óbvio para todos os estatísticos, por isso gostaria muito de receber sua ajuda.

Minha configuração é a seguinte: (configuração 1, marginais não corrigidos)
Duas amostras de 0s e 1s são geradas aleatoriamente em R. Cada amostra n = 500, as probabilidades de amostragem 0 e 1 são iguais. Comparo as proporções de 0/1 em cada amostra com o teste exato de Fisher (apenas fisher.test; também tentei outro software com resultados semelhantes). A amostragem e o teste são repetidos 30 000 vezes. Os valores p resultantes são distribuídos assim: distribuição de valor p

A média de todos os valores de p é de 0,55, percentil 5 a 0,0577. Até a distribuição aparece descontínua no lado direito.

Eu tenho lido tudo o que posso, mas não encontro nenhuma indicação de que esse comportamento seja normal - por outro lado, são apenas dados simulados, portanto não vejo fontes de viés. Há algum ajuste que eu perdi? Tamanhos de amostra muito pequenos? Ou talvez não deva ser distribuído uniformemente, e os valores-p são interpretados de maneira diferente?
Ou devo repetir isso um milhão de vezes, encontrar o quantil 0,05 e usá-lo como ponto de corte de significância quando aplico isso aos dados reais?

Obrigado!


Atualizar:

Michael M sugeriu fixar os valores marginais de 0 e 1. Agora, os valores-p oferecem uma distribuição muito melhor - infelizmente, não é uniforme, nem de qualquer outra forma que reconheço:

p-vals w marginais fixos

adicionando o código R real: (configuração 2, marginais corrigidos)

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


Edição final: Como o whuber aponta nos comentários, as áreas parecem distorcidas devido ao binning. Estou anexando os gráficos QQ para a configuração 1 (margens livres) e a configuração 2 (margens fixas). Gráficos similares são vistos nas simulações de Glen abaixo, e todos esses resultados parecem bastante uniformes. Obrigado pela ajuda!

pval-qqplot

juod
fonte
2
Tente repetir sua simulação enquanto mantém não apenas os tamanhos dos grupos (500 cada), mas também a soma de "1" (sobre a amostra combinada) constante. O valor p do teste exato de Fisher é derivado nessa configuração de "distribuição marginal fixa". A imagem parece melhor então? Btw. você não pode esperar que a distribuição do valor-p seja exatamente uniforme pela natureza discreta da distribuição da amostra (ou seja, a hipergeométrica).
22615 Michael M
1
Pode ser útil dar uma olhada no seu código R.
conjugateprior
1
@Glen parece-me do código que, em cada iteração, ambas as amostras têm o mesmo número de 0s e 1s (isto é, hipótese nula deve ser mantida) ou estou errado?
Bdonovic 21/07/2015
5
Esses histogramas parecem notavelmente uniformes para mim. Você deve se lembrar que os histogramas exibem probabilidade (ou frequência) por meio de área . As brechas crescentes à direita (devido à inevitabilidade discreta da distribuição do valor-p de qualquer teste não randomizado de dados discretos) fazem com que as alturas das barras aumentem, mas suas áreas parecem quase constantes. Em vez de usar um histograma para avaliar a uniformidade, faça um gráfico do CDF empírico.
whuber
2
Além da distribuição específica, esta pergunta parece ser completamente respondida aqui
Glen_b -Reinstate Monica

Respostas:

10

O problema é que os dados são discretos para que os histogramas possam enganar. Codifiquei uma simulação com qqplots que mostra uma distribuição 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, ...)
       })

insira a descrição da imagem aqui

insira a descrição da imagem aqui

Glen
fonte
5
Esses picos e quedas nos histogramas ou nos gráficos de barras de dados discretos geralmente são artefatos do procedimento de binning. Não confie neles: use gráficos mais exigentes das distribuições, como gráficos QQ ou gráficos dos ECDFs. Mesmo que sejam reais, ninguém se importará, desde que as distribuições de valores-p sejam aproximadamente uniformes e com a densidade correta onde é importante para a tomada de decisão: no intervalo próximo a zero (e certamente menor que 0,5).
whuber
Excelente ponto @whuber, vou atualizar com qqplots.
Glen
2
@ Whuber, Glen, muito obrigado! De fato, o binning era enganoso, pois simplesmente dividir os histogramas de Glen em mais intervalos deu um padrão semelhante ao meu. E também recebo CDF / QQ empírico linear com minhas simulações, então o problema parece estar resolvido.
juod 22/07/2015
@juod: seria muito apreciado se você pudesse adicionar o qqplot para ilustração, talvez até para as duas simulações?
22615 Michael M
Os gráficos qq realmente ajudam - obrigado. Você não deseja alterar o primeiro parágrafo da sua resposta? Você ainda mantém que há um problema com a simulação e que há um "pico" na distribuição do valor-p?
whuber