如何在R中实现逐次排除carb水平的gear分组嵌套GLM建模
解决方案
先整理数据并定义要循环的目标carb水平:
library(dplyr) library(purrr) library(broom) library(plyr) # 保留你原使用的dlply # 加载数据并预处理 data("mtcars") mtcars$Name <- row.names(mtcars) row.names(mtcars) <- NULL # 先排除carb=6和8,得到基础数据集 base_data <- mtcars %>% filter(!carb %in% c(6,8)) # 定义需要逐次排除的carb水平 exclude_carb_list <- c(1,2,3,4)
接下来用map实现外层循环,对每个要排除的carb水平,执行分组建模并整理结果:
# 嵌套建模并整理结果 final_result <- map_df(exclude_carb_list, function(exclude_carb) { # 排除当前指定的carb水平 filtered_data <- base_data %>% filter(carb != exclude_carb) # 按gear分组跑GLM模型,和你原代码逻辑一致 model_list <- plyr::dlply(filtered_data, "gear", function(x) tryCatch( glm(mpg ~ wt, data = x), error = function(e) NA ), .drop = TRUE) # 整理模型结果,新增排除的carb标识列 map2_df(model_list, names(model_list), ~{ if (!is.na(.x)) { broom::tidy(.x, confint = TRUE)[2,] %>% mutate(gear = .y, excluded_carb = exclude_carb) } else { # 若模型报错,返回空行(可根据需求调整) tibble(term = NA, estimate = NA, std.error = NA, statistic = NA, p.value = NA, conf.low = NA, conf.high = NA, gear = .y, excluded_carb = exclude_carb) } }) })
结果说明
final_result包含所有场景的统计结果:excluded_carb列标记当前排除的carb水平gear列标记分组的gear水平- 其余列是模型中
wt项的回归系数、置信区间等统计量
内容的提问来源于stack exchange,提问作者Eagle Hawk
相关产品推荐
相关产品推荐

