谢谢sungmoo!
我再啰嗦一下:
数据为附件match4.dta,要求为试验组(即sp=1的样本,共106个)在对照组(sp=0,共1152个)中寻找配对样本,配对规则如下:
(1)同年度year。
(2)同行业ind。
(3)asset最接近,即对照组与试验组asset的差的绝对值最小。
(4)每个对照组观测值只能配对一次,不同年份之间也不能重复。比如,2004年sp=1的样本2001的配对样本为2002,则在余下的配对过程中不能再出现配对样本2002,哪怕是不同年份。
 
我的问题:
运行根据sungmoo改编的如下程序,
“year=2004,ind=C,sp=1,stkcd=2001”的配对样本为“year=2004,ind=C,sp=0,stkcd=2002”;“year=2007,ind=C,sp=1,stkcd=2196”的配对样本为“year=2007,ind=C,sp=0,stkcd=2002”,注意这里“sp=0,stkcd=2002”重复出现2次,不符合上述第(4)条规则。按规则,应该是在stkcd=2002以外的对照组中寻找与“year=2007,ind=C,sp=1,stkcd=2196”asset最接近的配对样本。该怎样修正程序呢?
 
use match4,clear
set more off 
 
bys year ind sp (stkcd): g exp=_n if sp
bys year ind:egen s=max(exp)
drop if s==.
expandcl s if !sp,cl(year stkcd) gen(g)
 
bys year stkcd: replace exp=_n if !sp
bys year ind exp: egen r=sum(asset*sp)
g q=abs((asset-r)/r) if !sp
 
su exp
loc m=r(max)
forv i=1/`m'{
bys year ind sp (q exp stkcd): g exps=exp[`i'] if !sp
bys year ind sp (q exp stkcd): g stkcds=stkcd[`i'] if !sp
bys year ind sp (q exp stkcd): replace q=. if exp==exps&_n>`i'
bys year ind sp (q exp stkcd): replace q=. if stkcd==stkcds&_n>`i'
drop exps stkcds
}
drop if q==.&!sp
 
bys year ind exp: egen u=min(q) if !sp
drop if u!=q&!sp
egen mat=group(year ind exp)
drop exp-u
sort mat sp