【问题标题】:How to calculate Spearman's rank correlation between two datasets如何计算两个数据集之间的 Spearman 等级相关性
【发布时间】:2016-12-09 17:20:16
【问题描述】:

如果我们有:

X = pd.DataFrame({"A":[34,12,78,84,26], "B":[54,87,35,25,82], "C":[56,78,0,14,13], "D":[0,23,72,56,14], "E":[78,12,31,0,34]})
Y = pd.DataFrame({"A":[45,24,65,65,65], "B":[45,87,65,52,12], "C":[98,52,32,32,12], "D":[0,23,1,365,53], "E":[24,12,65,3,65]})

我们如何计算两个数据集之间的Spearman's Rank Correlation(但不在每个数据集中),这样最终我们就有了一个 5x5 的矩阵? 像这样:

    A  B  C  D  E
A   .  .  .  .  .
B   .  .  .  .  .
C   .  .  .  .  .
D   .  .  .  .  .
E   .  .  .  .  .

【问题讨论】:

  • 如果你只想计算匹配列的相关性,你不应该得到一个包含 5 个分量的向量吗? (相对于 5x5 矩阵)?
  • 对不起,我的意思是我们在两个轴上都没有两个数据集

标签: python correlation


【解决方案1】:

使用 pandas 的 concatcorr 函数,您可以将所有内容放在一个 DataFrame 中,从而将其变成一个衬里:

import pandas as pd

X = pd.DataFrame({"A":[34,12,78,84,26], "B":[54,87,35,25,82], "C":[56,78,0,14,13], "D":[0,23,72,56,14], "E":[78,12,31,0,34]})
Y = pd.DataFrame({"A1":[45,24,65,65,65], "B1":[45,87,65,52,12], "C1":[98,52,32,32,12], "D1":[0,23,1,365,53], "E1":[24,12,65,3,65]})

pd.concat([X,Y], axis=1).corr(method="spearman").iloc[5:,:5]

请注意,在我的示例中,我为第二组列指定了不同的名称,以使它们更易于区分。使用 pandas 的索引功能,您可以想出一种比我的 .iloc[5:,:5] 更复杂的方法来从相关表中挑选所需的行/列,但在这种情况下它可以工作。


编辑以添加结果:

【讨论】:

  • 为了使列可区分,还可以使用.add_prefix:pd.concat([X.add_prefix("X_"), Y.add_prefix("Y_")],axis = 1 )
  • 谢谢,这也与我在代码中得到的结果一致。我问这个问题时想到了第二件事,为什么 spearman 给我的值与 pearson 完全相同?
  • 它没有(对我来说) - 请参阅输出的更新答案
【解决方案2】:

这应该可以解决问题!不过可能会更短:

import pandas as pd
import numpy as np
from scipy.stats import linregress


X = pd.DataFrame({"A":[34,12,78,84,26], "B":[54,87,35,25,82], "C":[56,78,0,14,13], "D":[0,23,72,56,14], "E":[78,12,31,0,34]})
Y = pd.DataFrame({"A":[45,24,65,65,65], "B":[45,87,65,52,12], "C":[98,52,32,32,12], "D":[0,23,1,365,53], "E":[24,12,65,3,65]})

row = 0
col = 0
m = np.zeros( (len(X), len(Y) ))
for key_x, val_x in X.iteritems():
    for key_y, val_y in Y.iteritems():
        if( col == 5 ):
            col = 0 
        m[row][col] = linregress(val_x, val_y).rvalue
        col += 1
    row += 1

print m

为了计算相关性,我使用的是 linregress,但还有其他替代方法,例如:

  • numpy.corrcoef
  • pandas.DataFrame.corr

可能还有其他一些人;)

【讨论】:

  • 您好,感谢您的回答。我正在专门寻找 Spearman 的等级相关性,因为我使用的数据不满足正态性假设
猜你喜欢
  • 2020-05-18
  • 2020-01-04
  • 1970-01-01
  • 1970-01-01
  • 2022-08-19
  • 2018-01-01
  • 2017-12-21
  • 2019-06-26
  • 2020-08-02
相关资源
最近更新 更多