You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

如何用apply循环运行多响应变量GAM模型并汇总结果

迭代运行GAM模型并汇总结果

步骤1:提取响应变量列名

先从数据框里筛选出所有响应变量的列名,比如示例数据中以response.开头的列:

# 用基础R提取响应变量列名
resp_vars <- grep("^response\\.", names(ex.dat), value = TRUE)

# 如果你用dplyr,也可以这么写:
# resp_vars <- ex.dat %>% dplyr::select(starts_with("response.")) %>% names()

步骤2:定义模型拟合与结果提取函数

写一个函数,输入响应变量名就能拟合指定GAM模型,并从summary()里提取你需要的关键统计量(比如R²、解释偏差、平滑项的p值等):

library(mgcv)

fit_gam_extract <- function(resp_var, data) {
  # 动态构建模型公式
  formula <- as.formula(paste0(resp_var, " ~ s(predictor, bs = 'cs')"))
  # 拟合GAM模型(原模型里的+1是显式声明截距,gam默认包含,这里可以保留也可以省略)
  mod <- gam(formula, family = Gamma(link = "log"), method = "REML", data = data)
  mod_sum <- summary(mod)
  
  # 整理需要的统计量,按需调整
  result <- data.frame(
    R_squared = mod_sum$r.sq,
    Deviance_Explained = mod_sum$dev.expl,
    Smooth_EDF = mod_sum$s.table[,"edf"],
    Smooth_Pvalue = mod_sum$s.table[,"p-value"],
    AIC = mod_sum$aic,
    BIC = mod_sum$bic
  )
  return(result)
}

步骤3:用lapply迭代运行所有模型

遍历所有响应变量,应用上面的函数,最后把结果合并成一个规范的数据框:

# 批量运行模型
all_results <- lapply(resp_vars, fit_gam_extract, data = ex.dat)
# 合并结果并设置行名为响应变量名
results_df <- do.call(rbind, all_results)
rownames(results_df) <- resp_vars

步骤4:导出为CSV文件

write.csv把结果导出到本地:

write.csv(results_df, file = "gam_model_summary.csv", row.names = TRUE)

补充提示

  • 如果需要提取summary()里的其他内容(比如截距项的系数、标准误),可以从mod_sum$p.table中提取对应字段,补充到result数据框里。
  • 注意Gamma分布要求响应变量为正数,示例数据里有0值,实际运行可能会出现警告/错误,建议提前处理(比如给0值加一个极小常数,或者改用合适的分布)。
  • 也可以用sapply替代lapply,直接得到矩阵后转置,效果一样:
results_df <- t(as.data.frame(sapply(resp_vars, fit_gam_extract, data = ex.dat)))

内容的提问来源于stack exchange,提问作者JKO

火山引擎 最新活动