【问题标题】:Combine GAM-smooths of multiple covariates in one plot in R将多个协变量的 GAM 平滑组合在 R 中的一个图中
【发布时间】:2020-07-27 06:52:43
【问题描述】:

我在 R 中有一个数据框列表。列表中的每个元素都是具有相同协变量的数据框。但是,每个数据帧的协变量值都不同,因为我为每个数据帧应用了具有不同组合的平滑算法。

然后我为每个数据框安装了一个游戏。我现在想做的是为每个协变量绘制一个图,并为每个数据帧绘制平滑线

更新

只是为了分享一些代码并使其更清晰: 现在我想做一些像平面图这样的事情。其中每个图都包含不同游戏的协变量(x1 和 x2)的平滑。我希望这是有道理的......

library(mgcv)

# make list of dataframes for storing data
data = vector("list", length = 3)

#  fill the list
for(i in seq_along(data)){
  data[[i]] = gamSim(n = 200, dist = "normal", scale = 2)
}

# fit the gams
gam_models = vector("list", length(data))
for(i in seq_along(data)){
  res = gam(y ~ s(x0) + s(x1) + s(x2), data = data[[i]])
  gam_models[[i]] = res
  par(mfrow = c(1,2))
  plot(res, all.terms=TRUE, main="Name of Covariate")
}

【问题讨论】:

  • 您能分享可重现的代码和数据吗?我不完全清楚你想要做什么。 geom_smooth 允许您使用 method = "gam" 显示基于 GAM 的拟合。这取决于美学,即如果您有colourgroup 美学geom_smooth 将为每个子集绘制平滑曲线。
  • 当然可以!抱歉,我会稍微更新一下这个令人困惑的问题......
  • 如果您提供一些数据/代码,生成与您正在使用的模型类似的列表,您将获得更高的答案。
  • 嗨@Lenn,感谢您的更新,这好多了。看到您的代码示例,我现在想知道到底是什么问题。您已经在为每个模型的每个协变量绘制平滑曲线(包括 CI)。
  • @Lenn 好的,我现在明白了。恐怕您要问的是自己从gam fit 对象中提取平滑数据。您可以查看plot.gam 的源代码,了解mgcv 是如何完成的。 mgcViz 中的例程做类似的事情。我没有时间研究这个,但这应该是相当简单的。基本上,我会定义一个函数get_smooth_data(fit, covariate),它基于fitcovariate 返回平滑效果的data.frame;然后,我将为每个模型对这些 data.frames 进行行绑定,然后您就可以进行绘图了。

标签: r plot gam mgcv


【解决方案1】:

我不完全清楚你在问什么。您在最近的编辑中提供的示例代码似乎完全符合您的要求。

您提到了方面,所以也许您正在寻求ggplot 解决方案?如果是这样,这里有一个使用mgcViz 包提供的一些绘图方法的选项。

library(mgcViz)
library(grid)
library(tidyverse)
lst <- imap(
    setNames(gam_models, paste("Model", seq_along(gam_models), "covariates")),
    function(fit, nm) {
        terms <- fit %>% pluck("terms") %>% attr("term.labels")
        map(
            c(nm, rep("", length(terms) - 1)),
            ~textGrob(.x, hjust = 1)) %>%
        append(map(
            seq_along(terms), ~
            plot(sm(fit %>% getViz(), .x)) +
            l_fitLine(colour = "black") +
            l_ciLine(colour = "black", linetype = 2) +
            l_rug(mapping = aes(x = x, y = y), alpha = 0.8)))
    }) %>%
    unlist(recursive = FALSE)

gridPrint(grobs = lst, ncol = 3, heights = rep(c(1, 3), length(gam_models)))

解释:这个想法是构建一个listggplot 对象,其中行对应于不同的GAM,列对应于协变量。请注意,这假设所有 GAM 具有相同数量的协变量。要调整更多模型和协变量,您需要更改gridPrintncolheights 的硬编码参数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-30
    相关资源
    最近更新 更多