从Stata/R代码实操出发手把手教你用双重差分法DID评估一个‘政策’的真实效果评估政策效果是实证研究中的常见需求而双重差分法DID因其直观性和有效性成为广泛使用的工具。本文将以某城市人才引进政策对当地房价的影响为例带你一步步完成从数据准备到结果解读的全流程操作。1. 数据准备与清洗面板数据是DID分析的基础我们需要确保数据结构符合要求。以评估人才引进政策为例理想的数据应包含城市层面数据处理组实施政策的城市和对照组未实施政策的城市时间维度政策实施前后足够长的时期通常建议前后各3-5年关键变量房价指数结果变量政策实施时间处理变量其他控制变量如人口增长率、GDP增速等在Stata中检查数据结构// 查看面板数据结构 xtset city_id year xtdescribe常见问题及解决方案问题类型检查方法解决方案缺失值misstable summarize删除或插补异常值summarize var, detailWinsorize处理非平衡面板xtbalance, report平衡化处理提示平行趋势检验需要政策实施前的数据确保收集足够长的历史数据2. 基础DID模型实现2.1 Stata实现Stata的diff命令是进行DID分析的便捷工具// 基础DID模型 diff housing_price, t(treated) p(post) cov(pop_growth gdp_growth) kernel id(city_id) bs reps(100)关键参数解释treated是否处理组的虚拟变量post政策实施后的虚拟变量cov()加入的控制变量kernel使用核匹配提高估计效率bs reps(100)进行100次bootstrap抽样2.2 R语言实现R中的fixest包提供了高效的DID估计library(fixest) did_model - feols(housing_price ~ treated:post pop_growth gdp_growth | city_id year, data policy_data, vcov twoway) summary(did_model)模型输出解读要点treated:post的系数即政策效应关注标准误的计算方法聚类稳健标准误检查控制变量的显著性3. 平行趋势检验平行趋势假设是DID有效性的核心前提常用事件研究法验证// 生成相对时间变量 gen time_to_treat year - policy_year replace time_to_treat -5 if time_to_treat -5 // 截断早期年份 // 事件研究回归 reghdfe housing_price ib(-1).time_to_treat#i.treated pop_growth gdp_growth, /// absorb(city_id year) vce(cluster city_id)结果解读要点政策实施前的系数应统计不显著政策实施后的效应应随时间变化绘制系数图直观展示趋势注意若平行趋势不成立考虑使用合成控制法等其他方法4. 稳健性检验与结果报告完整的DID分析需要多种稳健性检验安慰剂检验虚构处理时间随机分配处理组控制变量敏感性不同控制变量组合加入城市特定趋势样本调整排除特殊城市不同时间窗口Stata实现安慰剂检验示例// 随机分配处理组 set seed 1234 gen placebo_treated runiform() 0.5 if treated 1 diff housing_price, t(placebo_treated) p(post) cov(pop_growth gdp_growth)结果报告应包括基础DID估计结果平行趋势检验证据稳健性检验结果经济意义解释如政策使房价上涨X%5. 高级话题与常见陷阱5.1 多期DID处理当政策实施时间不同时需要使用多期DID方法// 多期DID gen first_treat policy_year // 各城市首次实施政策的年份 ivreghdfe housing_price (D i.first_treat), absorb(city_id year) cluster(city_id)5.2 常见问题排查负权重问题检查twowayfeweights包动态效应使用eventstudyinteract命令溢出效应考虑空间计量方法实际操作中遇到的典型错误忽略面板数据的双重固定效应错误理解交互项系数忽视标准误的聚类调整对平行趋势检验的误解# R中检查负权重 library(did) att_gt(yname housing_price, tname year, idname city_id, gname first_treat, data policy_data)