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

使用ebalance完成熵平衡后如何将权重添加至DataFrame

ebal权重赋值错误修正方案

常见错误原因

  • 核心风险是向量顺序匹配问题:ebalance返回的out.eb$w仅包含控制组的权重,长度等于控制组样本量,若你传入ebalance的Treatment向量和数据集行顺序不匹配,ifelse会将权重赋值到错误的行
  • 隐式容错风险:即使Treatment顺序正确,ifelse写法也存在向量循环风险,当控制组样本量和out.eb$w长度不匹配时,R不会抛出明确报错,仅会给出警告,容易被忽略
  • 次要问题是部分场景下需要权重标准化,否则可能影响回归标准误的计算精度

正确实现代码

前提确认

调用ebalance时传入的Treatment、X的行顺序必须和你的data数据集行顺序完全一致,这是所有赋值正确的基础。

基础赋值(无标准化)

处理组权重为1,控制组直接使用ebal生成的原始权重,适合大多数平均处理效应估计场景:

# 初始化所有样本权重为1(处理组权重保持为1)
data$weights <- 1
# 仅对控制组行赋值ebal生成的权重
data$weights[Treatment == 0] <- out.eb$w

可选:标准化权重

如果你的回归模型要求权重和等于对应组的样本量,可以对控制组权重做标准化:

data$weights <- 1
ctrl_w <- out.eb$w
# 标准化后控制组权重和等于控制组样本量
data$weights[Treatment == 0] <- ctrl_w / sum(ctrl_w) * sum(Treatment == 0)

正确性验证

你可以通过以下方式快速校验赋值是否正确:

# 校验处理组权重和应等于处理组样本量
sum(data$weights[Treatment == 1]) == sum(Treatment == 1)
# 校验原始控制组权重和应等于处理组样本量(ebal默认输出特性)
sum(data$weights[Treatment == 0]) == sum(Treatment == 1)
# 校验协变量平衡:加权后控制组协变量均值应和处理组几乎一致
weighted.mean(data$covariate[data$Treatment == 0], data$weights[data$Treatment == 0])
mean(data$covariate[data$Treatment == 1])

加权回归示例

后续做平衡样本回归时直接传入权重参数即可:

# 加权线性回归示例
fit <- lm(outcome ~ Treatment + covariate1 + covariate2, data = data, weights = weights)
summary(fit)

内容的提问来源于stack exchange,提问作者user6530195

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 18:48:03