相关分析:Pearson 还是 Spearman
跟完这篇,面对「这两个变量有没有关系」,您能自己判断该用 Pearson 还是 Spearman,用 R 跑出相关系数并读懂它,知道相关到哪一步就不能再往「因果」上说,还会读一张相关热图。
「相关」是最常被用、也最常被误用的分析之一。选错系数、或把「相关」当成「因果」,都会让结论站不住。这篇给您一套「先看图、再选系数、最后守住边界」的顺序,而不是上来就 cor()。
两种系数在测什么
Pearson 和 Spearman 都给出一个 -1 到 1 之间的数:正号表示同向变(一个大另一个也大),负号表示反向变,绝对值越接近 1 越强,接近 0 表示没有这种关系。但它们测的「关系」并不一样。
- Pearson 相关(r):测两个变量之间的线性关系,直接用原始数值计算。
- Spearman 秩相关(ρ):先把每个变量各自转成秩次(第几名),再对秩次算相关。它测的是单调关系——只要「一个涨另一个也大体跟着涨」就行,不要求是直线。
放在一张表里对比:
| 维度 | Pearson(r) | Spearman(ρ) |
|---|---|---|
| 测的关系 | 线性 | 单调(含弯曲但同向的关系) |
| 适用数据 | 连续 | 连续,或有序等级(如分期 I/II/III) |
| 对离群值 | 敏感,一个极端点就能带偏 | 稳健,转秩后极端值影响被压平 |
| 分布前提 | 做显著性检验/置信区间时,近似要求双变量正态 | 不要求正态 |
| 怎么算 | 用原始值 | 先转秩,再算 |
一句话记忆:关系是直线、数据干净且大致正态,用 Pearson;关系弯一点、有离群、偏态或是等级数据,用 Spearman。
先画散点图
选系数之前,务必先画散点图。一个数字(相关系数)会把很多信息抹平,图能一眼看出该用哪个、甚至该不该用。
plot(df$x, df$y) # 最快的一眼
# 或用 ggplot2 加一条趋势线看形状
library(ggplot2)
ggplot(df, aes(x, y)) +
geom_point() +
geom_smooth(method = "loess") # loess 平滑,看关系是直是弯
看图时重点关注三件事,它们正好对应选系数的判断:
- 形状是直还是弯:大致沿直线 → Pearson 合适;明显弯曲但一路同向(单调) → Spearman 更合适。
- 有没有离群点:有几个远离主群的点时,Pearson 容易被它们带偏,Spearman 更稳。
- 是不是根本没有单调关系:这一点最容易被忽略——如果关系是「先升后降」的 U 形,两种系数都可能算出接近 0,但这不代表没关系,只代表「没有单调关系」。这时相关系数本身就不是合适的工具。
经典的 Anscombe's quartet 就是提醒:四组数据的 Pearson r 几乎一样,散点图却完全不同(有的是直线,有的被一个离群点撑起来,有的是曲线)。永远别用一个相关系数替代看图。
三步判断该用哪个
把上面的观察收敛成一条可照走的流程:
- 先看数据类型:只要有一列是有序等级(而非连续量),直接用 Spearman。
- 再看散点图形状:近似直线走 Pearson,单调但弯走 Spearman。
- 最后看离群与分布:有明显离群点、或分布明显偏态、样本又不大时,倾向 Spearman;关系是直线、数据干净、样本量够,用 Pearson。
拿不准时,一个常见做法是两个都算、对照着看:若两者接近,说明结论稳;若差很多,多半是离群点或非线性在作怪,回头看图找原因。
还有第三个选项值得知道:Kendall's τ 也是基于秩的相关,和 Spearman 用途相近,在样本量小、或并列值(tie)很多时被认为更稳一些。R 里 method = "kendall" 即可。
在 R 里跑一遍
用 cor.test(),它同时给出相关系数和显著性检验(比只给系数的 cor() 信息更全):
# Pearson:线性、近似正态、无强离群
cor.test(df$x, df$y, method = "pearson")
# Spearman:单调、非正态、有离群或等级数据
cor.test(df$x, df$y, method = "spearman")
# Kendall:小样本或并列值多时
cor.test(df$x, df$y, method = "kendall")
输出里挑这几项读:
| 输出项 | 含义 | 怎么看 |
|---|---|---|
cor / rho / tau | 相关系数(估计值) | 符号看方向,绝对值看强弱 |
p-value | 显著性 | p < 0.05 常作为「关系不为 0」的判定门槛 |
95 percent confidence interval | 系数的置信区间 | 区间是否跨过 0、有多宽 |
几点要提醒:
p小 ≠ 关系强。样本量很大时,即使 r 只有 0.1(几乎没有实际意义)也可能p < 0.05。要同时看系数大小,别只看 p。(p < 0.05是常用惯例、非铁律,请按研究场景和多重比较情况调整,见 多重检验校正。)- 置信区间只有 Pearson 默认给。
cor.test()对 Spearman/Kendall 默认不输出置信区间,只给系数、检验统计量和 p 值。 - Spearman 遇到并列值会报 warning(
cannot compute exact p-value with ties)——这是提示它改用近似算法,通常不影响结论,知道即可。
至于「系数多大算强」,不同领域习惯不同。下面是一个粗略参考,请把它当经验尺度、而非硬门槛,务必结合专业背景判断:
| |系数| | 粗略解读 |
|---|---|
| < 0.3 | 弱 |
| 0.3 – 0.5 | 中等 |
| > 0.5 | 较强 |
相关不等于因果
这是整篇最重要、也最容易越界的一节。相关只说「两者一起变」,不说「谁导致谁」。 看到一个显著的相关,至少有四种可能,因果只是其中之一:
- X 导致 Y,或反过来 Y 导致 X——相关本身分不清方向。
- 有第三个混杂因素 Z 同时影响 X 和 Y,让它们看起来相关(如「冰淇淋销量」和「溺水人数」相关,背后是「气温」)。
- 纯属巧合:变量足够多时,总能碰上一些毫无道理却数字上相关的对子。
- 由离群点或子群拉出来的假象:几个极端点、或数据里混着两个人群,都可能造出(或掩盖)相关。
后一种里有个经典陷阱——Simpson's paradox(辛普森悖论):在合并数据里看到的相关方向,在每个子群内部可能完全相反。所以分析前想清楚数据里有没有该分开看的分组。
要想从相关走到因果,靠的不是更漂亮的系数,而是研究设计:随机对照实验、控制混杂因素的回归、或有明确时间先后与机制支持的证据。报告时如实写「X 与 Y 显著相关」,而不要悄悄升级成「X 引起 Y」——这条边界守住了,结论才可信。
相关热图怎么读
变量一多,就不是两两看,而是把所有变量两两之间的相关系数排成一个矩阵,再用颜色画成热图,一眼看清谁和谁一起变。
# 一次算出所有列两两的相关矩阵
M <- cor(df, method = "spearman", use = "pairwise.complete.obs")
# use = "pairwise.complete.obs":对每一对变量各自用其非缺失样本
# 画图:corrplot 或 pheatmap 都常用
library(pheatmap)
pheatmap(M) # 带聚类的相关热图
读这张图记住几条:
- 颜色 = 方向和强度:一种色系(如红)表示正相关、另一种(如蓝)表示负相关,颜色越深越强;接近 0 的格子颜色最淡。看图前先在图例上确认哪种色是正、哪种是负。
- 对角线永远是 1:变量和自己完全相关,所以对角线是最深的一条,别去解读它。
- 矩阵是对称的:左下和右上是镜像,看一半即可。
- 成块的深色区:如果做了聚类,颜色相近的变量会被排到一起,形成沿对角线的「色块」——这些块就是彼此高度相关的一组变量,往往提示它们测的是同一类信息。
热图看的是「谁和谁相关」的整体图景,具体某一对到底有多强、显不显著,还是回到 cor.test() 逐对确认。相关热图的配色、注释条、聚类等更多讲究,和普通表达热图相通,见 热图聚类:注释条与配色全解。
在平台上跑一遍
上面这套判断不必手动敲代码。在百沐一下的【智能统计】里,上传一张整洁数据表,用一句话说清目的,例如「分析基因 A 表达量和患者年龄的相关性」或「画出这些指标的相关热图」,它会替您先看数据形状、在 Pearson 和 Spearman 之间选好系数、跑出系数与 p 值、画好散点图或相关热图,并附上可复现的 R 代码供核对;选哪个系数、要不要分组,它也会先跟您确认。
去试试:app.baimuyixia.com,或先看 智能统计使用指南。