创建 gam 模型的 r 数据框

Creating an r dataframe of gam models

如果我拟合三个不同的gam模型如下:

library(mgcv)
set.seed(0)
df <- data.frame(count = rpois(100,1),
                 pred1 = rnorm(100, 10, 1), 
                 pred2 = rnorm(100, 0, 1), 
                 pred3 = rnorm(100, 0, 1))

m1 <- gam(count ~ s(pred1),
             data = dat, 
             family = poisson(link="log"), 
             method = "REML", 
             select = TRUE)

m2 <- gam(count ~ s(pred2),
          data = dat, 
          family = poisson(link="log"), 
          method = "REML", 
          select = TRUE)

m3 <- gam(count ~ s(pred3),
          data = dat, 
          family = poisson(link="log"), 
          method = "REML", 
          select = TRUE)

然后尝试将它们放入单个数据框中:

models <- data.frame(m = c(m1,m2,m3))

我收到这个错误:

Error in as.data.frame.default(x[[i]], optional = TRUE, stringsAsFactors = stringsAsFactors) : 
  cannot coerce class ‘"family"’ to a data.frame

有什么解决办法吗?我想创建一个可以循环进行预测的结构。

由于 docs indicate, the return value of mgcv::gam is an object of gam class. This gamObject 继承自基础 R 的 class 对象(lmglm),因此包含许多无法轻易绑定到data frame:

Fitted Gam Object

A fitted GAM object returned by function gam and of class "gam" inheriting from classes "glm" and "lm". Method functions anova, logLik, influence, plot, predict, print, residuals and summary exist for this class.

通常要从这些模型对象中检索估计值,您会 运行 summary 到 return 命名元素列表,例如系数、残差等。从那里,提取所需的组件可以是向量、矩阵或列表到数据框中。注意:由于基础组件的长度和类型的性质不同,没有简单的方法可以将模型的 所有 估计值提取到数据框。

你必须问问自己:

  • 我想在数据框中对模型进行哪些具体估计?

  • 我是在一个数据框中保留所有三个模型估计值还是使用数据框列表?

  • 存储哪些指标数据(数据、公式等)以区别于其他?

    Whosebug R posts 包含许多示例,说明如何将模型估计值(如系数)提取到数据框中。

一种实现是定义一种提取模型估计值的方法,其中输入参数是一个公式,该公式似乎只是所有三个模型之间的差异。

run_gam_models <- function(my_formula) {
      fit <- gam(my_formula,
                 data = dat, 
                 family = poisson(link="log"), 
                 method = "REML", 
                 select = TRUE)

      results <- summary(fit)

      df <- data.frame(results$coefficients, ...)
      return(df)
}

# LIST OF DATA FRAMES
coeffs_df_list <- sapply(names(dat)[-1], function(col) {
       f <- as.formula(paste0("count ~ ", col))
       run_gam_models(f)
}, simplify = FALSE)

# INDIVIDUAL DATA FRAMES
coeffs_df_list$pred1
coeffs_df_list$pred2
coeffs_df_list$pred3

Online Demo(使用glm