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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:29:31