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

Stata中synth2执行合成控制法运行过慢的优化咨询

问题描述

我正在撰写课程论文,研究自然灾害对出生率的影响,使用Stata的synth2包执行合成控制法。数据已清理,代码逻辑无误,但运行耗时极长甚至无法运行。以下是使用的代码:

synth2 loggedbirths loggedbirths(`=tm(2009m1)') loggedbirths(`=tm(2009m2)') loggedbirths(`=tm(2009m3)') loggedbirths(`=tm(2009m4)') loggedbirths(`=tm(2009m5)') loggedbirths(`=tm(2009m6)') loggedbirths(`=tm(2009m7)') loggedbirths(`=tm(2009m8)') loggedbirths(`=tm(2009m9)') loggedbirths(`=tm(2009m10)') loggedbirths(`=tm(2009m11)') loggedbirths(`=tm(2009m12)') loggedbirths(`=tm(2010m1)') loggedbirths(`=tm(2010m2)') loggedbirths(`=tm(2010m3)') loggedbirths(`=tm(2010m4)') loggedbirths(`=tm(2010m5)') loggedbirths(`=tm(2010m6)') loggedbirths(`=tm(2010m7)') loggedbirths(`=tm(2010m8)') loggedbirths(`=tm(2010m9)') loggedbirths(`=tm(2010m10)') loggedbirths(`=tm(2010m11)') loggedbirths(`=tm(2010m12)') loggedbirths(`=tm(2011m1)') loggedbirths(`=tm(2011m2)') loggedbirths(`=tm(2011m3)') loggedbirths(`=tm(2011m4)') loggedbirths(`=tm(2011m5)') loggedbirths(`=tm(2011m6)') loggedbirths(`=tm(2011m7)') loggedbirths(`=tm(2011m8)') loggedbirths(`=tm(2011m9)') loggedbirths(`=tm(2011m10)') loggedbirths(`=tm(2011m11)') loggedbirths(`=tm(2011m12)') loggedbirths(`=tm(2012m1)') loggedbirths(`=tm(2012m2)') loggedbirths(`=tm(2012m3)') loggedbirths(`=tm(2012m4)') loggedbirths(`=tm(2012m5)') loggedbirths(`=tm(2012m6)') loggedbirths(`=tm(2012m7)') loggedbirths(`=tm(2012m8)') loggedbirths(`=tm(2012m9)') loggedbirths(`=tm(2012m10)') loggedbirths(`=tm(2012m11)') loggedbirths(`=tm(2012m12)') loggedbirths(`=tm(2013m1)') loggedbirths(`=tm(2013m2)') loggedbirths(`=tm(2013m3)') loggedbirths(`=tm(2013m4)') loggedbirths(`=tm(2013m5)') loggedbirths(`=tm(2013m6)') loggedbirths(`=tm(2013m7)') loggedbirths(`=tm(2013m8)') loggedbirths(`=tm(2013m9)') loggedbirths(`=tm(2013m10)') loggedbirths(`=tm(2013m11)') loggedbirths(`=tm(2013m12)') loggedbirths(`=tm(2014m1)') loggedbirths(`=tm(2014m2)') loggedbirths(`=tm(2014m3)') loggedbirths(`=tm(2014m4)') loggedbirths(`=tm(2014m5)') loggedbirths(`=tm(2014m6)') loggedbirths(`=tm(2014m7)') loggedbirths(`=tm(2014m8)') loggedbirths(`=tm(2014m9)') loggedbirths(`=tm(2014m10)') loggedbirths(`=tm(2014m11)') loggedbirths(`=tm(2014m12)') loggedbirths(`=tm(2015m1)') loggedbirths(`=tm(2015m2)') loggedbirths(`=tm(2015m3)') loggedbirths(`=tm(2015m4)') loggedbirths(`=tm(2015m5)') loggedbirths(`=tm(2015m6)') loggedbirths(`=tm(2015m7)') loggedbirths(`=tm(2015m8)') loggedbirths(`=tm(2015m9)') loggedbirths(`=tm(2015m10)') loggedbirths(`=tm(2015m11)') loggedbirths(`=tm(2015m12)') loggedbirths(`=tm(2016m1)') loggedbirths(`=tm(2016m2)') loggedbirths(`=tm(2016m3)')  marriages(`=tm(2009m1)') marriages(`=tm(2009m2)') marriages(`=tm(2009m3)') marriages(`=tm(2009m4)') marriages(`=tm(2009m5)') marriages(`=tm(2009m6)') marriages(`=tm(2009m7)') marriages(`=tm(2009m8)') marriages(`=tm(2009m9)') marriages(`=tm(2009m10)') marriages(`=tm(2009m11)') marriages(`=tm(2009m12)') marriages(`=tm(2010m1)') marriages(`=tm(2010m2)') marriages(`=tm(2010m3)') marriages(`=tm(2010m4)') marriages(`=tm(2010m5)') marriages(`=tm(2010m6)') marriages(`=tm(2010m7)') marriages(`=tm(2010m8)') marriages(`=tm(2010m9)') marriages(`=tm(2010m10)') marriages(`=tm(2010m11)') marriages(`=tm(2010m12)') marriages(`=tm(2011m1)') marriages(`=tm(2011m2)') marriages(`=tm(2011m3)') marriages(`=tm(2011m4)') marriages(`=tm(2011m5)') marriages(`=tm(2011m6)') marriages(`=tm(2011m7)') marriages(`=tm(2011m8)') marriages(`=tm(2011m9)') marriages(`=tm(2011m10)') marriages(`=tm(2011m11)') marriages(`=tm(2011m12)') marriages(`=tm(2012m1)') marriages(`=tm(2012m2)') marriages(`=tm(2012m3)') marriages(`=tm(2012m4)') marriages(`=tm(2012m5)') marriages(`=tm(2012m6)') marriages(`=tm(2012m7)') marriages(`=tm(2012m8)') marriages(`=tm(2012m9)') marriages(`=tm(2012m10)') marriages(`=tm(2012m11)') marriages(`=tm(2012m12)') marriages(`=tm(2013m1)') marriages(`=tm(2013m2)') marriages(`=tm(2013m3)') marriages(`=tm(2013m4)') marriages(`=tm(2013m5)') marriages(`=tm(2013m6)') marriages(`=tm(2013m7)') marriages(`=tm(2013m8)') marriages(`=tm(2013m9)') marriages(`=tm(2013m10)') marriages(`=tm(2013m11)') marriages(`=tm(2013m12)') marriages(`=tm(2014m1)') marriages(`=tm(2014m2)') marriages(`=tm(2014m3)') marriages(`=tm(2014m4)') marriages(`=tm(2014m5)') marriages(`=tm(2014m6)') marriages(`=tm(2014m7)') marriages(`=tm(2014m8)') marriages(`=tm(2014m9)') marriages(`=tm(2014m10)') marriages(`=tm(2014m11)') marriages(`=tm(2014m12)') marriages(`=tm(2015m1)') marriages(`=tm(2015m2)') marriages(`=tm(2015m3)') marriages(`=tm(2015m4)') marriages(`=tm(2015m5)') marriages(`=tm(2015m6)') marriages(`=tm(2015m7)') marriages(`=tm(2015m8)') marriages(`=tm(2015m9)') marriages(`=tm(2015m10)') marriages(`=tm(2015m11)') marriages(`=tm(2015m12)') marriages(`=tm(2016m1)') marriages(`=tm(2016m2)') marriages(`=tm(2016m3)'), trunit(43) trperiod(`=tm(2016m4)') counit(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,39,47) nested allopt placebo(unit cut(2)) sigf(6) loo frame(kum) savegraph(kum) postperiod(`=tm(2016m4)' `=tm(2016m5)',`=tm(2016m6)',`=tm(2016m7)',`=tm(2016m8)',`=tm(2016m9)',`=tm(2016m10)',`=tm(2016m11)',`=tm(2016m12)',`=tm(2017m1)',`=tm(2017m2)',`=tm(2017m3)',`=tm(2017m4)',`=tm(2017m5)',`=tm(2017m6)',`=tm(2017m7)',`=tm(2017m8)',`=tm(2017m9)',`=tm(2017m10)',`=tm(2017m11)',`=tm(2017m12)',`=tm(2018m1)',`=tm(2018m2)',`=tm(2018m3)',`=tm(2018m4)',`=tm(2018m5)',`=tm(2018m6)')

注:marriages与loggedbirths的历史月度值为协变量,分析单元为日本都道府县的面板数据,已尝试移除allopt参数但未实现提速。

代码优化建议
  • 精简协变量维度:当前直接纳入2009-2016年3月的所有月度观测作为协变量,导致特征维度爆炸,是计算量过大的核心原因。可采取两种方式精简:
    • 聚合时间维度:将月度数据合并为年度均值、灾害前特定时间段(如前1年、前3年)的均值,减少协变量数量
    • 降维处理:用Stata的pca命令对loggedbirths和marriages的月度序列提取主成分,保留方差解释率较高的前2-3个主成分作为协变量,大幅降低维度
  • 简化安慰剂检验:placebo(unit cut(2))会对大量控制组单元重复运行合成控制模型,耗时占比极高。可分步操作:
    • 先移除placebo参数,运行基础合成控制模型确认结果正常,再逐步加入安慰剂检验
    • 缩小安慰剂检验范围:使用cut(5)只保留与处理组匹配度更高的控制组单元,或手动指定少量代表性控制组单元进行安慰剂检验
  • 调整优化器参数:尝试指定更轻量的优化算法,比如添加optimizer(nelder)参数;同时可适当放宽收敛阈值(如tolerance(1e-4)),在精度可接受的前提下加快计算
  • 关闭非必要输出:暂时移除savegraph、frame(kum)等绘图和帧操作命令,待模型成功运行后再添加这些输出步骤,减少实时IO负担
  • 缩小控制组规模:当前控制组包含38个都道府县,可先通过倾向得分匹配(PSM)筛选出与处理组(单元43)特征更相似的10-15个控制组单元,再运行synth2,减少合成控制的候选池

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 20:37:02