我在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)
答案 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'
可以解决您的问题。