scipy.stats 如何处理 nans?

How scipy.stats handles nans?

我正在尝试在 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

我收到两个运行时警告:

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(),而不仅仅是有效案例。这可以算作错误吗?

您不能基于 nan 在数学上执行测试统计。 除非你找到 proof/documentation 对 nan 的特殊处理,否则你不能依赖它。

我的经验是,一般来说,即使是 numpy 也不会对 nan 进行特殊处理,例如 median。相反,结果是算法实现的结果。

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

后面

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