【问题标题】:Using ggplot2 to plot an already-existing linear model使用 ggplot2 绘制已经存在的线性模型
【发布时间】:2017-07-01 21:20:41
【问题描述】:

假设我有一些数据,并且我创建了一个线性模型来拟合数据。然后我使用 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 函数?

【问题讨论】:

    标签: r ggplot2


    【解决方案1】:

    需要做的是创建一个新的数据框,其中包含旧数据框的观察结果加上模型的预测值,然后使用 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 &lt;- lm(dist ~ poly(speed, 2), data = cars)),那么情节和摘要都会改变。

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

    【讨论】:

      【解决方案2】:

      我相信你想做一些类似的事情:

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

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

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

      【讨论】:

      • 这也是broom 包中augment 的理想用例。
      • 谢谢!变异是关键。我使用了以下语法,它也有效:cars
      • 顺便说一句,我对此表示赞同,但没有接受它作为答案,因为(如您所述)它没有绘制置信度/预测带。我将在下面用这些回答我自己的问题。
      猜你喜欢
      • 2021-05-27
      • 1970-01-01
      • 1970-01-01
      • 2014-12-13
      • 1970-01-01
      • 1970-01-01
      • 2011-11-21
      • 2016-10-31
      • 1970-01-01
      相关资源
      最近更新 更多