使用ggplot2绘制已存在的线性模型

时间:2017-07-01 21:20:42

标签: r ggplot2

假设我有一些数据,我创建了一个线性模型来拟合数据。然后我使用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时重新创建线性模型。这对我来说似乎不优雅,它也为bug带来了空间。例如,如果我更改使用lm创建的模型但忘记更改使用geom_smooth创建的模型,则摘要和绘图将不属于同一模型。

是否有办法使用ggplot2绘制已存在的线性模型,例如将lm对象本身传递给geom_smooth函数?

2 个答案:

答案 0 :(得分:6)

需要做的是创建一个新数据框,其中包含来自旧模型的观测值加上模型中的预测值,然后使用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)),那么情节和摘要都会发生变化。

感谢Plamen Petrov让我意识到这里需要什么。正如他所指出的,只有在为相关模型定义predict时,此方法才有效;如果没有,就必须自己定义。

答案 1 :(得分:3)

我相信你想做的事情是:

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)  )

只要定义了相应的预测方法,这也适用于更复杂的模型。否则你需要自己定义它。

在线性模型的情况下,您可以添加更多工作的置信度/预测带,并重现您的情节。