【问题标题】:ggplot2 geom_ribbon from mgcv::gammggplot2 geom_ribbon 来自 mgcv::gamm
【发布时间】:2018-02-21 13:43:08
【问题描述】:

我正在尝试根据 gamm 模型的预测添加功能区,这似乎比预期的要难一些,因为 gamm 与 gam 有所不同。

我第一次尝试直接使用 geom_stat,但这不起作用(并且不会使用我的整个模型,其中还包括其他几个协变量)

library(tidyverse); library(mgcv)

dt = cbind(V1=scale(sample(1000)), 
    Age=rnorm(n = 1000, mean = 40, sd = 10), 
    ID=rep(seq(1:500),each=2) %>% as.data.frame()

# Works fine ----
dt %>% ggplot(aes(x=Age, y=V1)) + 
   stat_smooth(method="gam", formula= y~s(x,bs="cr")) 

# Fails horribly :P 
dt %>% ggplot(aes(x=Age, y=V1)) + 
    stat_smooth(method="gamm", formula= y~s(x,bs="cr"))

Maximum number of PQL iterations:  20   
iteration 1  
Warning message:  
Computation failed in `stat_smooth()`:  
no applicable method for 'predict' applied to an object of class "c('gamm', 'list')"   

我已经尝试在 model$gamm 上使用 predict 函数,但我不确定如何使用它,以及如何制作 CI 功能区

dt.model = gamm(V1 ~ s(Age, bs="cr") + s(ID, bs = 're'), data=dt, family="gaussian", discrete=T)

dt$pred = predict(dt.model$gam)

dt %>% ggplot(aes(x = Age, y = V1)) +
   geom_line(aes(group=ID), alpha=.3) +
   geom_point(alpha=.2) +
   geom_smooth(aes(y=pred))

我认识到这是一个糟糕的示例数据,因为这是一个愚蠢的形状。 但我希望能够沿着 model.fit 预测的线添加带有 CI 的功能区。而且我更喜欢在 ggplot 中执行此操作,特别是因为我想要在后台绘制意大利面条图。

【问题讨论】:

  • @MarcoSandri 对此感到抱歉,复制了一个旧的测试示例。我现在已经添加了。在这个例子中,这完全是任意的。我在数据模拟方面很糟糕:/

标签: r ggplot2 prediction


【解决方案1】:

predict 中使用se.fit=TRUE

library(tidyverse)
library(mgcv)

dt <- cbind(V1=scale(sample(1000)), 
    Age=rnorm(n = 1000, mean = 40, sd = 10), 
    ID=rep(seq(1:500),each=2)) %>% as.data.frame()

dt.model <- gamm(V1 ~ s(Age, bs="cr") + s(ID, bs = "re"), 
           data=dt, family="gaussian", discrete=T)

pred <- predict(dt.model$gam, se.fit=T)

dt %>% ggplot(aes(x = Age, y = V1)) +
   geom_line(aes(group=ID), alpha=.3) +
   geom_point(alpha=.2) +
   geom_ribbon(aes(ymin=pred$fit-1.96*pred$se.fit,
                   ymax=pred$fit+1.96*pred$se.fit), alpha=0.2, fill="red")+
   geom_line(aes(y=pred$fit), col="blue", lwd=1)

【讨论】:

  • 非常感谢!这么小的东西,大不同!
  • 你有什么方法可以从其中一个预测变量中得到预测吗?假设我想分别绘制每条预测曲线,还是只绘制其中一条? plot(dt.model$gam, shade = TRUE, shade.col = "red1") 将提示您旋转所有不同的预测变量,在本例中为两个。其中我只对第一个感兴趣: plot(dt.model$gam, select=1, shade = TRUE, shade.col = "red1") 任何获得预测的方法都只是用第一个(或 Xth )预测器进行预测?在实际模型上运行上述内容并不漂亮
  • @AthanasiaMowinckel 如果我正确理解了您的问题,您需要部分依赖图。看看pdp R 包:cran.r-project.org/web/packages/pdp/pdp.pdf 特别注意partial 函数。
  • 是的,这看起来像是我想要的,但是你让这些例子工作了吗?我一直在尝试运行它们并获取 > partial(boston.rf, pred.var = c("lstat", "rm"), grid.resolution = 40, plot = TRUE, chull = TRUE, progress = "text ") 错误:is.function(...f) 不是 TRUE
  • @Parseltongue 我最终放弃了这种方法,而是开始使用 predictbroom::augment 和新的数据参数,您可以在其中提供一个包含所有不感兴趣的预测变量的 data.frame作为常数添加到您的绘图中,然后它将预测您在数据中留下的剩余变量。
猜你喜欢
  • 2016-12-08
  • 1970-01-01
  • 1970-01-01
  • 2017-12-14
  • 1970-01-01
  • 2016-09-13
  • 2019-01-17
  • 1970-01-01
  • 2020-05-01
相关资源
最近更新 更多