【问题标题】:The spearman rho and trendline do not matchspearman rho 和趋势线不匹配
【发布时间】:2017-09-06 23:38:26
【问题描述】:

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

【问题讨论】:

    标签: r ggplot2


    【解决方案1】:

    差异是由于使用了 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))
    

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

    【讨论】:

    • 我明白了,谢谢你的详细解释。我想知道什么是估计趋势线的好方法,同时确保它与 spearman rho 一致。
    • @richardrodrigues,趋势线始终一致的唯一方法是将其拟合到排名数据,而不是原始比例数据。你为什么要使用 rho 呢?如果数据不是来自二元正态分布,仍然可以经常使用 Pearson。
    猜你喜欢
    • 1970-01-01
    • 2021-12-10
    • 1970-01-01
    • 2018-03-27
    • 2016-09-10
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    • 2020-02-05
    相关资源
    最近更新 更多