如何在R的Synth包中获取求和不限定为1的合成控制权重?
解决Synth包获取非求和为1权重的方法
核心思路
Synth包的synth()函数默认对控制组权重施加权重非负和权重和为1两个约束。要取消求和为1的限制,需要手动修改优化问题的约束矩阵,移除权重和为1的约束条件。
具体实现步骤
先完成基础数据准备
按照Synth包的要求,先用dataprep()函数处理好你的数据,得到dataprep.out对象(这一步和常规合成控制流程一致)。提取优化所需参数
先运行一次默认的synth(),获取后续优化需要的矩阵和参数:
library(Synth) # 假设已完成数据准备,得到dataprep.out # dataprep.out <- dataprep(...) # 生成默认合成控制结果 synth.out <- synth(dataprep.out) # 提取优化用的核心矩阵和权重V X0 <- dataprep.out$X0 X1 <- dataprep.out$X1 Z0 <- dataprep.out$Z0 Z1 <- dataprep.out$Z1 V <- synth.out$solution.v
- 修改约束条件并重新计算权重
默认约束包含sum(w)=1和w>=0,我们只保留非负约束,去掉求和限制:
# 构建新约束:仅保留权重非负的约束(去掉sum(w)=1的行) new_constraints <- diag(ncol(X0)) # 对角矩阵,对应每个权重>=0 new_rhs <- rep(0, ncol(X0)) # 约束右侧值为0 new_dir <- rep(">=", ncol(X0)) # 约束方向为>= # 调用Synth底层的权重优化函数 w_opt <- synth:::synth_w(X0 = X0, X1 = X1, Z0 = Z0, Z1 = Z1, V = V, constraints = new_constraints, rhs = new_rhs, dir = new_dir) # 最终得到不受求和为1限制的权重 unconstrained_weights <- w_opt$solution.w
注意事项
- 取消求和约束后,权重总和可能不为1,甚至单个权重超过1,需要结合你的研究场景解释这类权重的实际意义;
synth:::synth_w是包内未导出的底层函数,未来包版本更新可能会有变动,使用时注意兼容性;- 如果需要添加其他自定义约束(比如权重上限),只需调整
constraints、rhs和dir三个参数即可。
内容的提问来源于stack exchange,提问作者NicolasRoever
相关产品推荐
相关产品推荐

