在R中用Amelia插补数据集结合Zelig的sim函数获取合并估计值
获取Zelig中多重插补数据集的合并后模拟结果
我懂你的需求——用Amelia生成多重插补数据集后,通过Zelig拟合回归模型,虽然Zelig在绘制统计量时能自动合并m个插补的结果,但你希望直接从sim命令的输出里拿到合并后的估计值/预测值对吧?下面给你两种可行的方法:
方法1:用Zelig内置的get_qi()函数直接提取合并结果
Zelig针对多重插补场景已经内置了合并逻辑,你只需要在提取感兴趣的统计量时指定combined = TRUE即可:
# 加载所需包 library(Amelia) library(Zelig) # 假设你的Amelia多重插补结果对象是amelia_fit # 第一步:用Zelig拟合模型(支持大部分常见模型,比如线性回归"ls"、逻辑回归"logit"等) zelig_fit <- zelig( Y ~ X1 + X2 + X3, # 你的回归公式 data = amelia_fit, model = "ls" # 根据你的模型类型替换 ) # 第二步:运行模拟得到预测相关结果 sim_results <- sim(zelig_fit) # 第三步:提取合并后的预测值(以期望值为例) combined_preds <- get_qi( sim_results, qi = "expected value", # 可选:"predicted value"、"first difference"等 combined = TRUE # 关键参数:返回合并后的结果 ) # 查看合并后的结果 head(combined_preds)
这个方法会自动按照Rubin规则合并m个插补数据集的模拟结果,直接得到你需要的合并后估计值。
方法2:手动按照Rubin规则合并(适合自定义需求)
如果你需要更灵活的控制,也可以手动提取每个插补数据集的结果,然后按照Rubin规则计算合并后的统计量:
# 提取所有插补数据集的预测值(不合并) all_preds <- get_qi(sim_results, qi = "expected value", combined = FALSE) # 获取插补数量m m <- ncol(all_preds) # 计算合并后的均值 combined_mean <- apply(all_preds, 2, mean) # 计算合并后的方差(组内方差 + 组间方差*(1 + 1/m)) within_var <- apply(all_preds, 2, var) between_var <- var(t(all_preds)) combined_var <- within_var + between_var * (1 + 1/m) # 最终合并结果:均值 ± 1.96*标准误 combined_results <- data.frame( mean = combined_mean, se = sqrt(combined_var), lower = combined_mean - 1.96*sqrt(combined_var), upper = combined_mean + 1.96*sqrt(combined_var) )
另外,如果你需要的是回归系数的合并估计值,直接用coef(zelig_fit)就能得到Zelig已经合并好的系数结果,不需要额外处理。
内容的提问来源于stack exchange,提问作者Cristian
相关产品推荐
相关产品推荐

