如何在 Pearson 和 Spearman 相关之间进行选择?

机器算法验证 相关性 皮尔逊-r 斯皮尔曼罗
2022-02-12 12:57:21

我如何知道何时在 Spearman 的和 Pearson 的之间进行选择?我的变量包括满意度,并且使用分数的总和来解释分数。然而,这些分数也可以被排名。ρr

4个回答

如果您想探索您的数据,最好同时计算两者,因为 Spearman (S) 和 Pearson (P) 相关性之间的关系会提供一些信息。简而言之,S 是根据等级计算的,因此描述了单调关系,而 P 是基于真实值并描述线性关系。

例如,如果您设置:

x=(1:100);  
y=exp(x);                         % then,
corr(x,y,'type','Spearman');      % will equal 1, and 
corr(x,y,'type','Pearson');       % will be about equal to 0.25

这是因为单调增加,因此 Spearman 相关是完美的,但不是线性的,因此 Pearson 相关是不完美的。 yx

corr(x,log(y),'type','Pearson');  % will equal 1

两者都做很有趣,因为如果你有 S > P,这意味着你有一个单调但不是线性的相关性。由于在统计中具有线性是很好的(更容易),您可以尝试对应用转换(例如对数)。y

我希望这有助于使相关类型之间的差异更容易理解。

最短且最正确的答案是:

Pearson 对线性关系进行基准测试,Spearman 对单调关系进行基准测试(一般情况下很少无穷大,但需要进行一些功率权衡)。

因此,如果您假设/认为关系是线性的(或者,作为一种特殊情况,这些是同一事物的两个度量,所以关系是)并且情况并不太奇怪(有关详细信息,请查看其他答案),请选择 Pearson。否则使用斯皮尔曼。y=1x+0

这在统计中经常发生:有多种方法可以应用于您的情况,而您不知道该选择哪一种。您应该根据所考虑方法的优缺点以及问题的具体情况做出决定,但即便如此,该决定通常也是主观的,没有商定的“正确”答案。通常,尝试尽可能多的方法是一个好主意,只要你的耐心允许,看看哪些方法最终会给你最好的结果。

Pearson 相关和 Spearman 相关之间的区别在于,Pearson 最适合从区间尺度进行的测量,而 Spearman 更适合从序数尺度进行的测量。区间尺度的示例包括“华氏温度”和“以英寸为单位的长度”,其中各个单位(1 华氏度,1 英寸)是有意义的。诸如“满意度分数”之类的东西往往属于序数类型,因为虽然“5 个幸福”显然比“3 个幸福”更幸福,但尚不清楚您是否可以对“1 个幸福单位”做出有意义的解释。但是当你加起来许多序数类型的测量,这就是你的情况,你最终得到的测量实际上既不是序数也不是间隔,并且难以解释。

我建议您将满意度分数转换为分位数分数,然后使用这些分数的总和,因为这将为您提供更易于解释的数据。但即使在这种情况下,也不清楚 Pearson 还是 Spearman 是否更合适。

我今天遇到了一个有趣的角落案例。

如果我们查看非常少量的样本,Spearman 和 Pearson 之间的差异可能会非常大。

在以下情况下,这两种方法报告了完全相反的相关性。

在此处输入图像描述

一些快速的经验法则来决定 Spearman 与 Pearson:

  • Pearson 的假设是恒定的方差和线性(或相当接近的东西),如果不满足这些,可能值得尝试 Spearman 的。
  • 上面的示例是一个极端情况,仅当有少数 (<5) 个数据点时才会弹出。如果有 >100 个数据点,并且数据是线性的或接近线性的,那么 Pearson 将与 Spearman 非常相似。
  • 如果您认为线性回归是分析数据的合适方法,那么 Pearson 的输出将匹配线性回归斜率的符号和大小(如果变量是标准化的)。
  • 如果您的数据有一些线性回归无法拾取的非线性成分,那么首先尝试通过应用转换(可能是 log e)将数据理顺成线性形式。如果这不起作用,那么斯皮尔曼可能是合适的。
  • 我总是先尝试 Pearson 的,如果不行,我会尝试 Spearman 的。
  • 你能添加更多的经验法则或更正我刚刚推断的那些吗?我已将此问题设为社区 Wiki,因此您可以这样做。

ps 这是重现上图的 R 代码:

# Script that shows that in some corner cases, the reported correlation for spearman can be
# exactly opposite to that for pearson. In this case, spearman is +0.4 and pearson is -0.4.
y = c(+2.5,-0.5, -0.8, -1)
x = c(+0.2,-3,   -2.5,+0.6)

plot(y ~ x,xlim=c(-6,+6),ylim=c(-1,+2.5))
title("Correlation: corner case for Spearman vs. Pearson\nNote that they are exactly opposite each other (-0.4 vs. +0.4)")
abline(v=0)
abline(h=0)
lm1=lm(y ~ x)
abline(lm1,col="red")

spearman = cor(y,x,method="spearman")
pearson = cor(y,x,method="pearson")
legend("topleft",
    c("Red line: regression.",
    sprintf("Spearman: %.5f",spearman),
    sprintf("Pearson:   +%.5f",pearson)
))