【问题标题】:Variations in regression line slope for log-log ggplotlog-log ggplot的回归线斜率的变化
【发布时间】:2016-07-26 10:51:39
【问题描述】:

我是 R 新手。我正在尝试使用 geom_smooth(method=lm) 在 ggplot 中拟合回归线。

我碰巧注意到,对于同一个数据集,当轴从线性线性变为线性对数和对数对数时,回归线的斜率会发生变化,以至于 y 截距不同而且相关性似乎也不真实。

数据的相关系数 (r) 为 -0.125

conc <- c(1.5188717, 1.8794363, 2.5455899, 1.5810686, 0.4938004, 2.9526288)
absp <- c(6.975519, 2.279606, 2.265391, 1.611868, 1.379097, 1.324827)
mydata <- data.frame(conc, absp)

corr_eqn <- function(x, y) {
corr_coef <- round(cor(x, y), digits=3)
paste("italic(r) == ", corr_coef)
}
value <- data.frame(r=corr_eqn(conc, absp))

1。我首先将我的数据绘制成线性比例。这里的 y 截距似乎是 ~3.1

ggplot(mydata, aes(x=conc, y=absp)) +
 labs(x="Conc.", y="Absp.") + 
 scale_x_continuous() +
 scale_y_continuous(breaks=c(0,1,2,3,4,5,6,7)) +
 geom_point(size=4) +
 theme(text = element_text(size=18, face="bold"), legend.position="none")+
 geom_smooth(method=lm, se=FALSE) +
 geom_text(data=value, aes(x=2, y=6, label=r), 
        colour="red", size=5, parse=TRUE)

2。但是,当我将 y 轴更改为 log2 比例并且 x 轴保持线性时,y 截距似乎介于 2 和 3 之间。

ggplot(mydata, aes(x=conc, y=absp)) +
 labs(x="Conc.", y="Absp. (log2)") + 
 scale_x_continuous() +
 scale_y_continuous(trans=log2_trans(),breaks=c(0,1,2,3,4,5,6,7)) +
 annotation_logticks(sides="l") +
 geom_point(size=4) +
 theme(text = element_text(size=18, face="bold"), legend.position="none")+
 geom_smooth(method=lm, se=FALSE) +
 geom_text(data=value, aes(x=2, y=6, label=r), 
            colour="red", size=5, parse=TRUE)

3。最后,当我将 y 轴和 x 轴都更改为 log2 刻度时,y 截距下降到小于 2 并且斜率现在看起来是正的。

ggplot(mydata, aes(x=conc, y=absp)) +
 labs(x="Conc. (log2)", y="Absp. (log2)") + 
 scale_x_continuous(trans=log2_trans()) +
 scale_y_continuous(trans=log2_trans(),breaks=c(0,1,2,3,4,5,6,7)) +
 annotation_logticks(sides="lb") +
 geom_point(size=4) +
 theme(text = element_text(size=18, face="bold"), legend.position="none")+
 geom_smooth(method=lm, se=FALSE) +
 geom_text(data=value, aes(x=2, y=6, label=r), 
        colour="red", size=5, parse=TRUE)

我似乎不明白斜率或 y 截距如何仅通过将轴从线性改为对数刻度来改变?我在这里犯了一些明显的错误还是我错过了什么?我将不胜感激任何帮助/建议。

【问题讨论】:

    标签: r ggplot2


    【解决方案1】:

    stat_smooth 将模型拟合到转换后的数据:

    2^coef(lm(log2(absp) ~ conc, data = mydata))[1]
    #(Intercept) 
    #    2.405666 
    
    ggplot(mydata, aes(x=conc, y=absp)) +
      labs(x="Conc.", y="Absp. (log2)") + 
      scale_x_continuous(limits = c(0, 3)) +
      scale_y_continuous(trans=log2_trans(),breaks=c(0,1,2,2.4056,3,4,5,6,7)) +
      annotation_logticks(sides="l") +
      geom_point(size=4) +
      theme(text = element_text(size=18, face="bold"), legend.position="none")+
      stat_smooth(method=lm, se=FALSE, fullrange = TRUE) +
      geom_text(data=value, aes(x=2, y=6, label=r), 
                colour="red", size=5, parse=TRUE)
    

    可以说,这是一个错误,应该报告。

    编辑: Hadley says 这是设计使然。

    【讨论】:

    • 谢谢,但对数刻度的问题仍然存在。
    • 我不明白。那里发生的情况完全相同。 2^coef(lm(log2(absp) ~ log2(conc), data = mydata))[1] 给出 2.075,这就是您在 Conc = 1 时看到的值。
    【解决方案2】:

    感谢 @Roland 与 Hadley 一起跟进此事。

    我注意到您使用 stat_smooth 代替 geom_smooth 的建议。

    此外,我从here 了解到,在对数线性或对数对数图中观察到的回归线斜率变化的原因。在这种情况下,当使用scale_x_continuous(trans=log2_trans())scale_y_continuous(trans=log2_trans())时,回归分析是在尺度和数据转换之后进行的,但当使用coord_trans(x="log2", y="log2")时,首先对未转换的数据进行回归分析,然后绘制到转换后的坐标。

    我修改后的代码现在得到正确的 y 截距 (3.21) 值和 log2-log2 图的负斜率(根据负相关)。

    ggplot(mydata, aes(x=conc, y=absp)) +
     labs(x="Conc. (log2)", y="Absp. (log2)") + 
     coord_trans(x="log2", y="log2") +
     geom_point(size=4) +
     stat_smooth(method=lm, se=FALSE, fullrange = TRUE) +
     theme(text = element_text(size=18, face="bold"), legend.position="none") +
     geom_text(data=cor_val, aes(x=2, y=6, label=r), 
               colour="red", size=5, parse=TRUE)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-05
      • 2019-09-28
      相关资源
      最近更新 更多