Я встретил парадоксальное поведение так называемых «точных тестов» или «тестов перестановки», прототипом которых является тест Фишера. Вот.
Представьте, что у вас есть две группы по 400 человек (например, 400 контрольных против 400 случаев) и ковариата с двумя модальностями (например, открытая / неэкспонированная). Есть только 5 разоблаченных людей, все во второй группе. Тест Фишера выглядит так:
> 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
(...)
Но теперь во второй группе (случаях) есть некоторая неоднородность, например, форма заболевания или центр рекрутинга. Его можно разделить на 4 группы по 100 человек. Нечто подобное может произойти:
> 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
(...)
Теперь у нас есть ...
Это только пример. Но мы можем смоделировать силу двух стратегий анализа, предполагая, что у первых 400 человек частота воздействия равна 0, а у 400 оставшихся - 0,0125.
Мы можем оценить силу анализа с двумя группами по 400 человек:
> 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
И с одной группой из 400 и 4 группами по 100 человек:
> 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
Там довольно разница в силе. Разделение случаев на 4 подгруппы дает более мощный тест, даже если нет различий в распределении между этими подгруппами. Конечно, это увеличение мощности не связано с увеличением частоты ошибок типа I.
Известно ли это явление? Означает ли это, что первая стратегия недостаточно эффективна? Будет ли загрузочное значение p лучшим решением? Все ваши комментарии приветствуются.
Пост скриптум
Вот мой код
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)
Вот результат:
Таким образом, мы видим, что сравнение с той же самой истинной ошибкой типа I все еще приводит к (действительно намного меньшим) различиям.