【问题标题】:Tying geom_smooth to a specific model将 geom_smooth 绑定到特定模型
【发布时间】:2021-05-24 16:19:36
【问题描述】:

假设我有以下数据集

x = rnorm(1000)
a = sample(c("A", "B", "C"), size=length(x), replace=T)
X = model.matrix(~a*x)
y = as.vector( X %*% c(0, .3, .5, .3, -.3, .1) ) + rnorm(length(x), 0, .2)
data = data.frame(y,a,x)

现在假设我为仅主效应模型建模

mod = lm(y~a+x, data=data)

如果我想可视化这个模型的拟合,我可以使用 ggplot2:

ggplot(data=data, aes(x=x, y=y)) +
  geom_point() + 
  facet_grid(~a) +
  geom_smooth(method="lm")

问题是显示的线条与模型不匹配。 (图表线有交互作用,但模型没有)。

对此建模的适当方法需要几个步骤:首先,创建包含每个组的截距的新列:

data$intercepts = 0; 
  data$intercepts[data$a=="B"] = coef(mod)[2]
  data$intercepts[data$a=="C"] = coef(mod)[3]

然后像这样为每个模型绘制单独的线:

ggplot(data=data, aes(x=x, y=y)) +
  geom_point() + 
  facet_grid(~a) +
  geom_abline(aes(intercept = intercepts, slope = coef(mod)[4]))

这对于这个一次实例非常有用。但我正在尝试制作一个更通用的功能,并且可以适应任何类型的模型/视觉效果。

有没有办法将拟合模型提供给 ggplot 并让它发挥它的魔力?

过去,我使用 predict 函数“破解”ggplot 来制作我想要的模型(即,通过制作预测值网格,计算预测,然后使用 geom_line 来“连接点” .") 对于这个特定的应用程序,这是行不通的。相反,我需要通过面板指定斜率/截距,但需要该函数足够智能以识别何时存在交互/主效应/三向交互。

我的第一个想法是使用model.matrix 在拟合对象的每个面板中生成预测。 model.matrix 的优点是我不必弄清楚是否存在交互/主效应/多项式等....但我没有成功。

有什么想法吗?

【问题讨论】:

    标签: r ggplot2


    【解决方案1】:

    回答

    只需计算您想要的点(即拟合值),然后使用geom_line 绘制它们:

    data$pred <- predict(mod)
    ggplot(data = data, aes(x = x, y = y)) +
      geom_point() + 
      geom_line(aes(y = pred)) + 
      facet_grid(~a)
    

    基本原理

    我发现将数据添加到您输入的原始数据对象通常更容易。在这种情况下,只需使用predict(mod) 找到拟合值,就完成了。我们将它们存储为data$pred,然后我们调用geom_lineaes(y = pred) 来实际绘制它们。

    请注意,此解决方案适用于任何模型。这是一个示例,我修改了您的数据生成以包含二次项,创建了一个带有二次项的 lm 调用,并调用了完全相同的 ggplot 代码。

    【讨论】:

      【解决方案2】:

      @slamballais 的回答很好。稍微精简的版本:

      aa <- broom::augment(mod, interval="confidence")
      gg_pred <- (gg 
          + geom_line(data=aa, aes(y=.fitted), colour="blue")
          + geom_ribbon(data=aa, aes(ymin=.lower, ymax=.upper), colour=NA, alpha=0.3)
      )
      print(gg_pred)
      

      如果你想要,这会有点棘手,例如用于预测非线性拟合的均匀分布的点(而不是太多)。另见ggeffects 包(尤其是ggpredict)和sjPlot 包。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-11-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-29
        • 1970-01-01
        • 2015-07-04
        • 1970-01-01
        相关资源
        最近更新 更多