You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 22:57:20