我遇到了所谓的“精确测试”或“置换测试”的自相矛盾行为,其原型是费舍尔测试。这里是。
想象一下,您有两组,每组400个人(例如400名对照vs 400例),以及一个具有两种模式(例如暴露/未暴露)的协变量。在第二组中只有5个暴露的个体。Fisher测试是这样的:
> 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值会更好吗?欢迎您提出所有意见。
圣经后
正如@MartijnWeterings所指出的,这种行为的很大一部分原因(这不完全是我的问题!)在于这样一个事实,即拖曳分析策略的真实I型错误并不相同。但是,这似乎并不能解释一切。我试图比较 ROC曲线 vs。
这是我的代码。
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错误下进行比较仍然会导致(实际上是更小的)差异。