DID中检验SUTVA问题, 附数据和代码, 这几个渐进性政策DID可视化做得真好

学术   2024-12-18 17:31   美国  


凡是搞计量经济的,都关注这个号了
箱:econometrics666@126.com
所有计量经济圈方法论丛的code程序, 宏微观数据库和各种软件都放在社群里.欢迎到计量经济圈社群交流访问.

接着很实用! 一张图就把基准回归, 稳健性检验, 异质性分析, 安慰剂检验以及进一步拓展结果全囊括了,这篇文章里作者做了DID中的SUTVA检验。

以下情况可能对“开放专利图书馆能够促进创新”的观点提出挑战:图书馆的开放可能导致发明者在地理上的迁移,但对创新并未产生净效应。如果发明者因为图书馆的开放而迁移到专利图书馆所在地,那么所观察到的变化可能只是专利活动在地理分布上的调整,而非创新活动的实际增加。在这种情况下,处理分配(treatment assignment)违反了稳定单元处理值假设(SUTVA),因为专利图书馆的开放可能会削弱对照图书馆地区的创新能力。

为了探究这一可能性,重新进行了分析,假设那些最可能迁移至专利图书馆区域的发明者,来自地理位置上最接近的对照区域。基于这一假设,对基准分析进行了复现,这次排除了专利图书馆,转而为每个被排除的专利图书馆最近的联邦存储图书馆分配了一个虚假的处理指示变量(就是造一个fake treatment)。在图6的第8行展示了这些分析结果。结果显示,相关系数略微为负,且在统计学上不显著,同时与基准系数的量级也不匹配,这表明与较远的对照图书馆相比,较近的对照图书馆并没有显示出明显的趋势差异。

分析一下,作者通过以下方式验证了SUTVA(稳定单元处理值假设):
1.明确了潜在的SUTVA违反场景: 假如专利图书馆的开放导致发明者从对照区域迁移到处理区域(即专利图书馆所在地),创新活动的地理分布会发生变化,而并非创新总量的真正增加。这种“干扰效应”(interference)表明处理分配会间接影响未接受处理的对照单位,从而违反SUTVA的“无干扰”部分。
2.设计了检验SUTVA的伪处理实验: 为了检验这一假设,作者对基准分析进行复现,但使用“伪处理”(fake treatment)的方法:剔除掉专利图书馆,并为每个被剔除掉的专利图书馆最近的联邦存储图书馆(原来的处理组)分配一个虚假处理变量。这一设计旨在模拟“如果存在发明者迁移干扰”的情况。
3.分析结果支持了SUTVA的有效性: 伪处理分析显示,与较远的对照图书馆相比,地理位置较近的联邦存储图书馆并未表现出显著的创新趋势差异。系数既不显著也不匹配基准分析的量级,这表明:没有证据支持“专利图书馆开放导致发明者迁移”的假设;观察到的创新增长并非仅仅由于地理分布的调整,而是实际创新活动的提升。这表明发明者的迁移并没有导致对照图书馆区域的创新能力减弱,从而支持了SUTVA的“无干扰”假设。
提及SUTVA的post,参看1.CIC模型是对DID估计的推广, 还能知道在不同分布处的处理效应情况,2.近年来最全面和接地气的“因果推断统计学综述”, 真后悔接触这篇还是晚了点! 3.务必了解的综述: 机器学习控制因果识别中的混淆变量大有可为!4.应用计量经济学现状: 因果推断与政策评估最全综述,5.诚实双重差分法DID, 面板事件研究法和Bacon分解的经典应用文!6.在双重差分模型中使用倾向得分估计政策变化效应操作及注意事项! 附100篇相关文章! 7.最新: 时间序列因果推断, 问题, 方法和模型最全综述

*群友可前往社群下载完整数据和代码.

**计量经济圈已调试,可以直接运行出结果。

* Test of SUTVA
use "D:/下载/129581-V1/Kit/data/main_work", clear
cap drop strata_id mean
drop if patent_lib==1
bys pat_ID: egen cf=min(pat_FDL_dist)
replace patent_lib=(pat_FDL_dist==cf)
replace treated = patent_lib

egen strata_id = group(pat_ID stateid)
bysort strata_id: egen mean = mean(treated)
drop if mean==0 | mean==1
keep if yearsopen10>=-5 & yearsopen10<=5
gen post   = yearsopen10>=0
xi i.post*patent_lib, noomit
xtset identifier yearsopen10
cem pat_ID(#0) stateid(#0), treatment(treated)
drop if cem_matched==0
eststo r2: xtreg pat_pop_distance _IposXpaten_1 post  patent_lib i.yearID2 [aweight=cem_weights], fe cluster(pat_ID) 
sum pat_pop_distance
estadd scalar mean_scalar = r(mean)
其实,这里面“审稿人: 你DID模型中违反了个体处理稳定性假设SUTVA, 尽快处理一下其中隐患!”提到的文献就完全采用了类似的思路验证SUTVA假设。
当然,这篇文章在图形展示方面确实做得非常出色,下面的渐进政策演进图也绘制得非常清晰,既美观又易于理解。

**计量经济圈已调试,可以直接运行出结果。

* Figure 2: Expansion in time

use "D:/下载/129581-V1/Kit/data/patent_lib", replace

keep city_library openingyear

gen one = 1

sort openingyear city_library

gen two = sum(one)

replace city_library = proper(city_library)


keep if openingyear>=1974 & openingyear<1998


twoway (scatter  two openingyear  if openingyear>=1975 & openingyear<=1980, msize(0.9) mlabel(city_library) color(gs4) msymbol(O) mlabsize(1.6))(scatter  two openingyear   if openingyear>1980 & openingyear<=1985, msize(0.9) mlabel(city_library) color(gs7) msymbol(D) mlabsize(1.6))(scatter  two openingyear    if openingyear>1985 & openingyear<=1990, msize(0.9) mlabel(city_library) color(gs10) msymbol(T) mlabsize(1.6))(scatter  two openingyear   if openingyear>1990 & openingyear!=., mlabel(city_library) msize(0.9) color(gs13) msymbol(S) mlabsize(1.6)), ysize(8) xscale(range(1975 2000)) xlabel(1975(5)2000) ytitle("Number of patent libraries in U.S.", size(3)) xtitle("Opening year", size(3)) legend(off) 

graph export "D:/下载/129581-V1/Kit/results/Fig2.pdf", replace

画地图,其实Stata也不在话下,关键是作者的可视化做得真好。

**计量经济圈已调试,可以直接运行出结果,当然中间需要下载一些命令,比如gtools。
* Figure 1: Expansion in space
use "D:/下载/129581-V1/Kit/data/patent_lib", replace
drop if openingyear==.
ren city_library lib_city
drop if openingyear>1997
gen old = openingyear<1975 
drop if lng<-130

gen gradation=.
replace gradation=1 if openingyear>=1975 & openingyear<=1980
replace gradation=2 if openingyear>1980 & openingyear<=1985
replace gradation=3 if openingyear>1985 & openingyear<=1990
replace gradation=4 if openingyear>1990 & openingyear!=.

label define liblabel 0 "1870-1974" 1 "1975-1980"2 "1981-1985" 3 "1986-1990" 4 "after 1990"
label values gradation liblabel

save "D:/下载/129581-V1/Kit/data/oldPTDL", replace

cd "D:/下载/129581-V1/Kit/data/"
shp2dta using cb_2016_us_state_500k.shp, database("Newmap") coordinates("Newcoord") genid(id) replace
  
use Newmap.dta, clear

drop if NAME=="Alaska"
drop if NAME==" United States Virgin Islands"
drop if NAME=="Puerto Rico"
drop if NAME=="Hawaii"
drop if NAME=="Guam"
drop if id==33
drop if id==55
drop if id==56

spmap using Newcoord, id(id) point(data("oldPTDL.dta") select(drop if old==0) x(lng) y(lat ) sh (o) si(huge) fc(black)  legenda(on) legtitle("Opened in") leglabel(1870-1974)) legend(size( normal) pos(5)  region(fcolor(white)) symxsize(*0.5))
graph export "D:/下载/129581-V1/Kit/results/Fig1a.pdf", replace

spmap using Newcoord, id(id) point(data("oldPTDL.dta") select(drop if old==1) by(gradation) x(lng) y(lat ) sh (O D T S)  si(large large large large) fc(gs4 gs7 gs10 gs13)  legenda(on) legtitle("Opened in") )  legend(size( normal) pos(5)  region(fcolor(white)) symxsize(*0.5))
graph export "D:/下载/129581-V1/Kit/results/Fig1b.pdf", replace

**计量经济圈已调试,可以直接运行出结果,当然中间需要下载一些命令,比如gtools。

* Figure B-5

use "D:/下载/129581-V1/Kit/data/main_work", clear
keep pat_ID city_patent_library
duplicates drop
save "D:/下载/129581-V1/Kit/data/pat_ID_lib_city", replace

use "D:/下载/129581-V1/Kit/data/main_work", clear

gen b = .
gen se = .
gen number = .

egen yearID = group(yearsopen10)
gen post   = yearsopen10>=0
xi i.post*patent_lib, noomit
xtset identifier yearsopen10
cem pat_ID(#0) stateid(#0) $matched, treatment(treated)
drop if cem_matched==0
eststo r0: reg pat_pop_distance _IposXpaten_1 post  patent_lib i.yearID2 [aweight=cem_weights],  cluster(pat_ID) 

levelsof(pat_ID), local(pat)
local i = 1
foreach x in `pat' {
eststo r0: xtreg pat_pop_distance _IposXpaten_1 post  patent_lib i.yearID2 [aweight=cem_weights] if pat_ID!=`x', fe cluster(pat_ID) 
replace b = _b[_IposXpaten_1] in `i'
replace se = _se[_IposXpaten_1] in `i'
replace number = `x' in `i'
local i = `i'+1
}
sort b
keep b se number
ren number pat_ID 
drop if pat_ID==.
joinby pat_ID using "data\pat_ID_lib_city"
replace city_patent_library = proper(city_patent_library)
gen upper = b+1.68*se
gen lower = b-1.68*se
set scheme lean1, perm
drop pat_ID
sort b
gen pat_ID=_n

labmask pat_ID, values(city_patent_library) // take over value label
twoway (scatter b pat_ID ,color(edkblue)) (rcap upper lower pat_ID,color(edkblue) ), yline(0) yscale(range(0 6)) ylabel(0(1)6) ytitle(Coefficient) legend(off) xtitle("") xlabel(1(1)45, valuelabel angle(90)) ytitle(Coefficient dropping one library)
graph export "D:/下载/129581-V1/Kit/results/FigB5.pdf", replace 
erase "data\pat_ID_lib_city.dta"

*完整版数据和代码可以直接前往社群下载。
关于多期DID或交叠DID: 1.DID相关前沿问题“政策交错执行+堆叠DID+事件研究”, 附完整slides,2.交错(渐进)DID中, 用TWFE估计处理效应的问题, 及Bacon分解识别估计偏误,3.典范! 这篇AER在一图表里用了所有DID最新进展方法, 审稿人直接服了!4.最新Sun和Abraham(2020)和TWFE估计多期或交错DID并绘图展示结果!详细解读code!5.多期DID或渐进DID或交叠DID, 最新Stata执行命令整理如下供大家学习,6.多期DID前沿方法大讨论, e.g., 进入-退出型DID, 异质性和动态性处理效应DID, 基期选择问题等,7.交叠DID中平行趋势检验, 事件研究图绘制, 安慰剂检验的保姆级程序指南!8.欣慰! 营养午餐计划终于登上TOP5! 交叠DID+异质性稳健DID!9.用事件研究法开展政策评估的过程, 手把手教学文章!10.从双重差分法到事件研究法, 双重差分滥用与需要注意的问题,11.系统梳理DID最新进展: 从多期DID的潜在问题到当前主流解决方法和代码! 12.标准DID中的平行趋势检验,动态效应, 安慰剂检验, 预期效应教程,13.DID从经典到前沿方法的保姆级教程, 释放最完整数据和代码!
下面这些短链接文章属于合集,可以收藏起来阅读,不然以后都找不到了。

7年,计量经济圈近2000篇不重类计量文章,

可直接在公众号菜单栏搜索任何计量相关问题,

Econometrics Circle




数据系列空间矩阵 | 工企数据 | PM2.5 | 市场化指数 | CO2数据 |  夜间灯光 官员方言  | 微观数据 | 内部数据
计量系列匹配方法 | 内生性 | 工具变量 | DID | 面板数据 | 常用TOOL | 中介调节 | 时间序列 | RDD断点 | 合成控制 | 200篇合辑 | 因果识别 | 社会网络 | 空间DID
数据处理Stata | R | Python | 缺失值 | CHIP/ CHNS/CHARLS/CFPS/CGSS等 |
干货系列能源环境 | 效率研究 | 空间计量 | 国际经贸 | 计量软件 | 商科研究 | 机器学习 | SSCI | CSSCI | SSCI查询 | 名家经验
计量经济圈组织了一个计量社群,有如下特征:热情互助最多前沿趋势最多、社科资料最多、社科数据最多、科研牛人最多、海外名校最多。因此,建议积极进取和有强烈研习激情的中青年学者到社群交流探讨,始终坚信优秀通过感染优秀而互相成就彼此。


计量经济圈
凡是搞计量经济的,都关注这个号了。
 最新文章