差异是由于使用了 Spearman 的 rho,而趋势线基于线性模型,即 Pearson 的 r。
考虑来自?cor的相关文本:
对于cor(),如果方法是“kendall”或“spearman”,Kendall 的 tau 或
Spearman 的 rho 统计量用于估计基于等级的度量
协会。这些更强大,如果
数据不一定来自二元正态分布。 ...请注意,“spearman”基本上计算cor(R(x), R(y)) ...其中R(u) := rank(u, na.last = "keep")。
为简单起见,我重命名了您的变量:
dput(temp)
structure(list(x = c(41.132985, 15.589949, 15.504802, 5.339616,
40.697005, 2.893428, 20.891697, 3.195469, 2.689137, 13.997269
), y = c(36.5, 34.8, 30.5, 35.8, 33.9, 33.4, 37.6, 40.5, 34.2,
30), z = structure(c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L), .Label = c("ABX2",
"ABX3"), class = "factor")), class = "data.frame", row.names = c(NA,
-10L), .Names = c("x", "y", "z"))
首先,我们将证明 Spearman 的 rho 的定义是正确的,并且它不同于 Pearson 的 r。
library(dplyr)
temp %>%
group_by(z) %>%
mutate(RX = rank(x), RY = rank(y)) %>%
summarise(rho1 = cor(x, y, method = "spearman"),
rho2 = cor(RX, RY, method = "pearson"),
r = cor(x, y, method = "pearson"))
z rho1 rho2 r
<fctr> <dbl> <dbl> <dbl>
1 ABX2 0.3 0.3 0.20366115
2 ABX3 0.1 0.1 -0.08183435
请注意,rho 的两个值相同,但它们的符号和大小与 r 不同。
原因包括是的,相关性较差,而且排名会删除有关每个观察值相距多远的任何信息。即使两个观测值非常接近,它们仍然会相差 1 个等级。同样,两个观察值可能有很大不同,但如果它们之间没有,它们之间的排名只会相差 1。
看看:
temp %>%
group_by(z) %>%
mutate(RX = rank(x), RY = rank(y)) %>%
ggplot(aes(x, y)) +
geom_point() +
geom_text(aes(label = paste0("RX=", RX, "\nRY=", RY))) +
facet_grid(~z)
注意右侧面板中最左侧的两个点。尽管它们非常接近,但它们的排名在每个方向上仅相差 1 个单位。就 rho 而言,它们在 y 方向上共享的信息与前两点一样多,但它们之间的距离要远得多。
为了说明这可以改变多少值,让我们将排名重新调整为原始值的比例。 rank 的原始计算结果为 1 到 5,让我们将它们均匀分布,例如 X 方向的第一组的 5.3 到 41.1。
library(scales)
temp %>%
group_by(z) %>%
mutate(RX = rank(x), RY = rank(y),
scaledRX = scales::rescale(RX, to = range(x)),
scaledRY = scales::rescale(RY, to = range(y)))
x y z RX RY scaledRX scaledRY
<dbl> <dbl> <fctr> <dbl> <dbl> <dbl> <dbl>
1 41.132985 36.5 ABX2 5 5 41.132985 36.500
2 15.589949 34.8 ABX2 3 3 23.236300 33.500
3 15.504802 30.5 ABX2 2 1 14.287958 30.500
4 5.339616 35.8 ABX2 1 4 5.339616 35.000
5 40.697005 33.9 ABX2 4 2 32.184643 32.000
6 2.893428 33.4 ABX3 2 2 7.239777 32.625
7 20.891697 37.6 ABX3 5 4 20.891697 37.875
8 3.195469 40.5 ABX3 3 5 11.790417 40.500
9 2.689137 34.2 ABX3 1 3 2.689137 35.250
10 13.997269 30.0 ABX3 4 1 16.341057 30.000
在视觉上,这看起来像:
temp %>%
group_by(z) %>%
mutate(RX = rank(x), RY = rank(y),
scaledRX = scales::rescale(RX, to = range(x)),
scaledRY = scales::rescale(RY, to = range(y))) %>%
ggplot(aes(x, y)) +
geom_point(aes(shape = "original")) +
geom_point(aes(scaledRX, scaledRY, shape = "ranked")) +
geom_segment(aes(xend = scaledRX, yend = scaledRY)) +
geom_smooth(method = "lm", se = F, aes(color = "original")) +
geom_smooth(method = "lm", se = F, aes(scaledRX, scaledRY, color = "ranked")) +
facet_grid(~z) +
scale_shape_manual(values = c(1,16))
您可以看到有些点几乎没有移动,而有些点移动很多。这些差异足以改变相关系数的大小,有时甚至是符号。