scipy中Mann-Whitney U检验的问题

机器算法验证 wilcoxon-mann-whitney 检验 scipy
2022-03-17 16:41:57

我正在尝试使用 scipy 对真实数据集执行 Mann-Whitney 测试。我提取了一个出现问题的例子。似乎函数 tiecorrect 返回负值,这是我认为问题的根源。这是我的情况

import scipy.stats

x = [1.] * 163 + [2.] * 81 + [3.] * 40 + [4.] * 6 + [5.] * 2
y = [1.] * 1007 + [2.] * 362 + [3.] * 99 + [4.] * 27 + [5.] * 13 # real-world example

print scipy.stats.mannwhitneyu(x,y)

我已经使用 SPSS 和 R 成功地对同一案例进行了 MW 测试,但我想弄清楚如何在 scipy 中进行处理。

2个回答

包中可能存在错误,但如果您分别存储uprob输出,您将看到该u值,尽管由于prob某种原因缺少 。

u, prob=scipy.stats.mannwhitneyu(x,y)

u
Out[18]: 193405.5

prob
Out[19]: nan

然后,您可以使用的正态近似来获得 p 值。对于大样本, 其中具有近似标准正态分布。U

z=UmUσU
mU=n1n22σU=n1n2(n1+n2+1)12

m_u = len(x)*len(y)/2

sigma_u = np.sqrt(len(x)*len(y)*(len(x)+len(y)+1)/12)

z = (u - m_u)/sigma_u

z
Out[23]: -3.2920646126227546

然后你可以计算一个p值。

pval = 2*scipy.stats.norm.cdf(z)

pval
Out[27]: 0.00099454759456888472

Scipy 可能正在尝试计算的直接零假设分布,但考虑到您拥有的观察数量,正态近似应该可以正常工作。U

这个线程很旧,但是对于像我这样遇到这个 scipy 错误并发现自己在这里的人来说 -

问题确实是 tiecorrect 函数scipy.stats.mannwhitneyu(x,y)

如果您不需要平局校正,则scipy.stats.ranksums(x,y)测试可以正常工作。

对于您的情况:

import scipy.stats

x = [1.] * 163 + [2.] * 81 + [3.] * 40 + [4.] * 6 + [5.] * 2
y = [1.] * 1007 + [2.] * 362 + [3.] * 99 + [4.] * 27 + [5.] * 13 # real-world example

print(scipy.stats.ranksums(x,y))
Out[6]: RanksumsResult(statistic=3.2920646126227546, pvalue=0.00099454759456888472)