scipy.stats.

false_discovery_control#

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

调整 p 值以控制错误发现率。

错误发现率 (FDR) 是预期被拒绝的零假设中实际上为真的比例。如果在调整后的 p 值低于指定水平时拒绝零假设,则错误发现率将控制在该水平。

参数:
ps1D 类数组

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

axisint

执行调整的轴。沿着每个轴切片独立执行调整。如果 axis 为 None,则在执行调整之前对 ps 进行扁平化处理。

method{‘bh’, ‘by’}

要应用的错误发现率控制程序:'bh' 用于 Benjamini-Hochberg [1] (Eq. 1),'by' 用于 Benjaminini-Yekutieli [2] (Theorem 1.3)。后者更保守,但保证即使 p 值不是来自独立测试,也能控制 FDR。

返回值:
ps_adusted类数组

调整后的 p 值。如果在这些值低于指定水平时拒绝零假设,则错误发现率将控制在该水平。

备注

在多重假设检验中,错误发现控制程序往往比 familywise 误差率控制程序(例如 Bonferroni 校正 [1])提供更高的功效。

如果 p 值对应于独立测试(或具有“正回归依赖性”的测试 [2]),则拒绝与低于 \(q\) 的 Benjamini-Hochberg 调整后的 p 值相对应的零假设,会将错误发现率控制在小于或等于 \(q m_0 / m\) 的水平,其中 \(m_0\) 是真实零假设的数量,而 \(m\) 是测试的零假设的总数。即使对于相关测试,当根据更保守的 Benjaminini-Yekutieli 程序调整 p 值时,情况也是如此。

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

参考文献

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

Benjamini, Yoav, and Yosef Hochberg. “Controlling the false discovery rate: a practical and powerful approach to multiple testing.” Journal of the Royal statistical society: series B (Methodological) 57.1 (1995): 289-300.

[2] (1,2)

Benjamini, Yoav, and Daniel Yekutieli. “The control of the false discovery rate in multiple testing under dependency.” Annals of statistics (2001): 1165-1188.

[3]

TileStats. FDR - Benjamini-Hochberg explained - Youtube. https://www.youtube.com/watch?v=rZKa4tW2NKs.

[4]

Neuhaus, Karl-Ludwig, et al. “Improved thrombolysis in acute myocardial infarction with front-loaded administration of alteplase: results of the rt-PA-APSAC patency study (TAPS).” Journal of the American College of Cardiology 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 值低于所选的显着性水平。 然而,这将忽略“多重性”问题:如果我们未能纠正正在执行多重比较这一事实,我们更有可能错误地拒绝真实的零假设。

解决多重性问题的一种方法是控制 family-wise 误差率 (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 值对应的零假设。 拒绝第四个零假设对原始研究特别重要,因为它导致了新疗法具有“显着降低的院内死亡率”的结论。