我有一个问题,第二个网格的趋势线看起来是负的而spearman相关是弱正(0.1)。如果有人能够澄清方向的差异是由于错误的公式还是弱相关性,我将不胜感激。
我也意识到类似的问题发生在rho = -0.3,其中趋势线为正。
感谢。
sc_df
OTU_166911 Body weight EXPT Group
68 41.132985 36.5 ABX2 S T2 HFHS+amp
69 15.589949 34.8 ABX2 S T2 HFHS+amp
70 15.504802 30.5 ABX2 S T2 HFHS+amp
71 5.339616 35.8 ABX2 S T2 HFHS+amp
72 40.697005 33.9 ABX2 S T2 HFHS+amp
188 2.893428 33.4 ABX3 S T2 HFHS+amp
189 20.891697 37.6 ABX3 S T2 HFHS+amp
190 3.195469 40.5 ABX3 S T2 HFHS+amp
191 2.689137 34.2 ABX3 S T2 HFHS+amp
192 13.997269 30.0 ABX3 S T2 HFHS+amp
df4
Group EXPT value
1 S T2 HFHS+amp ABX2 0.30
2 S T2 HFHS+amp ABX3 0.10
ggplot(sc_df, aes(x = sc_df[,partner1], y = sc_df[,partner2])) +
geom_point(shape=1, color="blue", size = 3) +
geom_smooth(method="lm", se=FALSE) +
facet_wrap(~EXPT, scales = "free") +
geom_text(data=df4, aes(x=Inf, y=Inf,hjust=2,vjust=2, label=paste("rho==",value,sep="")), parse=T, family = "Arial", size=4) +
xlab(partner1) +
ylab(partner2) +
theme(plot.title = element_text(hjust = 0.5),text=element_text(family="Arial", size=10)) +
ggtitle(g)
答案 0 :(得分:3)
差异是由于使用了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))
你可以看到一些点几乎没有移动,而有些移动很多。这些差异足以改变相关系数的幅度,有时甚至是符号。