spearman rho和trendline不匹配

时间:2017-09-05 22:33:04

标签: r ggplot2

我有一个问题,第二个网格的趋势线看起来是负的而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)

Scatter plot

1 个答案:

答案 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)

enter image description here

注意右侧面板中最左边的两个点。即使他们非常接近,他们的排名在每个方向上只相差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))

enter image description here

你可以看到一些点几乎没有移动,而有些移动很多。这些差异足以改变相关系数的幅度,有时甚至是符号。