【问题标题】:How scipy.stats handles nans?scipy.stats 如何处理 nans?
【发布时间】:2015-07-21 02:49:37
【问题描述】:

我正在尝试用 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(),而不仅仅是有效案例。这能算bug吗?

【问题讨论】:

  • 一般来说,numpy 和 scipy 都不会在内部将 NaN 视为“缺失数据”。相反,它被解释为“无效”或“未定义”,如 0/0。这与具有本地 NA 的 R 形成对比,这意味着“缺失数据”,并且与构建在 numpy 和 scipy 之上但使用 NaN 的“缺失数据”解释的“pandas”形成对比。

标签: python numpy statistics scipy missing-data


【解决方案1】:

您不能在数学上执行基于 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-22
    • 2013-04-07
    • 1970-01-01
    • 2018-07-07
    • 1970-01-01
    • 2020-04-26
    • 1970-01-01
    相关资源
    最近更新 更多