Comportamento sorprendente della potenza del test esatto di Fisher (test di permutazione)


9

Ho incontrato un comportamento paradossale dei cosiddetti "test esatti" o "test di permutazione", il cui prototipo è il test di Fisher. Ecco qui.

Immagina di avere due gruppi di 400 individui (ad esempio 400 controllo contro 400 casi) e una covariata con due modalità (ad esempio esposta / non esposta). Ci sono solo 5 individui esposti, tutti nel secondo gruppo. Il test Fisher va così:

> x <- matrix( c(400, 395, 0, 5) , ncol = 2)
> x
     [,1] [,2]
[1,]  400    0
[2,]  395    5
> fisher.test(x)

    Fisher's Exact Test for Count Data

data:  x
p-value = 0.06172
(...)

Ma ora c'è una certa eterogeneità nel secondo gruppo (i casi), ad esempio la forma della malattia o il centro di reclutamento. Può essere diviso in 4 gruppi di 100 individui. È probabile che accada qualcosa del genere:

> x <- matrix( c(400, 99, 99 , 99, 98, 0, 1, 1, 1, 2) , ncol = 2)
> x
     [,1] [,2]
[1,]  400    0
[2,]   99    1
[3,]   99    1
[4,]   99    1
[5,]   98    2
> fisher.test(x)

    Fisher's Exact Test for Count Data

data:  x 
p-value = 0.03319
alternative hypothesis: two.sided
(...)

Ora abbiamo ...p<0.05

Questo è solo un esempio. Ma possiamo simulare il potere delle due strategie di analisi, supponendo che nei primi 400 individui, la frequenza di esposizione sia 0 e che sia 0,0125 nei 400 individui rimanenti.

Possiamo stimare la potenza dell'analisi con due gruppi di 400 individui:

> p1 <- replicate(1000, { n <- rbinom(1, 400, 0.0125); 
                          x <- matrix( c(400, 400 - n, 0, n), ncol = 2); 
                          fisher.test(x)$p.value} )
> mean(p1 < 0.05)
[1] 0.372

E con un gruppo di 400 e 4 gruppi di 100 individui:

> p2 <- replicate(1000, { n <- rbinom(4, 100, 0.0125); 
                          x <- matrix( c(400, 100 - n, 0, n), ncol = 2);
                          fisher.test(x)$p.value} )
> mean(p2 < 0.05)
[1] 0.629

C'è abbastanza una differenza di potere. La suddivisione dei casi in 4 sottogruppi fornisce un test più efficace, anche se non vi è alcuna differenza di distribuzione tra questi sottogruppi. Naturalmente questo guadagno di potenza non è attribuibile a un tasso di errore maggiore di tipo I.

Questo fenomeno è noto? Ciò significa che la prima strategia è sotto-potenziata? Un p-value con bootstrap sarebbe una soluzione migliore? Tutti i tuoi commenti sono benvenuti.

Post scriptum

Come sottolineato da @MartijnWeterings, gran parte della ragione di questo comportamento (che non è esattamente la mia domanda!) Risiede nel fatto che i veri errori di tipo I delle strategie di analisi del rimorchio non sono gli stessi. Tuttavia, questo non sembra spiegare tutto. Ho provato a confrontare le curve ROC per vs .H 1 : p 0 = 0,05 p 1 = 0,0125H0:p0=p1=0.005H1:p0=0.05p1=0.0125

Ecco il mio codice

B <- 1e5
p0 <- 0.005
p1 <- 0.0125

# simulation under H0 with p = p0 = 0.005 in all groups
# a = 2 groups 400:400, b = 5 groupe 400:100:100:100:100

p.H0.a <- replicate(B, { n <- rbinom( 2, c(400,400), p0);
                           x <- matrix( c( c(400,400) -n, n ), ncol = 2);
                          fisher.test(x)$p.value} )

p.H0.b <- replicate(B, { n <- rbinom( 5, c(400,rep(100,4)), p0);
                           x <- matrix( c( c(400,rep(100,4)) -n, n ), ncol = 2);
                          fisher.test(x)$p.value} )

# simulation under H1 with p0 = 0.005 (controls) and p1 = 0.0125 (cases)

p.H1.a <- replicate(B, { n <- rbinom( 2, c(400,400), c(p0,p1) );
                           x <- matrix( c( c(400,400) -n, n ), ncol = 2);
                          fisher.test(x)$p.value} )

p.H1.b <- replicate(B, { n <- rbinom( 5, c(400,rep(100,4)), c(p0,rep(p1,4)) );
                           x <- matrix( c( c(400,rep(100,4)) -n, n ), ncol = 2);
                          fisher.test(x)$p.value} )

# roc curve 

ROC <- function(p.H0, p.H1) {
  p.threshold <- seq(0, 1.001, length=501)
  alpha <- sapply(p.threshold, function(th) mean(p.H0 <= th) )
  power <- sapply(p.threshold, function(th) mean(p.H1 <= th) )
  list(x = alpha, y = power)
}

par(mfrow=c(1,2))
plot( ROC(p.H0.a, p.H1.a) , type="b", xlab = "alpha", ylab = "1-beta" , xlim=c(0,1), ylim=c(0,1), asp = 1)
lines( ROC(p.H0.b, p.H1.b) , col="red", type="b" )
abline(0,1)

plot( ROC(p.H0.a, p.H1.a) , type="b", xlab = "alpha", ylab = "1-beta" , xlim=c(0,.1) )
lines( ROC(p.H0.b, p.H1.b) , col="red", type="b" )
abline(0,1)

Ecco il risultato:

curve roc

Quindi vediamo che un confronto con lo stesso vero errore di tipo I porta ancora a differenze (molto più piccole).


Non capisco. Dividere il gruppo di casi può avere senso quando si sospetta una certa eterogeneità al suo interno - diciamo, provengono da 5 centri diversi. Dividere la modalità "esposta" non sembra avere senso per me.
Elvis

1
Se tracciassimo graficamente la differenza tra la prima e la seconda strategia. Quindi immagino un sistema di coordinate con 5 assi (per i gruppi di 400 100 100 100 e 100) con un punto per i valori di ipotesi e la superficie che raffigura una distanza di deviazione oltre la quale la probabilità è inferiore a un certo livello. Con la prima strategia questa superficie è un cilindro, con la seconda strategia questa superficie è una sfera. Lo stesso vale per i valori veri e una superficie attorno per l'errore. Ciò che vogliamo è che la sovrapposizione sia il più piccola possibile.
Sesto Empirico

1
Ho adottato la fine della mia domanda fornendo un po 'più di comprensione nel ragionamento sul perché c'è una differenza tra i due metodi.
Sesto Empirico

1
Credo che il test esatto di Barnard venga utilizzato quando viene fissato solo uno dei due margini. Ma probabilmente otterrai gli stessi effetti.
Sesto Empirico

1
un'altra (più) nota interessante che volevo fare è che la potenza si riduce effettivamente quando si esegue il test con p0> p1. Quindi la potenza aumenta quando p1> p0, allo stesso livello alfa. Ma la potenza diminuisce quando p1 <p0 (ottengo anche una curva che è al di sotto della diagonale).
Sesto Empirico

Risposte:


4

Perché i valori p sono diversi

Sono in corso due effetti:

  • A causa della discrezione dei valori, si sceglie il vettore "più probabile che accada" 0 2 1 1 1. Ma questo differirebbe dal (impossibile) 0 1,25 1,25 1,25 1,25, che avrebbe un valore più piccolo .χ2

    Il risultato è che il vettore 5 0 0 0 0 non viene più conteggiato come caso minimo (5 0 0 0 0 ha un minore di 0 2 1 1 1). Questo era il caso prima. Il test di Fisher su due lati sulla tabella 2x2 considera entrambi i casi in cui le 5 esposizioni nel primo o nel secondo gruppo sono ugualmente estreme.χ2

    Questo è il motivo per cui il valore p differisce di quasi un fattore 2. (non esattamente a causa del punto successivo)

  • Mentre perdi 5 0 0 0 0 come caso altrettanto estremo, ottieni 1 4 0 0 0 come caso più estremo di 0 2 1 1 1.

Quindi la differenza sta nel limite del valore (o di un valore p direttamente calcolato come utilizzato dall'implementazione R dell'esatto test di Fisher). Se dividi il gruppo di 400 in 4 gruppi di 100, i diversi casi saranno considerati più o meno "estremi" dell'altro. 5 0 0 0 0 è ora meno "estremo" di 0 2 1 1 1. Ma 1 4 0 0 0 è più "estremo".χ2


esempio di codice:

# probability of distribution a and b exposures among 2 groups of 400
draw2 <- function(a,b) {
  choose(400,a)*choose(400,b)/choose(800,5)
}

# probability of distribution a, b, c, d and e exposures among 5 groups of resp 400, 100, 100, 100, 100
draw5 <- function(a,b,c,d,e) {
choose(400,a)*choose(100,b)*choose(100,c)*choose(100,d)*choose(100,e)/choose(800,5)
}

# looping all possible distributions of 5 exposers among 5 groups
# summing the probability when it's p-value is smaller or equal to the observed value 0 2 1 1 1
sumx <- 0
for (f in c(0:5)) {
  for(g in c(0:(5-f))) {
    for(h in c(0:(5-f-g))) {
      for(i in c(0:(5-f-g-h))) {
        j = 5-f-g-h-i
        if (draw5(f, g, h, i, j) <= draw5(0, 2, 1, 1, 1)) {
          sumx <- sumx + draw5(f, g, h, i, j)
        }
      }
    }
  } 
}
sumx  #output is 0.3318617

# the split up case (5 groups, 400 100 100 100 100) can be calculated manually
# as a sum of probabilities for cases 0 5 and 1 4 0 0 0 (0 5 includes all cases 1 a b c d with the sum of the latter four equal to 5)
fisher.test(matrix( c(400, 98, 99 , 99, 99, 0, 2, 1, 1, 1) , ncol = 2))[1]
draw2(0,5) + 4*draw(1,4,0,0,0)

# the original case of 2 groups (400 400) can be calculated manually
# as a sum of probabilities for the cases 0 5 and 5 0 
fisher.test(matrix( c(400, 395, 0, 5) , ncol = 2))[1]
draw2(0,5) + draw2(5,0)

uscita di quell'ultimo bit

> fisher.test(matrix( c(400, 98, 99 , 99, 99, 0, 2, 1, 1, 1) , ncol = 2))[1]
$p.value
[1] 0.03318617

> draw2(0,5) + 4*draw(1,4,0,0,0)
[1] 0.03318617

> fisher.test(matrix( c(400, 395, 0, 5) , ncol = 2))[1]
$p.value
[1] 0.06171924

> draw2(0,5) + draw2(5,0)
[1] 0.06171924

Come influenza il potere quando si dividono i gruppi

  • Ci sono alcune differenze dovute ai passaggi discreti nei livelli "disponibili" dei valori di p e alla conservatività del test esatto di Fishers (e queste differenze possono diventare piuttosto grandi).

  • anche il test Fisher si adatta al modello (sconosciuto) in base ai dati e quindi utilizza questo modello per calcolare i valori p. Il modello nell'esempio è che ci sono esattamente 5 individui esposti. Se modelli i dati con un binomio per i diversi gruppi, otterrai occasionalmente più o meno di 5 individui. Quando si applica il test del pescatore a questo, allora verrà inserito parte dell'errore e i residui saranno più piccoli rispetto ai test con marginali fissi. Il risultato è che il test è troppo conservativo, non esatto.

Mi aspettavo che l'effetto sulla probabilità di errore di tipo I dell'esperimento non sarebbe stato così grande se si dividessero casualmente i gruppi. Se l'ipotesi nulla è vera, allora incontrerai all'incirca percento dei casi un valore p significativo. Per questo esempio le differenze sono grandi come mostra l'immagine. Il motivo principale è che, con un totale di 5 esposizioni, ci sono solo tre livelli di differenza assoluta (5-0, 4-1, 3-2, 2-3, 1-4, 0-5) e solo tre discreti p- valori (nel caso di due gruppi di 400).α

Più interessante è la trama delle probabilità di rifiutare se è vero e se è vero. In questo caso il livello alfa e la discrezione non contano molto (tracciamo il tasso di rifiuto effettivo) e vediamo ancora una grande differenza.H0H aH0Ha

Resta da chiedersi se ciò valga per tutte le possibili situazioni.

3 volte la regolazione del codice della tua analisi di potenza (e 3 immagini):

usando il binomio restringente al caso di 5 individui esposti

Grafici della probabilità effettiva di rifiutare in funzione dell'alfa selezionata. È noto per il test esatto di Fisher che il valore p è calcolato esattamente ma solo pochi livelli (i passaggi) si verificano così spesso che il test potrebbe essere troppo conservativo rispetto a un livello alfa scelto.H0

È interessante vedere che l'effetto è molto più forte nel caso 400-400 (rosso) rispetto al caso 400-100-100-100-100 (blu). Quindi possiamo davvero usare questa divisione per aumentare la potenza, rendere più probabile il rifiuto di H_0. (anche se non ci preoccupiamo molto di rendere più probabile l'errore di tipo I, quindi il punto di fare questa divisione per aumentare la potenza potrebbe non essere sempre così forte)

diverse probabilità di rifiutare H0

usando il binomio non limitando a 5 persone esposte

Se usiamo un binomio come hai fatto tu, nessuno dei due casi 400-400 (rosso) o 400-100-100-100-100 (blu) fornisce un valore p accurato. Questo perché il test esatto di Fisher presuppone totali fissi di riga e colonna, ma il modello binomiale consente a questi di essere liberi. Il test di Fisher "adatta" i totali di riga e colonna rendendo il termine residuo più piccolo del termine di errore reale.

test esatto di Fisher eccessivamente conservatore

la maggiore potenza ha un costo?

Se confrontiamo le probabilità di rifiuto quando è vero e quando è vero (desideriamo il primo valore basso e il secondo valore alto) allora vediamo che effettivamente la potenza (rifiuto quando è vera) può essere aumentata senza il costo che aumenta l'errore di tipo I.H a H aH0HaHa

confrontando H_0 e H_a

# using binomial distribution for 400, 100, 100, 100, 100
# x uses separate cases
# y uses the sum of the 100 groups
p <- replicate(4000, { n <- rbinom(4, 100, 0.006125); m <- rbinom(1, 400, 0.006125); 
x <- matrix( c(400 - m, 100 - n, m, n), ncol = 2);
y <- matrix( c(400 - m, 400 - sum(n), m, sum(n)), ncol = 2);
c(sum(n,m),fisher.test(x)$p.value,fisher.test(y)$p.value)} )

# calculate hypothesis test using only tables with sum of 5 for the 1st row
ps <- c(1:1000)/1000
m1 <- sapply(ps,FUN = function(x) mean(p[2,p[1,]==5] < x))
m2 <- sapply(ps,FUN = function(x) mean(p[3,p[1,]==5] < x))

plot(ps,ps,type="l",
     xlab = "chosen alpha level",
     ylab = "p rejection")
lines(ps,m1,col=4)
lines(ps,m2,col=2)

title("due to concervative test p-value will be smaller\n leading to differences")

# using all samples also when the sum exposed individuals is not 5
ps <- c(1:1000)/1000
m1 <- sapply(ps,FUN = function(x) mean(p[2,] < x))
m2 <- sapply(ps,FUN = function(x) mean(p[3,] < x))

plot(ps,ps,type="l", 
     xlab = "chosen alpha level",
     ylab = "p rejection")
lines(ps,m1,col=4)
lines(ps,m2,col=2)

title("overly conservative, low effective p-values \n fitting marginals makes residuals smaller than real error")


#   
# Third graph comparing H_0 and H_a
#
# using binomial distribution for 400, 100, 100, 100, 100
# x uses separate cases
# y uses the sum of the 100 groups
offset <- 0.5
p <- replicate(10000, { n <- rbinom(4, 100, offset*0.0125); m <- rbinom(1, 400, (1-offset)*0.0125); 
x <- matrix( c(400 - m, 100 - n, m, n), ncol = 2);
y <- matrix( c(400 - m, 400 - sum(n), m, sum(n)), ncol = 2);
c(sum(n,m),fisher.test(x)$p.value,fisher.test(y)$p.value)} )

# calculate hypothesis test using only tables with sum of 5 for the 1st row
ps <- c(1:10000)/10000
m1 <- sapply(ps,FUN = function(x) mean(p[2,p[1,]==5] < x))
m2 <- sapply(ps,FUN = function(x) mean(p[3,p[1,]==5] < x))

offset <- 0.6
p <- replicate(10000, { n <- rbinom(4, 100, offset*0.0125); m <- rbinom(1, 400, (1-offset)*0.0125); 
x <- matrix( c(400 - m, 100 - n, m, n), ncol = 2);
y <- matrix( c(400 - m, 400 - sum(n), m, sum(n)), ncol = 2);
c(sum(n,m),fisher.test(x)$p.value,fisher.test(y)$p.value)} )

# calculate hypothesis test using only tables with sum of 5 for the 1st row
ps <- c(1:10000)/10000
m1a <- sapply(ps,FUN = function(x) mean(p[2,p[1,]==5] < x))
m2a <- sapply(ps,FUN = function(x) mean(p[3,p[1,]==5] < x))

plot(ps,ps,type="l",
     xlab = "p rejecting if H_0 true",
     ylab = "p rejecting if H_a true",log="xy")
points(m1,m1a,col=4)
points(m2,m2a,col=2)

legend(0.01,0.001,c("400-400","400-100-100-100-100"),pch=c(1,1),col=c(2,4))

title("comparing H_0:p=0.5 \n with H_a:p=0.6")

Perché influenza il potere

Credo che la chiave del problema risieda nella differenza dei valori di risultato scelti come "significativi". La situazione è che cinque individui esposti sono stati estratti da 5 gruppi di 400, 100, 100, 100 e 100 dimensioni. È possibile effettuare selezioni diverse che sono considerate "estreme". apparentemente la potenza aumenta (anche quando l'errore effettivo di tipo I è lo stesso) quando optiamo per la seconda strategia.

Se tracciassimo graficamente la differenza tra la prima e la seconda strategia. Quindi immagino un sistema di coordinate con 5 assi (per i gruppi di 400 100 100 100 e 100) con un punto per i valori di ipotesi e la superficie che raffigura una distanza di deviazione oltre la quale la probabilità è inferiore a un certo livello. Con la prima strategia questa superficie è un cilindro, con la seconda strategia questa superficie è una sfera. Lo stesso vale per i valori veri e una superficie attorno per l'errore. Ciò che vogliamo è che la sovrapposizione sia il più piccola possibile.

Siamo in grado di creare un grafico reale se consideriamo un problema leggermente diverso (con dimensionalità inferiore).

Immagina di voler testare un processo di Bernoulli facendo 1000 esperimenti. Quindi possiamo fare la stessa strategia suddividendo i 1000 in gruppi in due gruppi di dimensioni 500. Che aspetto ha (lascia X e Y come conteggi in entrambi i gruppi)?H0:p=0.5

esempio di meccanismo

La trama mostra come sono distribuiti i gruppi di 500 e 500 (anziché un singolo gruppo di 1000).

Il test di ipotesi standard valuterà (per un livello alfa del 95%) se la somma di X e Y è maggiore di 531 o inferiore a 469.

Ma questo include una distribuzione ineguale molto improbabile di X e Y.

Immagina uno spostamento della distribuzione da a . Quindi le regioni ai bordi non contano molto e un confine più circolare avrebbe più senso.H aH0Ha

Questo non è tuttavia (necesarilly) vero quando non selezioniamo la divisione dei gruppi in modo casuale e quando potrebbe esserci un significato per i gruppi.


Prova a eseguire il mio codice per la stima della potenza, sostituendo solo 0,0125 con 0,02 (per abbinare il tuo suggerimento di avere una media di 8 casi esposti): l'analisi 400 vs 400 ha una potenza dell'80% e l'analisi con 5 gruppi ha una potenza del 90%.
Elvis

Tuttavia, concordo sul fatto che la statistica può assumere valori meno diversi nella prima situazione e che non aiuta. Tuttavia, ciò non è sufficiente per spiegare il problema: questa superiorità di potenza può essere osservata per tutti i livelli di errore di tipo I, non solo 0,05. I quantili dei valori p ottenuti dalla seconda strategia sono sempre inferiori a quelli ottenuti dalla prima.
Elvis

Penso di essere d'accordo con quello che dici. Ma qual è la conclusione? Consiglieresti di dividere casualmente il gruppo di casi in 4 sottogruppi, per guadagnare un po 'di potere? O sei d'accordo con me sul fatto che ciò non può essere giustificato?
Elvis

Penso che il problema non sia che il test con casi suddivisi in 4 sottogruppi possa avere proprietà sbagliate - siamo entrambi d'accordo sul fatto che il suo tasso di errore di tipo I dovrebbe comportarsi bene. Penso che il problema sia che il test con 400 controlli contro 400 casi è sottodimensionato. Esiste una soluzione "pulita" a questo? Bootstrap potrebbe aiutare p-value?
Elvis

(Mi dispiace che la mia domanda non fosse completamente chiara!)
Elvis
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.