在R中按国家分组重复回归(适配多重插补数据集)
按国家拆分多重插补数据集并提取指定系数的实现方法
核心思路
因为你的implist是多个插补后数据集的列表,所以要先对每个插补数据集按国家ID拆分,逐个国家跑模型提取系数,最后汇总所有插补结果。
具体步骤与代码
- 定义单个数据集的处理函数
这个函数负责把单个插补数据集按国家拆分,跑模型并提取income和age的系数,同时处理样本量不足的情况(避免模型报错):
extract_coefs <- function(data) { # 按国家ID拆分数据集 country_subsets <- split(data, data$country_id) # 遍历每个国家子集处理 country_res <- lapply(country_subsets, function(sub_data) { # 检查样本量:至少要有2个不同学校+足够样本量才能跑混合模型 if (length(unique(sub_data$school)) < 2 || nrow(sub_data) < 10) { return(data.frame( country_id = unique(sub_data$country_id), income_coef = NA, age_coef = NA, stringsAsFactors = FALSE )) } # 运行lmer模型 model <- lmer(happy ~ income + age + sex + education + city + (1|school), data = sub_data) # 提取系数 coef_summary <- coef(summary(model)) income_coef <- coef_summary["income", "Estimate"] age_coef <- coef_summary["age", "Estimate"] # 返回当前国家的结果 data.frame( country_id = unique(sub_data$country_id), income_coef = income_coef, age_coef = age_coef, stringsAsFactors = FALSE ) }) # 合并当前插补数据集里所有国家的结果 do.call(rbind, country_res) }
- 批量处理所有插补数据集
把上面的函数应用到implist里的每一个插补数据集:
# 生成所有插补数据集的结果列表 all_imp_results <- lapply(implist, extract_coefs) # 把所有结果合并成一个大的数据框 combined_results <- do.call(rbind, all_imp_results)
- 汇总多重插补的最终结果
如果需要得到每个国家在多重插补后的平均系数,可以用dplyr做分组汇总:
library(dplyr) final_coefs <- combined_results %>% group_by(country_id) %>% summarise( avg_income_coef = mean(income_coef, na.rm = TRUE), avg_age_coef = mean(age_coef, na.rm = TRUE), valid_imputations = sum(!is.na(income_coef)) # 统计有效插补次数 )
注意事项
- 样本量判断的阈值(比如10个样本、2个学校)可以根据你的实际数据调整,避免模型不收敛或结果不可靠
- 如果需要更严谨的多重插补结果合并(比如计算标准误、置信区间),可以扩展函数提取标准误后,用Rubin规则手动计算,或者结合
mice包的相关工具 - 如果你的
implist是mice包生成的,也可以考虑用with()结合分组,但手动拆分的方式更灵活可控
内容的提问来源于stack exchange,提问作者onelovec
相关产品推荐
相关产品推荐

