ggplot2 geom_smooth,方法的扩展模型= lm

时间:2018-03-09 10:25:14

标签: r ggplot2

我想使用geom_smooth从某个线性回归模型中获取拟合线。

在我看来,公式只能采用xy而不是任何其他参数。

更清楚地展示我想要的东西:

library(dplyr)
library(ggplot2)
set.seed(35413)
df <- data.frame(pred = runif(100,10,100),
           factor = sample(c("A","B"), 100, replace = TRUE)) %>%
  mutate(
    outcome = 100 + 10*pred + 
    ifelse(factor=="B", 200, 0) + 
    ifelse(factor=="B", 4, 0)*pred +
    rnorm(100,0,60))

使用

ggplot(df, aes(x=pred, y=outcome, color=factor)) +
  geom_point(aes(color=factor)) +
  geom_smooth(method = "lm") +
  theme_bw()

我生成的拟合线由于color=factor选项,基本上是线性模型的输出lm(outcome ~ pred*factor, df)

enter image description here

但是,在某些情况下,我更喜欢将线条作为不同模型拟合的输出,例如lm(outcome ~ pred + factor, df),我可以使用以下内容:

fit <- lm(outcome ~ pred+factor, df)
predval <- expand.grid(
  pred = seq(
    min(df$pred), max(df$pred), length.out = 1000),
  factor = unique(df$factor)) %>%
  mutate(outcome = predict(fit, newdata = .))

ggplot(df, aes(x=pred, y=outcome, color=factor)) +
  geom_point() +
  geom_line(data = predval) +
  theme_bw()

导致:

enter image description here

我的问题:是否有办法利用geom_smooth生成后一个图表?我知道formula =中有一个geom_smooth - 选项,但我无法制作类似formula = y ~ x + factorformula = y ~ x + color(我定义为color = factor)的工作

1 个答案:

答案 0 :(得分:6)

这是一个非常有趣的问题。可能是geom_smooth如此抗拒的主要原因&#34;允许多变量的自定义模型是它仅限于生成二维曲线;因此,它的参数设计用于处理二维数据(即公式=响应变量〜自变量)。

获取所请求内容的诀窍是使用mapping中的geom_smooth参数,而不是formula。正如您在查看documentation时可能看到的那样,formula仅允许您指定模型的数学结构(例如线性,二次等)。相反,mapping参数允许您直接指定新的y值 - 例如您可以使用predict()调用的自定义线性模型的输出。

请注意,默认情况下,inherit.aes设置为TRUE,因此您的绘制回归将根据您的分类变量进行适当的着色。这是代码:

# original plot
plot1 <- ggplot(df, aes(x=pred, y=outcome, color=factor)) +
  geom_point(aes(color=factor)) +
  geom_smooth(method = "lm") +
  ggtitle("outcome ~ pred") +
  theme_bw()

# declare new model here
plm <- lm(formula = outcome ~ pred + factor, data=df)

# plot with lm for outcome ~ pred + factor
plot2 <-ggplot(df, aes(x=pred, y=outcome, color=factor)) +
  geom_point(aes(color=factor)) +
  geom_smooth(method = "lm", mapping=aes(y=predict(plm,df))) +
  ggtitle("outcome ~ pred + factor") +
  theme_bw()

enter image description here enter image description here