Lod*_*e66 8 python numpy scipy anaconda
我在scipy做一个t测试有问题,这让我慢慢疯了.它应该很容易解决,但我没有做任何工作,我找不到通过广泛搜索找到的解决方案.我在最新的Anaconda发行版上使用Spyder.
具体来说:我想在我从csv文件导入的pandas数据帧中比较两列之间的平均值 - "Trait_A"和"Trait_B".其中一列中的某些值为"Nan"("非数字").独立样本scipy t-test函数的默认设置不适应'NaN'值.但是,将'nan_policy'参数设置为'省略'应该处理此问题.然而,当我这样做时,测试统计数据和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
Run Code Online (Sandbox Code Playgroud)
我的代码:
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'))
Run Code Online (Sandbox Code Playgroud)
我的结果:
Ttest_indResult(statistic=nan, pvalue=nan)
Run Code Online (Sandbox Code Playgroud)
ayh*_*han 14
这似乎是个bug.您可以nan
在将它们传递给t检验之前删除:
sp.stats.ttest_ind(data.dropna()['Trait_A'], data.dropna()['Trait_B'])
Ttest_indResult(statistic=0.88752464718609214, pvalue=0.38439692093551037)
Run Code Online (Sandbox Code Playgroud)
该错误位于文件scipy/scipy/stats/stats.py中的第 3885 行:
# check both a and b
contains_nan, nan_policy = (_contains_nan(a, nan_policy) or
_contains_nan(b, nan_policy))
Run Code Online (Sandbox Code Playgroud)
必须是
contains_nan = (_contains_nan(a, nan_policy)[0] or
_contains_nan(b, nan_policy)[0])
Run Code Online (Sandbox Code Playgroud)
交换'Trait_A'
并'Trait_B'
根据您的情况解决您的问题。