MICE中分类变量的插补诊断方法咨询
解决mice包分类变量插补后分布对比的问题
mice包本身确实没有像miceRanger的plotDistributions()那样,直接一键对比原始数据与插补后分类变量分布的内置函数,需要自定义实现,但有几种简单高效的方式:
方法1:用ggplot2手动绘制对比条形图
先通过mice::complete()提取所有插补后的数据集,将原始数据和插补数据合并,标记来源后用ggplot2绘制分组条形图:
library(mice) library(ggplot2) library(dplyr) # 示例数据 data(nhanes) imp <- mice(nhanes, m = 5, printFlag = FALSE) # 提取原始数据并标记来源 raw_data <- nhanes %>% mutate(data_source = "原始数据", .before = everything()) # 提取所有插补数据集并合并 imputed_datasets <- lapply(1:imp$m, function(i) { complete(imp, action = i) %>% mutate(data_source = paste0("插补集", i), .before = everything()) }) %>% bind_rows() # 合并原始与插补数据 combined_data <- bind_rows(raw_data, imputed_datasets) # 绘制分类变量(比如hyp)的分布对比 ggplot(combined_data, aes(x = hyp, fill = data_source)) + geom_bar(position = "dodge") + labs(title = "原始数据与插补数据的hyp变量分布对比", x = "高血压状态", y = "频数") + theme_minimal()
方法2:用基础绘图+比例计算对比
如果不想依赖ggplot2,也可以用R基础绘图,先计算原始数据和插补数据中分类变量的比例,再绘制对比图:
# 计算原始数据比例 raw_prop <- prop.table(table(nhanes$hyp)) # 计算各插补集的比例 imp_props <- lapply(1:imp$m, function(i) { prop.table(table(complete(imp, i)$hyp)) }) # 整理绘图数据 plot_data <- cbind( data.frame(prop = raw_prop, source = "原始数据", category = names(raw_prop)), do.call(rbind, lapply(1:length(imp_props), function(i) { data.frame(prop = imp_props[[i]], source = paste0("插补集", i), category = names(imp_props[[i]])) })) ) # 绘制分组条形图 barplot( t(matrix(plot_data$prop, nrow = length(unique(plot_data$category)))), beside = TRUE, names.arg = unique(plot_data$category), col = c("blue", rep("gray", imp$m)), legend.text = c("原始数据", paste0("插补集", 1:imp$m)), main = "hyp变量原始与插补分布比例对比", xlab = "高血压状态", ylab = "比例" )
方法3:封装成自定义函数复用
如果需要多次对比不同分类变量,可以把逻辑封装成函数,方便调用:
plot_cat_dist_mice <- function(imp_obj, var_name) { library(dplyr) library(ggplot2) raw_data <- imp_obj$data %>% mutate(data_source = "原始数据", .before = everything()) imputed_datasets <- lapply(1:imp_obj$m, function(i) { complete(imp_obj, action = i) %>% mutate(data_source = paste0("插补集", i), .before = everything()) }) %>% bind_rows() combined_data <- bind_rows(raw_data, imputed_datasets) ggplot(combined_data, aes(x = .data[[var_name]], fill = data_source)) + geom_bar(position = "dodge") + labs(title = paste(var_name, "原始与插补数据分布对比"), x = var_name, y = "频数") + theme_minimal() } # 使用示例 plot_cat_dist_mice(imp, "hyp")
内容的提问来源于stack exchange,提问作者jappo19
相关产品推荐
相关产品推荐

