如何在gtsummary中为多重插补数据集计算并展示全局p值?
多重插补数据集在gtsummary中添加全局p值的解决办法
你遇到的问题是因为add_global_p()默认的统计方法不支持mice生成的mira类对象(即多重插补后的模型集合),需要用专门针对多重插补数据的全局检验逻辑来计算p值。下面是两种可行的方案:
方案一:自定义D1 Wald检验函数(推荐)
写一个适配mira对象的全局p值计算函数,直接传给add_global_p()即可:
# 自定义全局p值计算函数,适配mira对象 global_p_mice <- function(x, ...) { # 合并插补后的模型结果 pooled_model <- mice::pool(x) # 提取模型中的自变量项 terms <- attr(stats::terms(x$analyses[[1]]), "term.labels") # 逐个变量计算D1 Wald检验的全局p值 p_values <- purrr::map_dbl(terms, function(term) { # 构造移除当前变量的简化模型公式 reduced_formula <- stats::update(formula(x$analyses[[1]]), paste0("~ . - ", term)) # 在所有插补数据集上拟合简化模型 reduced_fit <- with(x$data, glm(formula = reduced_formula, family = binomial)) # 比较全模型与简化模型,得到全局p值 comp <- mice::pool.compare(x, reduced_fit, method = "D1") comp$pvalue }) # 给p值命名,对应变量名 names(p_values) <- terms p_values } # 对插补模型应用这个函数添加全局p值 tbl_regression(fit.i, exponentiate = TRUE) |> add_global_p(pvalue_fun = global_p_mice)
方案二:手动计算后添加p值
如果不想自定义函数,可以用mice::pool.compare()逐个算出全局p值,再手动合并到表格里:
# 先合并插补模型,获取全模型公式和自变量列表 pooled_fit <- mice::pool(fit.i) full_formula <- formula(fit.i$analyses[[1]]) vars <- attr(stats::terms(full_formula), "term.labels") # 循环计算每个变量的全局p值,整理成数据框 global_p_df <- purrr::map_dfr(vars, function(var) { reduced_formula <- update(full_formula, paste0("~ . - ", var)) reduced_fit <- with(data.i, glm(formula = reduced_formula, family = binomial)) comp <- pool.compare(fit.i, reduced_fit, method = "D1") tibble(variable = var, global_p = comp$pvalue) }) # 生成基础表格,然后合并p值列 tbl <- tbl_regression(fit.i, exponentiate = TRUE) tbl$table_body <- tbl$table_body |> left_join(global_p_df, by = "variable") |> mutate( global_p = ifelse(is.na(global_p), "", style_pvalue(global_p, digits = 3)) ) # 查看最终表格 tbl
补充说明
D1 Wald检验是多重插补数据中用于全局检验的常用方法,专门适配广义线性模型(比如你的logistic回归),能充分考虑插补过程带来的不确定性。
内容的提问来源于stack exchange,提问作者Curbice
相关产品推荐
相关产品推荐

