我是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)
我似乎不明白斜率或y截距是如何通过将轴从线性变为对数刻度而改变的?我在这里犯了一些明显的错误,或者我错过了什么?我将不胜感激任何帮助/建议。
答案 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)
可以说,这是一个错误,应该报告。
编辑: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)