如何基于Hmisc实现多亚组汇总表合并与并列点图绘制
扩展Hmisc::summary.formula实现多亚组双处理组汇总与并列点图
1. 生成整合式多亚组双处理组汇总表格
默认Hmisc::summary.formula仅支持单组或单一拆分变量的汇总输出,要同时展示两个处理组的亚组统计结果,可通过自定义包装函数整合不同处理组的汇总:
实现代码
library(Hmisc) library(tidyverse) data(pbc) # 自定义合并汇总函数 merged_subgroup_summary <- function(data, group_vars, outcome_var, trt_var) { # 按处理组拆分数据集 trt_splits <- split(data, data[[trt_var]]) # 批量生成各处理组的亚组汇总 trt_summaries <- lapply(trt_splits, function(sub_df) { sum_formula <- as.formula(paste(outcome_var, "~", paste(group_vars, collapse = "+"))) sum_output <- summary.formula(sum_formula, data = sub_df, method = "response") # 转换为结构化数据框并添加处理组标识 as.data.frame(sum_output$stats) %>% rownames_to_column("subgroup") %>% mutate(trt = unique(sub_df[[trt_var]])) }) # 合并结果并重塑为宽表,实现同亚组双处理组统计量并列 bind_rows(trt_summaries) %>% pivot_wider( names_from = trt, values_from = c(N, Mean, SD, Median, `Lower 95%`, `Upper 95%`), names_glue = "{.value}_trt{trt}" ) %>% arrange(subgroup) } # 生成整合汇总表 combined_table <- merged_subgroup_summary( data = pbc, group_vars = c("sex", "stage", "ascites", "spiders"), outcome_var = "chol", trt_var = "trt" ) # 查看结果 print(combined_table, row.names = FALSE)
逻辑说明
- 按处理组拆分数据集,分别调用
summary.formula生成亚组统计结果 - 将每个处理组的汇总转换为数据框,添加处理组标识后合并
- 通过
pivot_wider重塑为宽表,让同一亚组的两个处理组统计量并列展示
2. 基于汇总结果生成并列点图
利用整合后的表格,可直接用ggplot2生成展示双处理组亚组均值及置信区间的并列点图:
实现代码
# 整理绘图数据为长格式 plot_ready_data <- combined_table %>% pivot_longer( cols = starts_with("Mean_trt"), names_to = "treatment", values_to = "mean_chol", names_prefix = "Mean_trt" ) %>% mutate( treatment = factor(treatment, labels = c("处理组1", "处理组2")), lower_ci = get(paste0("Lower 95%_trt", treatment)), upper_ci = get(paste0("Upper 95%_trt", treatment)) ) # 绘制并列点图 ggplot(plot_ready_data, aes(x = subgroup, y = mean_chol, color = treatment)) + geom_point(position = position_dodge(width = 0.6), size = 3) + geom_errorbar( aes(ymin = lower_ci, ymax = upper_ci), position = position_dodge(width = 0.6), width = 0.2 ) + theme_minimal() + theme(axis.text.x = element_text(angle = 45, hjust = 1)) + labs( x = "亚组类别", y = "胆固醇均值(95%置信区间)", color = "处理组", title = "不同亚组双处理组胆固醇水平对比" )
逻辑说明
- 将宽表转换为长格式,统一处理组标识和对应统计量
- 使用
position_dodge实现点和误差棒的并列展示,避免重叠 - 调整x轴标签角度提升可读性,添加清晰的图表标注
贴近原生调用的扩展包装函数
如果需要更贴近summary.formula的原生调用方式,可封装专用函数:
summary.formula_trt <- function(formula, data, trt_var, ...) { # 提取公式中的结果变量和分组变量 term_obj <- terms(formula) outcome_var <- as.character(term_obj[[2]]) group_vars <- attr(term_obj, "term.labels") # 调用合并汇总函数 merged_subgroup_summary(data, group_vars, outcome_var, trt_var) } # 调用示例 extended_summary <- summary.formula_trt( chol ~ sex + stage + ascites + spiders, data = pbc, trt_var = "trt" )
内容的提问来源于stack exchange,提问作者Ahir Bhairav Orai
相关产品推荐
相关产品推荐

