当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python SciPy stats.mannwhitneyu用法及代码示例


本文简要介绍 python 语言中 scipy.stats.mannwhitneyu 的用法。

用法:

scipy.stats.mannwhitneyu(x, y, use_continuity=True, alternative='two-sided', axis=0, method='auto', *, nan_policy='propagate', keepdims=False)#

对两个独立样本执行Mann-Whitney U 秩检验。

Mann-Whitney U 检验是零假设的非参数检验,即样本 x 的分布与样本 y 的分布相同。它通常被用作分布之间位置差异的测试。

参数

x, y 类数组

N-d 样本数组。数组必须是可广播的,除非沿轴给定的维度。

use_continuity 布尔型,可选

是否应应用连续性校正 (1/2)。默认为 True 时方法'asymptotic';否则没有任何影响。

alternative {‘双面’,‘less’, ‘greater’},可选

定义备择假设。默认为“双面”。令 F(u) 和 G(u) 分别为 x 和 y 基础分布的累积分布函数。那么以下替代假设可用:

  • “双面”:分布不相等,即对于至少一个 u,F(u) ≠ G(u)。

  • ‘less’:x 的分布随机小于 y 的分布,即所有 u 的 F(u) > G(u)。

  • ‘greater’:x 的分布随机大于 y 的分布,即对于所有 u,F(u) < G(u)。

请注意,上述替代假设中的数学表达式说明了基础分布的 CDF。乍一看,不等式的方向似乎与自然语言说明不一致,但事实并非如此。例如,假设XY是遵循 CDF 分布的随机变量FG, 分别。如果F(u) > G(u)对所有人u, 样本取自X往往少于从中抽取的Y.

在一组更具限制性的假设下,替代假设可以用分布的位置来表示;参见 [5] 第 5.1 节。

axis int 或无,默认值:0

如果是 int,则计算统计量的输入轴。输入的每个axis-slice(例如行)的统计信息将出现在输出的相应元素中。如果 None ,输入将在计算统计数据之前被分解。

method {‘auto’, ‘asymptotic’, ‘exact’},可选

选择用于计算 p 值的方法。默认为‘auto’。可以使用以下选项。

  • 'asymptotic' :将标准化测试统计量与正态分布进行比较,校正平局。

  • 'exact': 计算准确的p-通过比较观察到的值\(U\) 统计数据的准确分布\(U\) 零假设下的统计量。没有对关系进行更正。

  • 'auto' :当其中一个样本的大小小于或等于8并且没有平局时,选择'exact';否则选择'asymptotic'

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

定义如何处理输入 NaN。

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

  • omit : 计算时将省略NaNs。如果计算统计数据的轴切片中剩余的数据不足,则输出的相应条目将为 NaN。

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

keepdims 布尔值,默认值:假

如果将其设置为 True,则缩小的轴将作为尺寸为 1 的尺寸留在结果中。使用此选项,结果将针对输入数组正确广播。

返回

res MannwhitneyuResult

包含属性的对象:

统计 浮点数

与样本 x 对应的Mann-Whitney U 统计量。有关与样本 y 对应的检验统计量,请参见注释。

p值 浮点数

所选替代方案的相关 p 值。

注意

如果U1是与样本对应的统计量x,则与样本对应的统计量yU2 = x.shape[axis] * y.shape[axis] - U1.

mannwhitneyu 用于独立样本。对于相关/配对样本,请考虑 scipy.stats.wilcoxon

方法 'exact'当没有平局且任一样本量小于 8 时,建议使用[1].实现遵循最初提出的递归关系[1]如中所述[3].请注意,确切的方法是不是纠正了关系,但mannwhitneyu如果数据中存在关联,则不会引发错误或警告。

Mann-Whitney U 检验是独立样本t-test 的非参数版本。当总体样本均值呈正态分布时,请考虑 scipy.stats.ttest_ind

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

参考

[1] (1,2)

HB曼恩和 D.R.惠特尼,“关于两个随机变量中的一个是否随机大于另一个的测试”,数理统计年鉴,卷。 18,第 50-60 页,1947 年。

[2]

Mann-Whitney U 测试,维基百科,http://en.wikipedia.org/wiki/Mann-Whitney_U_test

[3]

A. Di Bucchianico,“组合学、计算机代数和Wilcoxon-Mann-Whitney 测试”,统计规划与推理杂志,卷。 79,第 349-364 页,1999。

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

Rosie Shier,“统计:2.3 Mann-Whitney U 测试”,数学学习支持中心,2004 年。

[5]

Michael P. Fay 和 Michael A. Proschan。 “Wilcoxon-Mann-Whitney还是t-test?关于假设检验的假设和对决策规则的多种解释。”统计调查,卷。 4,第 1-39 页,2010 年。https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2857732/

例子

我们遵循[4]中的例子:九名随机抽样的年轻人在以下年龄被诊断为II型糖尿病。

>>> males = [19, 22, 16, 29, 24]
>>> females = [20, 11, 17, 12]

我们使用Mann-Whitney U检验来评估男性和女性的诊断年龄是否存在统计学上的显著差异。零假设是男性诊断年龄分布与女性诊断年龄分布相同。我们决定需要 95% 的置信水平来拒绝零假设,以支持分布不同的替代方案。由于样本数量非常少并且数据中没有联系,我们可以将观察到的检验统计量与原假设下检验统计量的确切分布进行比较。

>>> from scipy.stats import mannwhitneyu
>>> U1, p = mannwhitneyu(males, females, method="exact")
>>> print(U1)
17.0

mannwhitneyu 始终报告与第一个样本相关的统计数据,在本例中为男性。这与[4]中报告的 一致。可以计算与第二个统计量相关的统计量:

>>> nx, ny = len(males), len(females)
>>> U2 = nx*ny - U1
>>> print(U2)
3.0

这符合\(U_F = 3\) 报道于[4]。双面的p-value 可以从任一统计量中计算出来,并且产生的值是mannwhitneyu同意\(p = 0.11\) 报道于[4].

>>> print(p)
0.1111111111111111

检验统计量的精确分布是渐近正态的,因此该示例继续将精确 p 值与使用正态近似生成的 p 值进行比较。

>>> _, pnorm = mannwhitneyu(males, females, method="asymptotic")
>>> print(pnorm)
0.11134688653314041

这里mannwhitneyu的报道p-value 似乎与 value 冲突\(p = 0.09\) 给出[4].原因是[4]不应用由执行的连续性校正mannwhitneyu;mannwhitneyu减少检验统计量与均值之间的距离\(\mu = n_x n_y / 2\) 0.5 以纠正离散统计量与连续分布进行比较的事实。在这里,\(U\) 使用的统计量小于平均值,因此我们通过在分子中添加 0.5 来减小距离。

>>> import numpy as np
>>> from scipy.stats import norm
>>> U = min(U1, U2)
>>> N = nx + ny
>>> z = (U - nx*ny/2 + 0.5) / np.sqrt(nx*ny * (N + 1)/ 12)
>>> p = 2 * norm.cdf(z)  # use CDF to get p-value from smaller statistic
>>> print(p)
0.11134688653314041

如果需要,我们可以禁用连续性校正以获得与 [4] 中报告的结果一致的结果。

>>> _, pnorm = mannwhitneyu(males, females, use_continuity=False,
...                         method="asymptotic")
>>> print(pnorm)
0.0864107329737

无论我们执行精确检验还是渐近检验,检验统计量偶然出现极端或更极端的概率超过 5%,因此我们认为结果不具有统计显著性。

假设在看到数据之前,我们假设女性往往比男性更年轻地被诊断出来。在这种情况下,很自然地提供女性年龄作为第一个输入,我们将使用 alternative = 'less' 进行单方面测试:女性的诊断年龄随机小于男性。

>>> res = mannwhitneyu(females, males, alternative="less", method="exact")
>>> print(res)
MannwhitneyuResult(statistic=3.0, pvalue=0.05555555555555555)

同样,在原假设下偶然获得足够低的检验统计值的概率大于 5%,因此我们不会拒绝原假设以支持我们的替代方案。

如果可以合理地假设来自总体的样本均值是正态分布的,我们可以使用t-test 来执行分析。

>>> from scipy.stats import ttest_ind
>>> res = ttest_ind(females, males, alternative="less")
>>> print(res)
Ttest_indResult(statistic=-2.239334696520584, pvalue=0.030068441095757924)

在此假设下,p 值将足够低,足以拒绝原假设并支持替代方案。

相关用法


注:本文由纯净天空筛选整理自scipy.org大神的英文原创作品 scipy.stats.mannwhitneyu。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。