L'esatto test di Fisher fornisce valori p non uniformi


12

Sto cercando di applicare l'esatto test di Fisher in un problema di genetica simulata, ma i valori di p sembrano essere distorti a destra. Essendo un biologo, credo che manchi qualcosa di ovvio per ogni statistico, quindi apprezzerei molto il tuo aiuto.

La mia configurazione è questa: (configurazione 1, i margini non sono fissi)
Due campioni di 0 e 1 vengono generati casualmente in R. Ogni campione n = 500, le probabilità di campionamento 0 e 1 sono uguali. Quindi confronto le proporzioni di 0/1 in ciascun campione con l'esatto test di Fisher (solo fisher.test; ho anche provato altri software con risultati simili). Il campionamento e il test vengono ripetuti 30.000 volte. I valori p risultanti sono distribuiti in questo modo: distribuzione del valore p

La media di tutti i valori p è di circa 0,55, 5 ° percentile a 0,0577. Anche la distribuzione appare discontinua sul lato destro.

Ho letto tutto quello che posso, ma non trovo alcuna indicazione che questo comportamento sia normale - d'altra parte, sono solo dati simulati, quindi non vedo alcuna fonte di errori. C'è qualche aggiustamento che ho perso? Dimensioni del campione troppo piccole? O forse non dovrebbe essere distribuito uniformemente e i valori p sono interpretati in modo diverso?
O dovrei semplicemente ripetere questo milione di volte, trovare il quantile 0,05 e usarlo come limite di significatività quando lo applico ai dati reali?

Grazie!


Aggiornare:

Michael M ha suggerito di fissare i valori marginali di 0 e 1. Ora i valori p danno una distribuzione molto più bella - sfortunatamente, non è uniforme, né di qualsiasi altra forma che riconosco:

p-vals w marginali fissi

aggiungendo il codice R attuale: (setup 2, marginals fixed)

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

Modifica finale:
come sottolinea whuber nei commenti, le aree sembrano distorte a causa del binning. Allego i grafici QQ per l'installazione 1 (marginali liberi) e l'installazione 2 (marginali fissi). Trame simili sono state osservate nelle simulazioni di Glen di seguito e tutti questi risultati sembrano piuttosto uniformi. Grazie per l'aiuto!

pval-QQPlot


2
Prova a ripetere la simulazione mantenendo non solo le dimensioni del gruppo (500 ciascuna) ma anche la somma della costante "1" (sopra il campione aggregato). Il valore p del test esatto di Fisher deriva da questa impostazione di "distribuzione marginale fissa". L'immagine sembra migliore allora? Btw. non ci si può aspettare che la distribuzione del valore p sia esattamente uniforme per la natura discreta della distribuzione campionaria (cioè l'ipergeometria).
Michael M,

1
Potrebbe essere utile dare un'occhiata al tuo codice R.
conjugateprior,

1
@Glen mi sembra dal codice che in ogni iterazione entrambi i campioni abbiano lo stesso numero di 0 e 1 (vale a dire che un'ipotesi nulla dovrebbe valere) o sbaglio?
bdeonovic,

5
Questi istogrammi mi sembrano notevolmente uniformi. Devi ricordare che gli istogrammi mostrano la probabilità (o la frequenza) per mezzo di un'area . Le crescenti lacune a destra (a causa dell'inevitabile discrepanza della distribuzione del valore p di qualsiasi test non randomizzato di dati discreti) fanno aumentare le altezze della barra, ma le loro aree sembrano essere quasi costanti. Invece di utilizzare un istogramma per valutare l'uniformità, tracciare graficamente il CDF empirico.
whuber

2
A parte la distribuzione specifica, questa domanda sembra avere una risposta completa qui
Glen_b -Reinstate Monica

Risposte:


10

Il problema è che i dati sono discreti, quindi gli istogrammi possono essere ingannevoli. Ho codificato una simulazione con qqplots che mostrano una distribuzione uniforme approssimativa.

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

inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine


5
Tali picchi e cali negli istogrammi o nei grafici a barre di dati discreti sono spesso artefatti della procedura di binning. Non fidarti di loro: usa grafici più discernenti delle distribuzioni, come grafici QQ o grafici degli ECDF. Anche se sono reali, a nessuno importa se le distribuzioni dei valori di p sono approssimativamente uniformi e della giusta densità dove è importante per il processo decisionale: nell'intervallo vicino allo zero (e sicuramente inferiore a 0,5).
whuber

Ottimo punto @whuber, aggiornerò con qqplots.
Glen,

2
@whuber, Glen, grazie mille! In effetti il ​​binning era ingannevole, dato che semplicemente dividere gli istogrammi di Glen in più interruzioni dava uno schema simile al mio. E ottengo anche CDF / QQ empirici lineari con le mie simulazioni, quindi il problema sembra essere risolto.
juod,

@juod: sarebbe molto apprezzato se potessi aggiungere il qqplot per l'illustrazione, forse anche per entrambe le simulazioni?
Michael M,

Le trame qq aiutano davvero - grazie. Non vuoi cambiare il primo paragrafo della tua risposta, però? Continui a sostenere che esiste un problema con la simulazione e che esiste un "picco" nella distribuzione del valore p?
whuber
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.