最近,纳西姆·尼古拉斯·塔勒布 ( Nassim Nicholas Taleb ) 发表了一篇关于最近丹麦口罩研究的帖子,这是一项随机对照试验,得出的结论是,戴口罩组和不戴口罩对照组的新诊断冠状病毒感染比例没有显着差异 (42/2392 =1.8% 与 53/2470=2.1%),基于逻辑回归的 2 尾 p 值。
Taleb 指出,如果你只关注通过 qRT PCR 测试确认感染的病例,你会得到 0/2392 与 5/2470。他写道:“现在考虑更明显的错误。随机获得 0 个 PCR 与 5 个的概率是多少?
如果平均值为 5/2470,则在 2392 中实现 0 次的概率是 0.0078518,即 127 分之 1。我们可以用 p 值重新表示它,这将是 <.05,远远超过论文显示的范围为 .21-.33。这些研究人员是如何错过这一点的,我无法理解。”
对我来说,这个计算似乎没有多大意义,因为基于二项式 PMF 的计算忽略了 5/2470 的采样不确定性。对此,Taleb 回应说“我不做 P 值:https ://arxiv.org/pdf/1603.07532.pdf ”,只是后来用 Mathematica 表示法添加了这个基于蒙特卡洛双伯努利的计算,其中他获得了1 尾 p 值
ta=Table[data1=RandomVariate[BernoulliDistribution[5/2470],2470]//Total;
data2=RandomVariate[BernoulliDistribution[5/2470],2400]//Total;
data1-data2,{10^5}];
[[Select[ta,#<-5&]//Length] / 10^5]//N
0.03483
有人可以阐明塔勒布到底在计算什么吗?如果他在这里尝试使用蒙特卡洛完成 2 样本二项式检验,我不太明白 2400 的来源以及为什么那里没有伯努利,期望值为 0/2392(这本身就会有问题,因为那么一个将有零方差)。对于 2 样本 MC 二项式检验,我宁愿期望类似(在 R 中,并使用所有计数的 +1 调整以避免一组中的 p=0 二项式期望):
p1=rbinom(1E8, 2470, (5+1)/(2470+1))/(2470+1)
p2=rbinom(1E8, 2392, (0+1)/(2392+1))/(2392+1)
mean(p1<=p2) # 1-tailed p = 0.03401019
2*mean(p1<=p2) # 2-tailed p = 0.06802038
但似乎他改为尝试类似的东西(我更正了 2400,这可能是一个错字,并将 > 更改为 >=):
mean((rbinom(1E7, 2470, 5/2470)-rbinom(1E7, 2392, 5/2470))>=5)
# 1-tailed p = 0.0811906
我认为这是错误的,对吧?如果有的话,我会发现这更合乎逻辑:
mean((rbinom(1E8, 2470, 5/(2470+2392))/2470-rbinom(1E8, 2392, 5/(2470+2392))/2392)>=(5/2470-0/2392))
# 1-tailed p = 0.01446185
mean(abs((rbinom(1E8, 2470, 5/(2470+2392))/2470-rbinom(1E8, 2392, 5/(2470+2392))/2392))>=(5/2470-0/2392))
# 2-tailed p = 0.03479425
尽管我不确定这是否是执行此类 2 样本二项式检验的可接受方式(这似乎是Liddell 的 2x2 列联表检验的蒙特卡洛版本)。
塔勒布本人并没有提供多大帮助,指出我们只是在计算“费舍尔的双列表联合分布”,然后用他典型的直率评论说“你似乎非常非常无知,像鹦鹉一样重复公式,不明白什么概率差不多。我已经不再和你交往了。”。
我确实告诉他,因为先验口罩也可能使事情变得更糟(例如,当使用不当时)使用 2 尾测试更安全。而且由于完全分离,您无法进行常规逻辑回归(二项式 GLM)(这是作者在论文中使用的),例如在 R 中:
summary(glm(cbind(pcrpos, pcrneg) ~ treatment, family=binomial, data=data.frame(treatment=factor(c("masks","control")),pcrpos=c(0,5), pcrneg=c(2392,2470-5))))
# 2-tailed p = 1, obviously not correct
为了解决这个问题,我们可以将 1/2 作为连续性校正添加到我们的观察中(我相信,这相当于在贝叶斯二项式 GLM 中使用杰弗里先验):
summary(glm(cbind(pcrpos+1/2, pcrneg+1/2) ~ treatment, family=binomial, data=data.frame(treatment=factor(c("masks","control")),pcrpos=c(0,5), pcrneg=c(2392,2470-5))))
# 2-tailed p = 0.11
然后我指出,最好做一个完全类似的逻辑回归,例如在 R 中:
library(elrm)
fit = elrm(pcrpos/n ~ treatment, ~ treatment, r=2, iter=400000, burnIn=1000, dataset=data.frame(treatment=factor(c("masks", "control")), pcrpos=c(0, 5), n=c(2392, 2470)) )
fit$p.values # 2-tailed p value = 0.06
fit$p.values.se # standard error on p value = 0.0003
并且这也将非常接近基于超几何分布的 2 尾Fisher 精确检验的结果,这也给出了 0.06 的 2 尾 p 值:
fisher.test(rbind(c(0,2392), c(5,2470-5))) # 2-tailed p value = 0.06
或 0.03 的 1 尾 p 值:
fisher.test(rbind(c(0,2392), c(5,2470-5)), alternative="less") # 1-tailed p value = 0.03
尽管 Fisher 精确检验会假设行和列边距都是固定的,但这实际上在这里并不完全正确,因为只有行边距是固定的,这将使逻辑回归/2 样本二项式更合适。
我指出的另一种选择是Firth 的逻辑回归,它会给出 0.11 的 2 尾 p 值:
library(brglm)
summary(brglm(cbind(pcrpos, pcrneg) ~ treatment, family=binomial, data=data.frame(treatment=factor(c("masks","control")), pcrpos=c(0,5), pcrneg=c(2392,2470-5))))
# 2-tailed p = 0.11
对此他回答说:“请不要给我图书馆。请提供推导。” (不要介意即使对于二项式 GLM 的最大似然解也没有封闭形式的解)。
无论如何,这里是否有人能够对整个讨论提供一些反馈,最好是从正式的统计角度,以便可能取悦塔勒布?特别是关于完全分离的问题以及如何在 2 样本二项式检验或逻辑回归中最好地处理它,以及获得精确 p 值的最佳选择是什么。
编辑:多考虑可能的选项,比较两个独立的二项式比例的精确无条件测试可能是最正确的。例如使用 Boschloo 的测试(https://en.wikipedia.org/wiki/Boschloo%27s_test):
library(Exact)
exact.test(rbind(c(0,2392), c(5,2470-5)), method="Boschloo", alternative="two.sided", model="Binomial")
# Boschloo's test, 2-tailed p = 0.06223
exact.test(rbind(c(0,2392), c(5,2470-5)), method="Boschloo", alternative="less", model="Binomial")
# Boschloo's test, 1-tailed p = 0.03196
尽管该exact.test
函数似乎有很多不同的方法,而且我不确定哪个是最好的(特别是对于计数低的情况和二项式期望 p=0 的组),因为我还没有挖掘了解所有这些方法的细节。例如method="Z-pooled"
,给出更乐观的 p 值,更接近我通过类似 Liddell 的 MC 方法获得的 p 值,以测试上述常见的比例p=5/(2392+2470)
:
exact.test(rbind(c(0,2392), c(5,2470-5)), method="Z-pooled", alternative="two.sided", model="Binomial")
# 2-tailed p-value = 0.02809
exact.test(rbind(c(0,2392), c(5,2470-5)), method="Z-pooled", alternative="less", model="Binomial")
# 1-tailed p-value = 0.01425
同样,使用library(exact2x2)
和使用method="FisherAdj"
我得到了更乐观的 p 值:
uncondExact2x2(0, 2392, 5, 2470, alternative="two.sided", method="FisherAdj")
# 2-tailed p = 0.03417
uncondExact2x2(0, 2392, 5, 2470, alternative="greater", method="FisherAdj")
# 1-tailed p = 0.01709
欢迎就这些测试中的哪一个在这里最合适的想法进行思考。
另一方面,如果考虑到假阴性 PCR 测试(就像 Taleb 喜欢在抗体测试中考虑假阳性一样),这可能会大大改变结论......也很确定一个需要知道哪些人接受了每种类型的测试,以及他们测试的所有其他呼吸道病毒的计数是多少。