scipy.stats.

combine_pvalues#

scipy.stats.combine_pvalues(pvalues, method='fisher', weights=None, *, axis=0, nan_policy='propagate', keepdims=False)[source]#

合并来自独立检验的 p 值,这些检验与同一假设相关。

这些方法仅用于合并基于连续分布的假设检验中的 p 值。

每种方法都假定在零假设下,p 值从区间 [0, 1] 中独立且均匀地采样。 计算检验统计量(每种方法不同),并基于零假设下该检验统计量的分布计算合并的 p 值。

参数:
pvalues类数组

假设来自基于连续分布的独立检验的 p 值数组。

method{‘fisher’, ‘pearson’, ‘tippett’, ‘stouffer’, ‘mudholkar_george’}

用于合并 p 值的方法名称。

可用的方法有(详细信息请参见 Notes)

  • ‘fisher’:Fisher 方法(Fisher 组合概率检验)

  • ‘pearson’:Pearson 方法

  • ‘mudholkar_george’:Mudholkar 和 George 方法

  • ‘tippett’:Tippett 方法

  • ‘stouffer’:Stouffer Z 分数法

weights类数组,可选

仅用于 Stouffer Z 分数法的可选权重数组。 其他方法忽略。

axisint 或 None,默认值:0

如果为 int,则为输入沿其计算统计量的轴。 输入的每个轴切片(例如,行)的统计量将出现在输出的相应元素中。 如果 None,则在计算统计量之前将输入展平。

nan_policy{‘propagate’, ‘omit’, ‘raise’}

定义如何处理输入 NaN。

  • propagate:如果存在 NaN,则沿着计算统计量的轴切片(例如,行)中的输出的相应条目将为 NaN。

  • omit:执行计算时将忽略 NaN。 如果在沿着计算统计量的轴切片中剩余的数据不足,则输出的相应条目将为 NaN。

  • raise:如果存在 NaN,则将引发 ValueError

keepdimsbool,默认值:False

如果将其设置为 True,则减少的轴将保留在结果中,作为大小为 1 的维度。 使用此选项,结果将正确地与输入数组广播。

返回值:
resSignificanceResult

包含属性的对象

statisticfloat

指定方法计算的统计量。

pvaluefloat

合并的 p 值。

说明

如果此函数应用于具有离散统计量(例如任何秩检验或列联表检验)的检验,则会产生系统性错误的结果,例如,Fisher 方法会系统性地高估 p 值 [1]。 当离散分布变得近似连续时,此问题对于大样本量而言变得不那么严重。

通过它们的统计量以及它们在考虑显著性时强调的 p 值组合的哪些方面,可以最好地说明这些方法之间的差异 [2]。 例如,强调大 p 值的方法对强烈的假阴性和真阴性更敏感; 相反,关注小 p 值的方法对阳性更敏感。

  • Fisher 方法(也称为 Fisher 组合概率检验)的统计量 [3]\(-2\sum_i \log(p_i)\),它等价于(作为检验统计量)单个 p 值的乘积: \(\prod_i p_i\)。 在零假设下,此统计量遵循 \(\chi^2\) 分布。 此方法强调小 p 值。

  • Pearson 方法使用 \(-2\sum_i\log(1-p_i)\),它等价于 \(\prod_i \frac{1}{1-p_i}\) [2]。 因此,它强调大 p 值。

  • Mudholkar 和 George 通过平均它们的统计量来折衷 Fisher 和 Pearson 方法 [4]。 它们的方法强调极端的 p 值,无论是接近 1 还是 0。

  • Stouffer 方法 [5] 使用 Z 分数和统计量: \(\sum_i \Phi^{-1} (p_i)\),其中 \(\Phi\) 是标准正态分布的 CDF。 这种方法的优点是可以直接引入权重,这使得当 p 值来自不同大小的研究时,Stouffer 方法比 Fisher 方法更强大 [6] [7]

  • Tippett 方法使用最小的 p 值作为统计量。 (请注意,此最小值不是合并的 p 值。)

Fisher 方法可以扩展到合并来自相关检验的 p 值 [8]。 诸如 Brown 方法和 Kost 方法之类的扩展当前尚未实现。

在版本 0.15.0 中添加。

从 SciPy 1.9 开始,在执行计算之前,np.matrix 输入(不建议用于新代码)将转换为 np.ndarray。 在这种情况下,输出将是标量或具有适当形状的 np.ndarray,而不是 2D np.matrix。 类似地,虽然忽略了屏蔽数组的屏蔽元素,但输出将是标量或 np.ndarray,而不是 mask=False 的屏蔽数组。

combine_pvalues 除了 NumPy 之外,还对 Python Array API Standard 兼容后端提供实验性支持。 请考虑通过设置环境变量 SCIPY_ARRAY_API=1 并提供 CuPy、PyTorch、JAX 或 Dask 数组作为数组参数来测试这些功能。 支持以下后端和设备(或其他功能)的组合。

CPU

GPU

NumPy

不适用

CuPy

不适用

PyTorch

JAX

⚠️ 无 JIT

⚠️ 无 JIT

Dask

⚠️ 计算图

不适用

有关更多信息,请参见 支持数组 API 标准

参考资料

[1]

Kincaid, W. M., “The Combination of Tests Based on Discrete Distributions.” Journal of the American Statistical Association 57, no. 297 (1962), 10-19.

[2] (1,2)

Heard, N. and Rubin-Delanchey, P. “Choosing between methods of combining p-values.” Biometrika 105.1 (2018): 239-246.

[4]

George, E. O., and G. S. Mudholkar. “On the convolution of logistic random variables.” Metrika 30.1 (1983): 1-13.

[6]

Whitlock, M. C. “Combining probability from independent tests: the weighted Z-method is superior to Fisher’s approach.” Journal of Evolutionary Biology 18, no. 5 (2005): 1368-1373.

[7]

Zaykin, Dmitri V. “Optimally weighted Z-test is a powerful method for combining probabilities in meta-analysis.” Journal of Evolutionary Biology 24, no. 8 (2011): 1836-1841.

示例

假设我们希望使用 Fisher 方法(默认)合并来自同一零假设的四个独立检验的 p 值。

>>> from scipy.stats import combine_pvalues
>>> pvalues = [0.1, 0.05, 0.02, 0.3]
>>> combine_pvalues(pvalues)
SignificanceResult(statistic=20.828626352604235, pvalue=0.007616871850449092)

当单个 p 值具有不同的权重时,请考虑 Stouffer 方法。

>>> weights = [1, 2, 3, 4]
>>> res = combine_pvalues(pvalues, method='stouffer', weights=weights)
>>> res.pvalue
0.009578891494533616