如何对数据框列中存储的GAM模型对象执行gam.check()?
如何对数据框列中的GAM模型批量执行gam.check()
问题根源
你之前的模型构建代码存在关键错误:没有对嵌套的分组数据集逐个调用gam(),导致fit列并未正确存储每个city/sex分组对应的GAM模型,这是后续调用gam.check()报错的核心原因。
步骤1:修正模型构建代码
必须先按city/sex分组,再用purrr::map()遍历每个嵌套数据集,生成对应分组的GAM模型:
library(dplyr) library(purrr) library(mgcv) # 正确构建每个分组的GAM模型 fitted_gam <- demographic_data %>% group_by(city, sex) %>% nest(data = c(age, year, count)) %>% mutate(fit = map(data, ~ gam(count ~ s(age) + s(year), data = .x, family = poisson, method = "REML"))) %>% ungroup()
步骤2:批量执行gam.check()
gam.check()主要用于输出诊断信息(无重要返回值),因此用purrr::walk()遍历fit列的模型对象最适合:
带分组标识的批量执行(便于区分输出)
fitted_gam %>% pwalk(list(city, sex, fit), ~ { cat("=== 分组:城市=", ..1, ",性别=", ..2, " ===\n", sep = "") gam.check(..3) cat("\n-------------------------\n") })
简洁版批量执行
# 直接遍历fit列所有模型 walk(fitted_gam$fit, gam.check)
步骤3:单个分组的模型诊断
如果只需查看特定分组的诊断结果,要用pull()提取单个模型对象(select()返回的是tibble,不是模型本身):
# 提取London/Male分组的模型并执行诊断 london_male_model <- fitted_gam %>% filter(city == 'London', sex == 'Male') %>% pull(fit) %>% pluck(1) # 提取列表中的模型对象 gam.check(london_male_model)
内容的提问来源于stack exchange,提问作者Olivander
相关产品推荐
相关产品推荐

