如何在mice插补后用with()+pool()调用CreateTableOne()计算合并SMD?
解决mice插补后用CreateTableOne计算合并SMD的问题
错误原因
你遇到的报错是因为在with(data_im, ...)环境中调用CreateTableOne时,没有显式指定data参数,函数无法自动识别当前的插补数据集。
解决方案
需要在每个插补数据集上计算SMD,再用pool()合并结果,具体有两种实现方式:
方式一:直接在with环境中处理
library(tableone) library(mice) data("nhanes2") # 定义变量和分类变量 vars <- c("bmi","chl","age","hyp") catvars <- c("age","hyp") # 数据插补 data_im <- mice(nhanes2, m=5, seed=6666) # 在每个插补数据集上计算SMD并转为数据框 smd_results <- with(data_im, { # 显式传入当前数据集(.代表with环境中的数据) tab_obj <- CreateTableOne(vars = vars, factorVars = catvars, strata = "hyp", data = .) # 提取SMD值 smd_values <- ExtractSmd(tab_obj) # 转为数据框以便后续合并 data.frame(variable = names(smd_values), smd = unname(smd_values)) }) # 合并多个插补数据集的SMD结果 pooled_smd <- pool(smd_results) # 查看合并后的SMD估计值和标准误 summary(pooled_smd)
方式二:自定义函数实现
如果需要复用逻辑,可以单独定义计算SMD的函数:
# 定义计算SMD的函数 compute_smd <- function(data, target_vars, factor_vars, group_var) { tab1 <- CreateTableOne(vars = target_vars, factorVars = factor_vars, strata = group_var, data = data) smd <- ExtractSmd(tab1) return(data.frame(variable = names(smd), smd = unname(smd))) } # 在插补数据集上应用函数 smd_results <- with(data_im, compute_smd(data = ., target_vars = vars, factor_vars = catvars, group_var = "hyp")) # 合并结果 pooled_smd <- pool(smd_results) # 输出合并后的SMD summary(pooled_smd)
说明
with(data_im, ...)会遍历每个插补后的数据集,执行内部代码并返回包含多个插补结果的mipo对象pool()可以合并这些插补结果,给出综合后的SMD估计值及标准误ExtractSmd()用于从CreateTableOne生成的对象中提取SMD值
内容的提问来源于stack exchange,提问作者tumidou
相关产品推荐
相关产品推荐

