如何对MICE插补得到的pooled GLM使用simulate函数开展数据模拟
MICE Pooled GLM 响应变量模拟实现方法
核心限制说明
pool()函数返回的mipo类多重插补合并结果对象,没有内置的simulate方法,无法直接像原生glm对象那样调用simulate()完成模拟。要完全对齐你给出的原生glmsimulate的行为,需要手动复现simulate.glm对二元logit模型的内置逻辑,再用合并后的系数完成计算。
原生simulate对二元logit模型的默认行为
对应你参考代码中
simulate(glm3_ref)[,1]的实际执行逻辑:
- 用模型的点估计系数计算每个观测的线性预测值
eta = Xβ- 通过logit函数的逆变换(即
plogis())把线性预测值转成事件发生概率p- 对每个观测,从成功概率为p的伯努利分布中抽取二元响应值,默认不引入参数本身的不确定性扰动
分步实现
- 提取多重插补合并后的回归系数
# 从pool结果中获取合并点估计系数 pooled_coef <- coef(glm_pooled)
- 构建和建模公式完全匹配的设计矩阵
这里要注意严格对齐公式展开的结构(包括哑变量生成、交互项构造、无截距设置),避免维度不匹配:
# 取任意一个完成的插补数据集生成设计矩阵,和原始建模逻辑完全一致 X <- model.matrix(form3, data = complete(miceData, 1))
- 按原生simulate逻辑生成模拟响应值
# 计算线性预测值 eta <- X %*% pooled_coef # 转换为事件发生概率 p <- plogis(eta) # 伯努利抽样生成模拟响应,格式和simulate输出保持一致 yNew <- data.frame( sim_1 = rbinom(n = length(p), size = 1, prob = p) )
常见注意事项
- 不要直接对
glm_pooled调用simulate(),该函数仅识别原生glm类的存储结构,对mipo对象会抛出方法不存在的错误。 - 因为你的模型公式带
-1参数,设计矩阵本身不包含截距项,计算线性预测值时不要额外补充截距,否则会导致结果系统性偏倚。 - 上述实现和参考代码的simulate行为完全等价:都是基于点估计计算概率后直接抽样,没有额外引入参数的随机扰动。如果后续需要把多重插补带来的参数不确定性纳入模拟,才需要基于Rubin规则的合并协方差矩阵,从多元正态分布中抽样回归系数再重复计算概率,这不属于默认simulate的行为范畴。
内容的提问来源于stack exchange,提问作者Landscape
相关产品推荐
相关产品推荐

