在指定的numpy轴上计算mannwhitneyu

时间:2014-10-07 07:47:52

标签: python arrays numpy statistics scipy

Mann-Witney-U-test是t参数的非参数等价物,只能用于正态分布数据。在Scipy中,两种测试均可用:

t-test:http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.ttest_ind.html

Mann-Witney-U-test:http://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.stats.mannwhitneyu.html

虽然ttest可以通过例如3d数组通过指定轴来执行计算,这似乎不可能用于Mann-Witney-U-test?

import numpy
from scipy import stats

A1= numpy.random.normal(1,1,50).reshape(25, 2)
A2= numpy.random.normal(1,1,50).reshape(25, 2)
A3= numpy.random.normal(1,1,50).reshape(25, 2)
A4= numpy.random.normal(1,1,50).reshape(25, 2)
A5= numpy.random.normal(1,1,50).reshape(25, 2)
A = numpy.dstack((A1,A2,A3,A4,A5))

B1= numpy.random.normal(3,1,50).reshape(25, 2)
B2= numpy.random.normal(3,1,50).reshape(25, 2)
B3= numpy.random.normal(3,1,50).reshape(25, 2)
B4= numpy.random.normal(3,1,50).reshape(25, 2)
B5= numpy.random.normal(3,1,50).reshape(25, 2)
B = numpy.dstack((B1,B2,B3,B4,B5))

ttest_result = stats.ttest_ind(A,B,axis=2)

但是不能指定Mann-Witney-U-test的轴(如stats.mannwhitneyu(A1,B1,axis=2)

是否有可能为指定的3D阵列轴运行mannwhitneyu? 由于mannwhitneyu()接受两个数组,numpy.apply_along_axis()也不能直接使用。有什么建议?

1 个答案:

答案 0 :(得分:0)

如果你想在这个例子中在第3轴上执行类似的操作,我想你可以做到以下几点:

In [304]:

result = map(stats.mannwhitneyu, A.reshape(-1, A.shape[2]),B.reshape(-1, B.shape[2]))
u = np.array([item[0] for item in result]).reshape(A.shape[0], -1)
p = np.array([item[1] for item in result]).reshape(A.shape[0], -1)
In [305]:

u
Out[305]:
array([[ 0.,  4.],
       ...
       [ 1.,  2.]])
In [306]:

p
Out[306]:
array([[ 0.00609289,  0.04734647],
       ...
       [ 0.01078587,  0.01835693]])