如何用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




