假设我有一些数据,并且我创建了一个线性模型来拟合数据。然后我使用 ggplot2 绘制数据,我想将线性模型添加到绘图中。据我所知,这是执行此操作的标准方法(使用内置的cars
数据集(:
library(ggplot2)
fit <- lm(dist ~ speed, data = cars)
summary(fit)
p <- ggplot(cars, aes(speed, dist))
p <- p + geom_point()
p <- p + geom_smooth(method='lm')
p
但是,上述内容违反了 DRY 原则("不要重复自己"(:它涉及在调用lm
中创建线性模型,然后在调用geom_smooth
中重新创建它。这对我来说似乎不优雅,它还为错误引入了空间。例如,如果我更改了使用lm
创建的模型,但忘记更改了使用geom_smooth
创建的模型,则摘要和绘图将不属于同一模型。
有没有办法使用 ggplot2 绘制已经存在的线性模型,例如通过将lm
对象本身传递给 geom_smooth 函数?
需要做的是创建一个新的数据框,其中包含来自旧数据的观测值以及来自模型的预测值,然后使用 ggplot2 绘制该数据框。
library(ggplot2)
# create and summarise model
cars.model <- lm(dist ~ speed, data = cars)
summary(cars.model)
# add 'fit', 'lwr', and 'upr' columns to dataframe (generated by predict)
cars.predict <- cbind(cars, predict(cars.model, interval = 'confidence'))
# plot the points (actual observations), regression line, and confidence interval
p <- ggplot(cars.predict, aes(speed,dist))
p <- p + geom_point()
p <- p + geom_line(aes(speed, fit))
p <- p + geom_ribbon(aes(ymin=lwr,ymax=upr), alpha=0.3)
p
这样做的最大优点是,如果改变模型(例如cars.model <- lm(dist ~ poly(speed, 2), data = cars)
(那么情节和摘要都会改变。
感谢普拉门·彼得罗夫让我意识到这里需要什么。正如他所指出的,这种方法只有在为所讨论的模型定义predict
时才有效;如果没有,则必须自己定义它。
我相信你想做一些类似的事情:
library(ggplot2)
# install.packages('dplyr')
library(dplyr)
fit <- lm(dist ~ speed, data = cars)
cars %>%
mutate( my_model = predict(fit) ) %>%
ggplot() +
geom_point( aes(speed, dist) ) +
geom_line( aes(speed, my_model) )
只要定义了相应的预测方法,这也适用于更复杂的模型。否则,您将需要自己定义它。
对于线性模型,您可以添加置信/预测波段,但工作量稍多,并重现您的图。