繁体   English   中英

使用Pandas和Scipy的数据帧Spearman相关性之间的差异

[英]Differences between dataframe spearman correlation using pandas and scipy

我有一个相当大的矩阵(4780,5460),并使用“ pandas.DataFrame.corr”和“ scipy.stats.spearmanr”计算了行之间的Spearman相关性。 每个函数都返回非常不同的相关系数,现在我不确定哪个是“正确的”,或者我的数据集是否更适合于不同的实现。

一些语境化:我要测试相关性的向量(行)不一定具有相同的点,某些列中存在NaN,而其他列中没有。

df.T.corr(method='spearman')
(r, p) = spearmanr(df.T)
df2 = pd.DataFrame(index=df.index, columns=df.columns, data=r)

In[47]: df['320840_93602.563']
Out[47]: 
320840_93602.563                    1.000000
3254_642.148.peg.3256               0.565812
13752_42938.1206                    0.877192
319002_93602.870                    0.225530
328_642.148.peg.330                 0.658269
                                      ...   
12566_42938.19                      0.818395
321125_93602.2882                   0.535577
319185_93602.1135                   0.678397
29724_39.3584                       0.770453
321030_93602.1962                   0.738722
Name: 320840_93602.563, dtype: float64

In[32]: df2['320840_93602.563']
Out[32]: 
320840_93602.563                    1.000000
3254_642.148.peg.3256               0.444675
13752_42938.1206                    0.286933
319002_93602.870                    0.225530
328_642.148.peg.330                 0.606619
                                      ...   
12566_42938.19                      0.212265
321125_93602.2882                   0.587409
319185_93602.1135                   0.696172
29724_39.3584                       0.097753
321030_93602.1962                   0.163417
Name: 320840_93602.563, dtype: float64

scipy.stats.spearmanr并非设计用于处理nan ,其行为与nan值是不确定的。 [ 更新scipy.stats.spearmanr现在具有参数nan_policy 。]

对于没有nan的数据,函数似乎同意:

In [92]: np.random.seed(123)

In [93]: df = pd.DataFrame(np.random.randn(5, 5))

In [94]: df.T.corr(method='spearman')
Out[94]: 
     0    1    2    3    4
0  1.0 -0.8  0.8  0.7  0.1
1 -0.8  1.0 -0.7 -0.7 -0.1
2  0.8 -0.7  1.0  0.8 -0.1
3  0.7 -0.7  0.8  1.0  0.5
4  0.1 -0.1 -0.1  0.5  1.0

In [95]: rho, p = spearmanr(df.values.T)

In [96]: rho
Out[96]: 
array([[ 1. , -0.8,  0.8,  0.7,  0.1],
       [-0.8,  1. , -0.7, -0.7, -0.1],
       [ 0.8, -0.7,  1. ,  0.8, -0.1],
       [ 0.7, -0.7,  0.8,  1. ,  0.5],
       [ 0.1, -0.1, -0.1,  0.5,  1. ]])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM