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 维数组。这些数组必须沿着 axis 给定的维度之外是可广播的。
- use_continuitybool, 可选
是否应应用连续性校正(1/2)。当 method 为
'asymptotic'
时,默认值为 True;否则无效。- 替代方案{‘双侧’, ‘小于’, ‘大于’}, 可选
定义备择假设。默认是 ‘two-sided’。设 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。不等式的方向乍一看似乎与自然语言描述不一致,但事实并非如此。例如,假设 X 和 Y 是随机变量,分别遵循具有CDF F 和 G 的分布。如果对于所有 u,F(u) > G(u),则从 X 中抽取的样本往往小于从 Y 中抽取的样本。
在更严格的假设条件下,备择假设可以用分布的位置来表示;参见 [5] 第5.1节。
- 轴int 或 None, 默认值: 0
如果是一个整数,表示输入数据中要计算统计量的轴。输入数据的每个轴切片(例如行)的统计量将出现在输出的相应元素中。如果为
None
,则在计算统计量之前会将输入数据展平。- 方法 : {‘自动’, ‘渐近’, ‘精确’} 或 排列方法 实例, 可选{‘auto’, ‘asymptotic’, ‘exact’} 或
选择用于计算 p 值的方法。默认是 ‘auto’。以下选项可用。
'asymptotic'
: 将标准化检验统计量与正态分布进行比较,并修正了平局情况。'exact'
: 通过将观察到的 \(U\) 统计量与零假设下 \(U\) 统计量的精确分布进行比较,计算精确的 p 值。不进行平局校正。'auto'
: 当其中一个样本的大小小于或等于8且没有平局时,选择'exact'
;否则选择'asymptotic'
。PermutationMethod
实例。在这种情况下,p 值是使用permutation_test
根据提供的配置选项和其他适当的设置计算的。
- nan_policy{‘propagate’, ‘omit’, ‘raise’}
定义如何处理输入的 NaN。
propagate
: 如果在计算统计量的轴切片(例如行)中存在 NaN,则输出的相应条目将为 NaN。omit
: 在执行计算时,NaN 将被省略。如果在计算统计量的轴切片中剩余的数据不足,则输出的相应条目将为 NaN。raise
: 如果存在 NaN,将引发ValueError
。
- keepdimsbool, 默认值: False
如果设置为True,被减少的轴将作为尺寸为1的维度保留在结果中。通过此选项,结果将正确地与输入数组进行广播。
- 返回:
- resMannwhitneyuResult
一个包含属性的对象:
- 统计浮动
与样本 x 对应的 Mann-Whitney U 统计量。有关与样本 y 对应的检验统计量,请参见注释。
- p值浮动
所选 alternative 的关联 p-值。
注释
如果
U1
是与样本 x 对应的统计量,那么与样本 y 对应的统计量是U2 = x.shape[axis] * y.shape[axis] - U1
。mannwhitneyu
用于独立样本。对于相关/配对样本,请考虑scipy.stats.wilcoxon
。当没有并列情况且任一样本量小于8时,推荐使用 method
'exact'
[1]。实现遵循了[R31b0b1c0fec3-3]_中报告的算法。请注意,精确方法*不*对并列情况进行修正,但如果数据中存在并列,mannwhitneyu
不会引发错误或警告。如果存在并列且任一样本较小(少于约10个观察值),考虑将PermutationMethod
的实例作为 method 传递,以执行置换检验。Mann-Whitney U 检验是独立样本 t 检验的非参数版本。当总体样本的均值呈正态分布时,考虑使用
scipy.stats.ttest_ind
。从 SciPy 1.9 开始,
np.matrix
输入(不推荐用于新代码)在计算执行前被转换为np.ndarray
。在这种情况下,输出将是一个标量或适当形状的np.ndarray
,而不是一个 2D 的np.matrix
。同样,虽然掩码数组的掩码元素被忽略,但输出将是一个标量或np.ndarray
,而不是一个mask=False
的掩码数组。参考文献
[1]H.B. Mann 和 D.R. Whitney, “关于检验两个随机变量中是否有一个比另一个更随机大的测试”, 《数理统计年鉴》, 第18卷, 第50-60页, 1947年。
[2]Mann-Whitney U 检验, Wikipedia, http://en.wikipedia.org/wiki/Mann-Whitney_U_test
[3]Andreas Löffler, “关于自然数分区及其在U检验中的应用”,Wiss. Z. Univ. Halle, XXXII’83, 第87-89页。
[5]Michael P. Fay 和 Michael A. Proschan。“Wilcoxon-Mann-Whitney 还是 t 检验?关于假设检验的假设和决策规则的多重解释。”统计调查,第 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] 中报告的 \(U_M = 17\) 一致。与第二个统计量相关的统计量可以计算:>>> nx, ny = len(males), len(females) >>> U2 = nx*ny - U1 >>> print(U2) 3.0
这与 [4] 中报告的 \(U_F = 3\) 一致。双侧 p-值可以从任一统计量计算得出,
mannwhitneyu
生成的值与 [4] 中报告的 \(p = 0.11\) 一致。>>> print(p) 0.1111111111111111
测试统计量的精确分布是渐近正态的,因此示例继续通过将精确的 p 值与使用正态近似产生的 p 值进行比较。
>>> _, pnorm = mannwhitneyu(males, females, method="asymptotic") >>> print(pnorm) 0.11134688653314041
这里
mannwhitneyu
报告的 p 值似乎与 [4] 中给出的 \(p = 0.09\) 值相冲突。原因是 [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 检验来进行分析。
>>> from scipy.stats import ttest_ind >>> res = ttest_ind(females, males, alternative="less") >>> print(res) TtestResult(statistic=-2.239334696520584, pvalue=0.030068441095757924, df=7.0)
在这个假设下,p-值将足够低,以至于我们可以拒绝原假设,转而支持备择假设。