scipy.stats.

false_discovery_control#

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

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

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

参数:
ps1D array_like

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

整数

执行调整的轴。调整是沿着每个轴切片独立进行的。如果 axis 是 None,则在执行调整之前,ps 会被展平。

方法{‘bh’, ‘by’}

要应用的错误发现率控制程序:'bh' 对应 Benjamini-Hochberg [1] (公式 1),'by' 对应 Benjaminini-Yekutieli [2] (定理 1.3)。后者更为保守,但它能保证即使在 p 值不是来自独立测试的情况下也能控制 FDR。

返回:
ps_adustedarray_like

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

注释

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

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

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

参考文献

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

Benjamini, Yoav, 和 Yosef Hochberg. “控制错误发现率:一种实用且强大的多重检验方法.” 皇家统计学会杂志: B辑 (方法论) 57.1 (1995): 289-300.

[2] (1,2)

Benjamini, Yoav, and Daniel Yekutieli. “在依赖性下多重检验中对错误发现率的控制。” 统计年刊 (2001): 1165-1188.

[3]

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

[4]

Neuhaus, Karl-Ludwig 等人。“通过前负荷给药方式改善急性心肌梗死中的溶栓治疗:rt-PA-APSAC 通畅性研究(TAPS)的结果。”《美国心脏病学院杂志》19.5 (1992): 885-891.

示例

我们遵循来自 [1] 的示例。

在心肌梗死中使用重组组织型纤溶酶原激活剂(rt-PA)和茴香酰化纤溶酶原链激酶激活剂(APSAC)进行溶栓已被证明能降低死亡率。[4] 研究了在急性心肌梗死患者中,一种新的前负荷rt-PA给药方案与标准APSAC方案相比的效果,该研究在421名患者中进行了随机多中心试验。

研究中测试了四组假设,最后一组是“开始溶栓治疗后的心脏和其他事件”。可能需要在这组假设中进行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值对应的假设可以被拒绝。根据[R4c2dbc17006a-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 值对应的零假设。拒绝第四个零假设对原始研究尤为重要,因为它导致了结论:新治疗具有“显著较低的住院死亡率”。