如何解决R:绘制lm预测值的geom_line和几何平滑不一致
我有以下数据
df <- data.frame(x= c(0,1,10,100,1000,1000),y=c(7,15,135,1132,6459,-3,11,127,1120,6249,-5,13,126,1208,6208))
使用数据建立线性模型后,我使用该模型从已知的x值预测y值。将预测的y值存储在数据帧“ pred.fits”中
fit <- lm(data = df,y ~ x)
pred.fits <- expand.grid(x=seq(1,2000,length=2001))
pm <- predict(fit,newdata=pred.fits,interval="confidence")
pred.fits$py <- pm[,1]
我绘制数据并同时使用geom_smooth()和geom_line(),它们似乎很重合。
ggplot(df,aes(x=x,y=y)) +
geom_point() +
geom_smooth(method = lm,formula = y ~ x,se = FALSE,size=1.5) +
geom_line(data=pred.fits,y=py),size=.2)
但是,当我绘制相同的数据时,将轴设置为对数比例时,两个回归会大大不同。
ggplot(df,size=.2) +
scale_x_log10() +
scale_y_log10()
我在这里想念东西吗?
更新
@Duck为我指出正确的方向后,我能够正确地进行操作。问题是,我希望数据不进行转换,但是将轴转换为log10比例。这就是我做到的方式。
df2 <- df[df$x>=1,] # remove annoying warning msgs.
fit2 <- lm(data = df2,log10(y) ~ log10(x))
pred.fits2 <- expand.grid(x=seq(10^0,10^3,length=200))
pm2 <- predict(fit2,newdata=pred.fits2,interval="confidence")
pred.fits2$py <- 10^pm2[,1] # convert the predicted y values to linear scale
ggplot(df2,y=y)) +
geom_point() +
geom_smooth(method = lm,size=1.5) +
geom_line(data=pred.fits2,size=1.5,linetype = "longdash") +
scale_x_log10() +
scale_y_log10()
感谢大家的帮助。
解决方法
此代码对您的理解很有用(感谢@BWilliams的宝贵意见)。您需要x和y为对数刻度,因此,如果将线性模型与不同的刻度混合使用,可能会使所有内容混乱。如果要查看相似的比例,最好使用对数变量训练另一个模型,然后再使用适当的值对其进行绘制。这是我们建立对数-对数模型然后进行绘图的方法(数据值作为1或负值已隔离在新的数据帧df2
中)。这里的代码:
第一个线性模型:
library(ggplot2)
#Data
df <- data.frame(x= c(0,1,10,100,1000,1000),y=c(7,15,135,1132,6459,-3,11,127,1120,6249,-5,13,126,1208,6208))
#Model 1 all obs
fit <- lm(data = df,y ~ x)
pred.fits <- expand.grid(x=seq(1,2000,length=2001))
pm <- predict(fit,newdata=pred.fits,interval="confidence")
pred.fits$py <- pm[,1]
#Plot 1
ggplot(df,aes(x=x,y=y)) +
geom_point() +
geom_smooth(method = lm,formula = y ~ x,se = FALSE,size=1.5) +
geom_line(data=pred.fits,y=py),size=.2)
输出:
现在绘制对数变量的草图,注意我们如何在主要变量中使用log()
以及模型的构建方式:
#First remove issue values
df2 <- df[df$x>1,]
#Train a new model
pred.fits2 <- expand.grid(x=seq(1,length=2001))
fit2 <- lm(data = df2,log(y) ~ log(x))
pm2 <- predict(fit2,newdata=pred.fits2,interval="confidence")
pred.fits2$py <- pm2[,1]
#Plot 2
ggplot(df2,aes(x=log(x),y=log(y))) +
geom_point() +
geom_smooth(method = lm,size=1.5) +
geom_line(data=pred.fits2,size=.2)
输出:
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。