log-log ggplot

时间:2016-07-26 10:51:39

标签: r ggplot2

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

我碰巧注意到,对于相同的数据集,当轴从线性线性变为线性日志并变为log-log时,回归线的斜率会发生变化,以至于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)

Image, Scatter plots

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

2 个答案:

答案 0 :(得分: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)

resulting plot

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

编辑:Hadley says这是设计上的。

答案 1 :(得分:0)

感谢@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-intercept(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)

enter image description here