scipy.stats.

false_discovery_control#

scipy.stats.false_discovery_control(ps, *, axis=0, method='bh')[source]#

调整 p 值以控制假发现率。

假发现率 (FDR) 是指被拒绝的零假设实际上为真的预期比例。如果被拒绝的零假设是经过将调整后的 p 值降低至指定水平后得到的,则假发现率在此水平受到控制。

参数:
ps一维数组式

要调整的 p 值。元素必须介于 0 和 1 之间。

axisint

执行调整的轴。调整将独立地对每个轴切片执行。如果 axis 为 None,在执行调整之前将会展开 ps

method{‘bh’, ‘by’}

要应用的错误发现率控制程序:'bh' 适用于本杰明-霍赫伯格 [1](等式 1),'by' 适用于本杰明-耶库蒂埃利 [2](定理 1.3)。后者更为保守,但即使 p 值不来自独立测试时,也可以确保控制 FDR。

收益:
ps_adusted类似数组

调整的 p 值。如果这些值低于指定水平且拒绝了原假设,则在该水平会控制错误发现率。

备注

在多重假设检验中,错误发现控制程序倾向于比全家族错误率控制程序(例如邦弗罗尼校正 [1])提供更高的效用。

如果 p 值与独立测试(或具有“正回归依赖性” [2] 的测试)相对应,则拒绝与低于 \(q\) 的本杰明-霍赫伯格调整 p 值相对应的原假设时,错误发现率会在小于或等于 \(q m_0 / m\) 的水平上得到控制,其中 \(m_0\) 是真原假设的数量,\(m\) 是检验的原假设总数。即使在 p 值根据更为保守的本杰明-耶库蒂埃利程序进行调整时对于相关测试,也适用同样的原则。

此函数产生的调整后的 p 值与 R 函数 p.adjust 和 statsmodels 函数 statsmodels.stats.multitest.multipletests 产生的 p 值相当。更高级别的多重比较校正方法,请考虑后者。

参考文献

[1] (1,2,3,4,5)

本杰明,约阿夫,约瑟夫·霍赫伯格。“控制错误发现率:一种实用且有效的多重检验方法。”皇家统计学会杂志:系列 B(方法论)57.1(1995):289-300。

[2] (1,2)

本杰明,约阿夫,达尼尔·耶库蒂埃利。“在相关性下对多重检验中的错误发现率的控制。”统计算年鉴(2001):1165-1188。

[3]

TileStats。FDR - 本杰明-霍赫伯格解释 - YouTube。https://www.youtube.com/watch?v=rZKa4tW2NKs

[4]

诺伊豪斯,卡尔-路德维希等人。“急性心肌梗死中阿替普酶的前负荷给药改善溶栓:rt-PA-APSAC 通畅性研究 (TAPS) 的结果。”美国心脏病学会杂志 19.5 (1992):885-891。

示例

我们遵循 [1] 中的示例。

已证明,组织型纤溶酶原激活物(rt-PA)和安息香酰基化纤溶酶原链激酶激活物(APSAC)对心肌梗死的血栓溶解可以降低死亡率。[4]在 421 名急性心肌梗死患者的随机多中心试验中调查了 rt-PA 新的前负荷给药与 APSAC 标准方案相比的效果。

研究中测试了四大类假设,其中最后一条是“血栓溶解治疗开始后的心脏和其他事件”。在此类假设中,可能会希望应用 FDR 控制,因为如果前负荷治疗仅仅与前一治疗等效,则不适合得出其更好的结论。

此类假设中 15 条假设对应的 p 值为

>>> ps = [0.0001, 0.0004, 0.0019, 0.0095, 0.0201, 0.0278, 0.0298, 0.0344,
...       0.0459, 0.3240, 0.4262, 0.5719, 0.6528, 0.7590, 1.000]

如果所选显著性水平为 0.05,我们也许会倾向于拒绝对应前九个 p 值的检验的原假设,因为前九个 p 值低于所选显著性水平。但是,这将忽略“多重性”的问题:如果我们未能校正进行多次比较这一事实,则我们可能会错误地拒绝真实的原假设。

解决多重性问题的其中一种方法是控制家庭错误率 (FWER),即错误拒绝原假设(实际上为真)的比率。此类常见程序是 Bonferroni 校正[1]。我们首先将 p 值乘以所测试假设的数量。

>>> import numpy as np
>>> np.array(ps) * len(ps)
array([1.5000e-03, 6.0000e-03, 2.8500e-02, 1.4250e-01, 3.0150e-01,
       4.1700e-01, 4.4700e-01, 5.1600e-01, 6.8850e-01, 4.8600e+00,
       6.3930e+00, 8.5785e+00, 9.7920e+00, 1.1385e+01, 1.5000e+01])

要将 FWER 控制在 5%,我们只会拒绝调整后 p 值小于 0.05 的假设。在这种情况下,只有对应前三个 p 值的假设会被拒绝。根据[1],这三个假设涉及“过敏反应”和“出血的两个不同方面”。

另一种方法是控制错误发现率:实际上为真而被拒绝的原假设的预期分数。此方法的优点是通常可以提供更大的功效:当原假设实际为假时,拒绝原假设的比率会增加。要将错误发现率控制在 5%,我们应用 Benjamini-Hochberg p 值调整。

>>> from scipy import stats
>>> stats.false_discovery_control(ps)
array([0.0015    , 0.003     , 0.0095    , 0.035625  , 0.0603    ,
       0.06385714, 0.06385714, 0.0645    , 0.0765    , 0.486     ,
       0.58118182, 0.714875  , 0.75323077, 0.81321429, 1.        ])

现在,前四个调整后 p 值都低于 0.05,因此,我们会拒绝对应这四个 p 值的原假设。第四个原假设的拒绝对于原始研究特别重要,因为它得出了新的治疗方法“住院死亡率显着降低”的结论。