* 请先在自己的授权 Stata 中 cd 到完整解压目录,再运行本文件。 version 16.0 clear set more off capture log close log using "Stata课堂运行.log", text replace * 步骤一:导入并核对四格来源和分母 import delimited using "两州就业汇总.csv", varnames(1) encoding("utf-8") asdouble clear isid 州别 调查时期 assert _N == 4 assert inlist(州别,"新泽西州","宾夕法尼亚州东部") assert inlist(调查时期,"政策前","政策后") assert 有效门店数 > 0 & !missing(有效门店数,全职当量合计) generate byte treat = (州别 == "新泽西州") generate byte post = (调查时期 == "政策后") isid treat post generate double avgfte = 全职当量合计 / 有效门店数 label variable avgfte "每店平均全职当量" format avgfte %12.8f list 州别 调查时期 有效门店数 avgfte, noobs * 步骤二:依次保存四个均值,再算两次差 quietly summarize avgfte if treat == 1 & post == 0, meanonly scalar tb = r(mean) quietly summarize avgfte if treat == 1 & post == 1, meanonly scalar ta = r(mean) quietly summarize avgfte if treat == 0 & post == 0, meanonly scalar cb = r(mean) quietly summarize avgfte if treat == 0 & post == 1, meanonly scalar ca = r(mean) scalar treated_change = ta - tb scalar control_change = ca - cb scalar counterfactual = tb + control_change scalar did = treated_change - control_change display "处理变化 = " %12.8f treated_change display "对照变化 = " %12.8f control_change display "DID = " %12.8f did assert abs(did-2.75360578298058) < 0.00000001 * 步骤三:显式设置基组,交互项只核对点估计 regress avgfte ib0.treat##ib0.post display "交互项 = " %12.8f _b[1.treat#1.post] assert abs(_b[1.treat#1.post]-did) < 0.00000001 assert e(df_r) == 0 preserve rename treat 处理组 rename post 政策后 rename avgfte 每店平均全职当量 export delimited using "Stata四格均值结果.csv", replace restore * 步骤四:读入教学反事实情景,不覆盖真实调查 preserve import delimited using "反事实情景.csv", varnames(1) encoding("utf-8") asdouble clear assert _N == 1 & !missing(假设对照组变化) scalar assumed_change = 假设对照组变化[1] scalar scenario_did = treated_change-assumed_change scalar scenario_counterfactual = tb+assumed_change display "假设情景DID = " %12.8f scenario_did display "假设情景反事实 = " %12.8f scenario_counterfactual restore * 步骤五:用新的原创模拟门店资料独立迁移 import delimited using "独立练习_模拟门店.csv", varnames(1) encoding("utf-8") asdouble clear isid 门店编号 时期 assert _N == 16 assert inlist(组别,"试点组","参照组") & inlist(时期,"政策前","政策后") bysort 门店编号: assert _N == 2 bysort 门店编号: assert 组别 == 组别[1] generate byte treat = (组别 == "试点组") generate byte post = (时期 == "政策后") collapse (mean) avgfte=全职当量 (count) stores=全职当量, by(treat post) isid treat post assert _N == 4 & stores == 4 list treat post stores avgfte, noobs * 步骤六:模拟的四格回归只用于检查运算 regress avgfte ib0.treat##ib0.post scalar simulated_did = _b[1.treat#1.post] assert abs(simulated_did-3) < 0.00000001 assert e(df_r) == 0 display "模拟DID = " %9.4f simulated_did rename treat 处理组 rename post 政策后 rename avgfte 每店平均全职当量 rename stores 门店数 export delimited using "Stata模拟四格结果.csv", replace log close