Python中处理平局的斯皮尔曼秩相关性

6 投票
1 回答
17539 浏览
提问于 2025-04-17 15:30

我想用Python计算斯皮尔曼等级相关系数,可能会用到scipy这个库里的实现(scipy.stats.spearmanr)。

我手头的数据大概是这样的(字典形式):

{a:0.3, b:0.2, c:0.2} and {a:0.5, b:0.6, c:0.4}

现在我想把这些数据传给斯皮尔曼模块,如果我没理解错的话,我需要给它们排个名次,应该是按从高到低的顺序排列:

[1,2,3] and [2,1,3]

接下来,我想考虑到并列的情况,那么对于第一个数据向量,我应该怎么做呢:

[1,2,2] or [1,2.5,2.5]

总的来说,这个概念是对的吗?我该如何处理这种基于字典的数据中的并列情况。

正如@Jaime所建议的,spearmanr函数是用数值来工作的,但为什么会有这样的行为呢:

In [5]: spearmanr([0,1,2,3],[1,3,2,0])
Out[5]: (-0.39999999999999997, 0.59999999999999998)

In [6]: spearmanr([10,7,6,5],[0.9,0.5,0.6,1.0])
Out[6]: (-0.39999999999999997, 0.59999999999999998)

谢谢!

1 个回答

11

scipy.stats.spearmanr 会帮你计算排名,你只需要把数据按正确的顺序提供给它就可以了:

>>> scipy.stats.spearmanr([0.3, 0.2, 0.2], [0.5, 0.6, 0.4])
(0.0, 1.0)

如果你已经有了排名的数据,可以直接用 scipy.stats.pearsonr 来得到相同的结果。下面的例子显示了你尝试的任意一种方法都可以工作,不过我觉得 [1, 2.5, 2.5] 更常见。此外,scipy 使用的是从零开始的索引,所以内部使用的排名更像是 [0, 1.5, 1.5]

>>> scipy.stats.pearsonr([1, 2, 2], [2, 1, 3])
(0.0, 1.0)
>>> scipy.stats.pearsonr([1, 2.5, 2.5], [2, 1, 3])
(0.0, 1.0)

撰写回答