scipy.stats如何处理nans?

时间:2015-05-10 15:56:02

标签: python numpy statistics scipy missing-data

我正在尝试用Python做一些统计数据。我有几个缺少值的数据,填充np.nan,我不确定是否应该手动删除它,或者scipy可以处理它。所以我试过了两个:

 import scipy.stats, numpy as np
a = [0.75, np.nan, 0.58337, 0.75, 0.75, 0.91663, 1.0, np.nan, 0.663, 0.837,     0.837, 1.0, 0.663, 1.0, 1.0, 0.91663, 0.75, 0.41669, 0.58337, 0.663, 0.75, 0.58337] 
b = [0.837, np.nan, 0.663, 0.58337, 0.75, 0.75, 0.58337, np.nan, 0.166, 0.5,     0.663, 1.0, 0.91663, 1.0, 0.663, 0.75, 0.75, 0.41669, 0.331, 0.25, 1.0, 0.91663]

d_1, d_2 = a,b
wilc1 =  scipy.stats.wilcoxon(d_1, d_2, zero_method = 'pratt')

d_1, d_2 = [], []
for d1, d2 in zip(a, b):
    if np.isnan(d1) or np.isnan(d2):
        pass
    else:
        d_1.append(d1)
        d_2.append(d2)

wilc2 =  scipy.stats.wilcoxon(d_1, d_2, zero_method = 'pratt')
print wilc1
print wilc2

我得到两个运行时warnigs:

C:\Python27\lib\site-packages\scipy\stats\morestats.py:1963: RuntimeWarning: invalid value encountered in greater
  r_plus = sum((d > 0) * r, axis=0

和两个Wilcoxon输出

(54.0, 0.018545881687477818)
(54.0, 0.056806600853965265)

如您所见,我有两个类似的测试统计(W)和两个不同的P值。 哪个是正确的?

我的猜测,Wilcoxon在测试统计计算期间正确处理缺失值,但在P值计算期间,它使用所有数据的len(),而不仅仅是有效的情况。这可算作错误吗?

1 个答案:

答案 0 :(得分:2)

您无法在数学上执行基于nan的测试统计。 除非你找到关于nan的特殊处理的证据/文件,否则你不能依赖它。

我的经验是,一般来说,即使是numpy也不会特别对待nan,例如中位数。相反,结果是它们碰巧发生的任何结果,这是算法实现的结果。

例如,numpy.median()似乎最终将nan视为inf,将nan置于中位数之上。这可能只是a<b比较结果的副作用,对于nan来说总是错误的。类似的效果可能在您的两个相同的测试统计值W后面。

另请注意:numpy中有一些方法变体,例如http://docs.scipy.org/doc/numpy/reference/generated/numpy.nanmean.html