Conocí un comportamiento paradójico de las llamadas "pruebas exactas" o "pruebas de permutación", cuyo prototipo es la prueba de Fisher. Aquí está.
Imagine que tiene dos grupos de 400 individuos (p. Ej., 400 casos de control frente a 400) y una covariable con dos modalidades (p. Ej., Expuestos / no expuestos). Solo hay 5 individuos expuestos, todos en el segundo grupo. La prueba de Fisher es así:
> 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
(...)
Pero ahora, hay cierta heterogeneidad en el segundo grupo (los casos), por ejemplo, la forma de la enfermedad o el centro de reclutamiento. Se puede dividir en 4 grupos de 100 individuos. Es probable que ocurra algo como esto:
> 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
(...)
Ahora, tenemos ...
Este es solo un ejemplo. Pero podemos simular el poder de las dos estrategias de análisis, suponiendo que en los primeros 400 individuos, la frecuencia de exposición es 0, y que es 0.0125 en los 400 individuos restantes.
Podemos estimar el poder del análisis con dos grupos de 400 individuos:
> 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
Y con un grupo de 400 y 4 grupos de 100 individuos:
> 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
Hay una gran diferencia de poder. Dividir los casos en 4 subgrupos da una prueba más poderosa, incluso si no hay diferencia de distribución entre estos subgrupos. Por supuesto, esta ganancia de poder no es atribuible a una mayor tasa de error tipo I.
¿Es este fenómeno bien conocido? ¿Significa eso que la primera estrategia tiene poca potencia? ¿Sería un valor p bootstrapped una mejor solución? Todos sus comentarios son bienvenidos.
Post Scriptum
Como señaló @MartijnWeterings, una gran parte de la razón de este comportamiento (¡que no es exactamente mi pregunta!) Radica en el hecho de que los verdaderos errores de tipo I de las estrategias de análisis de remolque no son los mismos. Sin embargo, esto no parece explicar todo. Traté de comparar las curvas ROC para vs .H 1 : p 0 = 0.05 ≠ p 1 = 0.0125
Aquí está mi código.
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)
Aquí está el resultado:
Entonces vemos que una comparación con el mismo error verdadero de tipo I todavía conduce a diferencias (de hecho mucho más pequeñas).