如何在gt表格中匿名化计数<3的单元格及关联比例、缺失值?
解决方案:tbl_uvregression 数据匿名化处理(满足数据保护要求)
核心思路
在保留分层变量真实统计量的前提下,针对指定分层的缺失值计数、比例计算做匿名化调整,彻底阻断通过其他数据反推小计数(<3)原始值的可能。
分步实现代码
1. 数据预处理:标记需匿名化的分组
先给数据集添加标记列,精准识别disease=="Yes"且bmi_class缺失的记录,同时为比例计算准备有效层级:
library(gtsummary) library(dplyr) library(purrr) # 假设你的数据集名为df df <- df %>% mutate( # 标记需要处理的缺失值分组 anonymize_group = case_when( disease == "Yes" & is.na(bmi_class) ~ TRUE, TRUE ~ FALSE ), # 筛选计数≥3的bmi_class层级,用于后续比例计算 bmi_class_valid = ifelse(!is.na(bmi_class) & table(bmi_class)[bmi_class] >= 3, bmi_class, NA) )
2. 自定义统计量函数:针对性处理缺失值与比例
编写专属函数,仅对disease=="Yes"分层的bmi_class做匿名化,其他分层保持默认统计逻辑:
bmi_class_anonymized <- function(x, ...) { # 获取当前分层的disease取值 current_disease <- attr(x, "data")$disease %>% unique() if (current_disease == "Yes") { # 处理缺失值:计数<3则替换为"<3",否则保留原数值 missing_count <- sum(is.na(x)) missing_text <- ifelse(missing_count < 3, "<3", as.character(missing_count)) # 计算比例:仅基于计数≥3的有效层级 valid_vals <- x[!is.na(x)] valid_counts <- table(valid_vals) %>% keep(~. >= 3) total_valid <- sum(valid_counts) # 构建统计文本 stat_lines <- imap_chr(valid_counts, ~paste0(.y, ": ", .x, " (", round(.x/total_valid*100, 1), "%)")) stat_lines <- c(stat_lines, paste0("Missing: ", missing_text)) paste(stat_lines, collapse = "; ") } else { # 其他分层使用默认的计数+比例格式 fmt_count_fraction(x, ...) } }
3. 调用tbl_uvregression并应用自定义逻辑
确保分层变量disease基于真实数据计算统计量,同时对bmi_class应用匿名化函数:
final_table <- df %>% tbl_uvregression( method = glm, y = outcome, # 替换为你的实际结局变量 include = c(disease, bmi_class), # 为不同变量指定统计逻辑 statistic = list( disease ~ "{n} ({p}%)", # disease用真实值计算统计量 bmi_class ~ bmi_class_anonymized ), stratify_by = disease, hide_n = FALSE ) %>% modify_header(label = "**Variable**") %>% modify_footnote(all_stat_cols() ~ "注:计数<3的单元格已匿名化,比例仅基于计数≥3的有效层级计算") # 输出表格 final_table
关键验证点
- 仅
disease=="Yes"分层的bmi_class缺失值会被匿名化,其他分组保持原样 - 比例计算自动排除计数<3的层级,避免反推原始小计数
- 分层变量
disease的统计量完全基于真实数据计算,未做任何匿名化调整
内容的提问来源于stack exchange,提问作者Mathilde Kjeldsen
相关产品推荐
相关产品推荐

