Scipy中的T检验具有NaN值

时间:2016-05-04 08:54:28

标签: python numpy scipy anaconda

我在scipy做一个T测试时遇到了问题,这让我慢慢疯狂。它应该很容易解决,但我没有做任何工作,我找不到通过广泛搜索找到的解决方案。我在最新发行的Anaconda上使用Spyder。

具体来说:我想比较两列之间的平均值 - ' Trait_A'和' Trait_B' - 在我从csv文件导入的pandas数据框中。其中一列中的某些值是“Nan”和“#39; ('不是数字')。独立样本scipy t-test函数的默认设置不能容纳NaN'值。但是,setting the 'nan_policy' parameter to 'omit' should deal with this。然而,当我这样做时,测试统计和p值会以“NaN”的形式返回。'当我将所涵盖的值的范围限制为实际数字时,测试工作正常。我的数据和代码如下;任何人都可以建议我做错了什么?谢谢!

数据:

     Trait_A   Trait_B
0   1.714286  0.000000
1   4.275862  4.000000
2   0.500000  4.625000
3   1.000000  0.000000
4   1.000000  4.000000
5   1.142857  1.000000
6   2.000000  1.000000
7   9.416667  1.956522
8   2.052632  0.571429
9   2.100000  0.166667
10  0.666667  0.000000
11  2.333333  1.705882
12  2.768145       NaN
13  0.000000       NaN
14  6.333333       NaN
15  0.928571       NaN

我的代码:

import pandas as pd
import scipy.stats as sp
data= pd.read_csv("filepath/Data2.csv")
print (sp.stats.ttest_ind(data['Trait_A'], data['Trait_B'], nan_policy='omit'))      

我的结果:

Ttest_indResult(statistic=nan, pvalue=nan)

2 个答案:

答案 0 :(得分:13)

这似乎是一个错误。 您可以在将nan传递给t检验之前将其删除:

sp.stats.ttest_ind(data.dropna()['Trait_A'], data.dropna()['Trait_B'])
Ttest_indResult(statistic=0.88752464718609214, pvalue=0.38439692093551037)

答案 1 :(得分:1)

该错误在第3885行,文件 scipy / scipy / stats / stats.py

# check both a and b
contains_nan, nan_policy = (_contains_nan(a, nan_policy) or
                            _contains_nan(b, nan_policy))

必须是

contains_nan             = (_contains_nan(a, nan_policy)[0] or
                            _contains_nan(b, nan_policy)[0])

在您的案例中交换'Trait_A''Trait_B'可以解决您的问题。