• Index

工业企业数据库匹配的例子

Reads: 14674 Edit

1 数据说明

工业企业数据进行微观经济行为研究的重要数据集,但工业企业数据库每年包含几十万的数据,处理起来较为复杂。Stata则可以较为灵活的对工业企业数据库进行操作和处理。这里我们对2011年、2012年和2013年三年的工业企业数据库进行匹配,将其转换为面板数据类型。更长时间段的工业企业数据库匹配与之类似!

2 预处理

在进行匹配前,需要将2011年、2012年和2013年的工业企业数据先保存为Stata格式。例子2011至2013年的工业企业数据分别保存为m2011.dta、m2012.dta、m2013.dta文件,然后通过Stata16的do文件对数据进行匹配操作!

工业企业数据库中变量非常多,而且相同变量在不同年份的变量名不一致,为了方便匹配,需要将所有变量名改为英文字母名称。

3 处理过程

匹配需要的数据文件(m2011.dta、m2012.dta、m2013.dta)、匹配的do文件,以及变量英文名对照表放在页面最下方,且已经调试好,采用Stata16可以直接运行!

工业企业数据库匹配的do文件:

/// 步骤一、数据匹配前的准备工作
cd D:\Desktop\firmdata          //切换到m2011.dta等数据文件所在位置

cls                             //清除结果窗口中的内容
clear                           //清除数据
set more off                    //关闭结果窗口中需要点击more才继续显示的功能

/// 步骤二、对m2011.dta等数据文件进行预处理
forvalues i = 2011/2013{               

		use "m`i'.dta",clear           //循环读取m2011.dta、m2012.dta、m2013.dta
		replace orco=upper(orco)
		recast str25 dnou, force       //设置dnou变量长度为25的字符串
		drop if orco==""               //删除orco变量的空值
		drop if dnou==""               //删除dnou变量的空值
		bysort orco : drop if _N>1     //删除orco变量的重复值
		bysort dnou : drop if _N>1     //删除orco变量的重复值
		foreach var of varlist *{  
		rename `var' `var'`i'          //将所有变量名按照年份加上后缀,如:2011年的orco变为orco2011,2012年的orco变为orco2012
	}  
	compress  
		saveold "m`i'.dta",replace     //重新保存数据文件
}        

///步骤三、根据法人代码匹配

forval i = 2011/2013{
		use "m`i'.dta",clear
		gen match_id=orco`i'          //生成用于匹配的变量match_id
		save "m`i'.ID.dta",replace    //将数据另外保存一份,名称为:m2011.ID.dta等
}

forval i = 2012/2013{
		use "m2011.ID.dta"                          //读取m2011.ID.dta中数据到stata,
		merge 1:1 match_id using "m`i'.ID.dta"      //循环用m2012.ID.dta、m2013.ID.dta的数据来匹配
		gen status_ID2011_`i' = _merge              //记录样本的匹配状况
		drop _merge
		save "m2011.ID.dta",replace                //将每次匹配后的数据保存到m2011.ID.dta文件
}
use "m2011.ID.dta",clear                          //重新打开m2011.ID.dta文件,(此时已经匹配完了)
save "merge.2011-2013.ID.dta",replace             //将m2011.ID.dta文件保存为merge.2011-2013.ID.dta文件

use "merge.2011-2013.ID.dta",clear
keep if status_ID2011_2013==3 & status_ID2011_2012==3    //保留连续匹配成功的样本
save "matched.2011-2013.ID.dta",replace                  //保存连续匹配成功的样本
use "merge.2011-2013.ID.dta",clear
drop if status_ID2011_2013==3 & status_ID2011_2012==3    //去掉能连续匹配成功的样本
save "unmatched.2011-2013.ID.dta",replace                //保存没有匹配成功的样本

///步骤四、对于未匹配成功的样本,继续采用法人名称进行匹配

forval i = 2011/2013{
		use "unmatched.2011-2013.ID.dta",clear        //读取根据法人代码未能成功匹配的样本(为了对这些样本重新采用法人名称进行匹配)      
		keep *`i'
		drop if dnou`i'=="" 
		gen match_name=dnou`i'           
		save "m`i'.NAME.dta",replace                 //循环保存为m2011.NAME.dta、m2012.NAME.dta、m2013.NAME.dta文件,为下一步匹配做好准备
}

forval i = 2012/2013{                                //下面过程于步骤三中的思路基本一致
		use "m2011.NAME.dta"
		merge 1:1 match_name using "m`i'.NAME.dta"
		gen status_NAME2011_`i' = _merge              
		drop _merge
		save "m2011.NAME.dta",replace
}
use "m2011.NAME.dta",clear
save "merge.2011-2013.NAME.dta",replace

use "merge.2011-2013.NAME.dta",clear
keep if status_NAME2011_2013==3 & status_NAME2011_2012==3 
save "matched.2011-2013.NAME.dta",replace

use "merge.2011-2013.NAME.dta",clear
drop if status_NAME2011_2013==3 & status_NAME2011_2012==3  
save "unmatched.2011-2013.NAME.dta",replace

///步骤五、对于未匹配成功的样本,继续采用电话号码进行匹配 (思路与步骤四相同,如果不需要这步可以省略)

forval i = 2011/2013{
		use "unmatched.2011-2013.NAME.dta",clear
		keep *`i'
		drop if fite==""
		gen match_phone=arco`i'+fite`i'  
		bysort match_phone : drop if _N>1
		save "m`i'.PHONE.dta",replace
}

forval i = 2012/2013{
		use "m2011.PHONE.dta"
		merge 1:1 match_phone using "m`i'.PHONE.dta"
		gen status_PHONE2011_`i' = _merge              
		drop _merge
		save "m2011.PHONE.dta",replace
}
use "m2011.PHONE.dta",clear
save "merge.2011-2013.PHONE.dta",replace

use "merge.2011-2013.PHONE.dta",clear
keep if status_PHONE2011_2013==3 & status_PHONE2011_2012==3 
save "matched.2011-2013.PHONE.dta",replace
use "merge.2011-2013.PHONE.dta",clear
drop if status_PHONE2011_2013==3 & status_PHONE2011_2012==3 
save "unmatched.2011-2013.PHONE.dta",replace

///步骤六、对于未匹配成功的样本,继续采用法人代表进行匹配 (思路与步骤四相同,如果不需要这步可以省略)

forval i = 2011/2013{
		use "unmatched.2011-2013.PHONE.dta",clear
		keep *`i'
		drop if lere`i'==""
		gen match_rep=arco`i'+substr(inco`i',1,3)+lere`i'  
		bysort match_rep : drop if _N>1
		save "m`i'.REP.dta",replace
}

forval i = 2012/2013{
		use "m2011.REP.dta"
		merge 1:1 match_rep using "m`i'.REP.dta"
		gen status_REP2011_`i' = _merge              
		drop _merge
		save "m2011.REP.dta",replace
}
use "m2011.REP.dta",clear
save "merge.2011-2013.REP.dta",replace

use "merge.2011-2013.REP.dta",clear
keep if status_REP2011_2013==3 & status_REP2011_2012==3 
save "matched.2011-2013.REP.dta",replace
use "merge.2011-2013.REP.dta",clear
drop if status_REP2011_2013==3 & status_REP2011_2012==3 
save "unmatched.2011-2013.REP.dta",replace

///步骤七、生成匹配后的平衡面板数据

use "matched.2011-2013.ID.dta",clear            //打开matched.2011-2013.ID.dta数据文件到stata内存
append using "matched.2011-2013.NAME.dta"       //将matched.2011-2013.NAME.dta数据文件添加到内存
append using "matched.2011-2013.PHONE.dta"      //将matched.2011-2013.PHONE.dta数据文件添加到内存
append using "matched.2011-2013.REP.dta"        //将matched.2011-2013.REP.dta数据文件添加到内存
save "balanced.2011-2013.dta",replace           //将上述4个匹配成功的数据文件保存为balanced.2011-2013.dta文件(最终的匹配结果之一)。

///步骤八、生成匹配后的非平衡面板数据

forval i = 2011/2013{
		use "unmatched.2011-2013.REP.dta",clear
		keep *`i'
		drop if orco`i'==""
		gen match_id=orco`i'  
		save "m`i'.RESIDUAL.dta",replace
}

forval i = 2012/2013{
		use "m2011.RESIDUAL.dta"
		merge 1:1 match_id using "m`i'.RESIDUAL.dta"
		drop _merge
		save "m2011.RESIDUAL.dta",replace
}
use "m2011.RESIDUAL.dta",clear
save "merge.2011-2013.RESIDUAL.dta",replace
use "balanced.2011-2013.dta",clear
append using "merge.2011-2013.RESIDUAL.dta"   //将未能匹配的样本数据添加到balanced.2011-2013.dta数据中,此时数据即包括匹配成功的数据,也包括没有匹配成功的数据。   
save "unbalanced.2011-2013.dta",replace       //将所有数据保存到unbalanced.2011-2013.dta文件(最终的匹配结果之二)。 

///步骤九、删除中间过程产生的数据文件

forval i = 2011/2013{
		//erase "m`i'.dta"  
		erase "m`i'.ID.dta"
		erase "m`i'.NAME.dta"
		erase "m`i'.PHONE.dta"
		erase "m`i'.REP.dta"
		erase "m`i'.RESIDUAL.dta"
}
erase "matched.2011-2013.ID.dta"
erase "matched.2011-2013.NAME.dta"
erase "matched.2011-2013.PHONE.dta"
erase "matched.2011-2013.REP.dta"

erase "unmatched.2011-2013.ID.dta"
erase "unmatched.2011-2013.NAME.dta"
erase "unmatched.2011-2013.PHONE.dta"
erase "unmatched.2011-2013.REP.dta"

erase "merge.2011-2013.ID.dta"
erase "merge.2011-2013.NAME.dta"
erase "merge.2011-2013.PHONE.dta"
erase "merge.2011-2013.REP.dta"
erase "merge.2011-2013.RESIDUAL.dta"

///步骤十、将数据转换为面板数据格式(主要用reshape命令来转换)。

drop extt2011 extt2012 extt2013
drop fanu2011 fanu2012 fanu2013
drop faen2011 faen2012 faen2013
tostring poco2012 poco2013,replace
tostring aglb2012,replace
destring rety2011,replace
destring coho2011,replace
destring affi2011,replace
destring opye2011,replace
drop match_name status_NAME2011_2012 status_NAME2011_2013 match_phone status_PHONE2011_2012 status_PHONE2011_2013 match_rep status_REP2011_2012 status_REP2011_2013
rename status_ID2011_2013 status_ID
destring opmo2011 bust2011 toasA2011 ioas2011 orty2011,replace

drop year2012

g id=_n
reshape long orco dnou lere addc addr arco fite poco mabaA mabaB mabaC inco aglb renb rety coho affi opye opmo bust toasA toasB ioas orty toca acre stoc fipr tofa fias acde dety tocl acpa tncl toli tooe paic stca coca corc perc hmtc forc opin mabi opco mabc btas mbts otbp saex mafe taxe trex unfu fiex inin inte asil icfv inve oppr suin nopi opee totp intp ecop vatt ipta opta indo isov exdv inta outa nvoe prov grou coun town stof raic rnic rale rnpd cadl rnca ntda rnnt ltaa rnlt ralo reno code name iatb fpat,i(id) j(year)

drop rnlt ralo reno

///步骤十一、删除不符合实际情况的数据
/*删除工业总产值、销售额、总资产、固定资产净值、固定资产合计、从业人数为负、小于零或缺失的企业*/
drop if (indo==0 | indo<0 ) 
drop if (isov==0 | isov<0 ) 
drop if (toasA==0 | toasA<0 ) 
drop if (tofa==0 | tofa<0 ) 
drop if (fias==0 | fias<0 ) 
drop if (nvoe==0 | nvoe<0 )		

/*剔除最大和最小的1%变量*/
egen p01=pctile(nvoe) ,p(1)
g temp=0
replace temp=1 if nvoe<=p01
bys id : egen x=total(temp)
drop if x>=1
drop p01 temp x

egen p99=pctile(nvoe) ,p(99)
g temp=0
replace temp=1 if nvoe>=p99
bys id : egen x=total(temp)
drop if x>=1
drop p99 temp x


获取案例数据,请关注微信公众号并回复:Stata_dt7


Comments

Make a comment

  • Index