匹配样本的程序主要来自于下面这篇文献:

Brandt, L., et al. (2012). "Creative accounting or creative destruction? Firm-level productivity growth in Chinese manufacturing."Journal of Development Economic 97(2): 339-351.

作者公开了自己的代码,下载链接地址:http://feb.kuleuven.be/public/n07057/China/

其中一部分就是匹配样本,这里算是记录了自己对作者程序的注解。

样本匹配问题的由来:
对于一个多年企业数据来说,整理数据的第一步就是构建一个以企业ID和年份作为两维的面板数据。这通常并不是个问题,但对于中国工业企业数据库来说确是一个非常棘手的问题。因为在该数据库中,难以找到一个识别每一个样本企业的唯一特征来进行编码。通常的做法是,根据企业代码、企业名称、法人代表姓名、地址、邮编、电话、行业代码、主要产品名称、开业时间等基本信息来识别不同的样本点是否来自于同一家企业。但是因为这些基本信息在申报时并没有统一格式,在缺乏有效的智能模糊匹配手段的情况下,精确匹配的可操作性不强。这其中,企业代码和企业名称的准确性相对较高,可以作为我们进行匹配所依据的主要信息,比如Brandt 等(2012)就是先根据相同的企业代码识别同一家企业,然后再根据相同的企业名称进行识别,最后再参考其他信息。这种贯序识别法嘉定企业代码的准确性最高,企业名称准确性次之,也就是说共享同一企业代码的样本点必然被识别为同一企业,反过来,被识别为统一企业的样本点可能拥有不同的企业代码。在本数据库中,不但存在统一企业更改企业代码的情况(例如发生改制或者重组之后),更重要的是,还存在不同的企业共享企业代码的情况(可能是统计错误)。企业名称这一变量也存在类似问题。很多企业在改制、重组或者扩张时更改了企业名称。例如,中国有不少企业先是叫“XX厂”,然后改名叫“XX有限责任公司”,接着又叫“XX股份有限公司”。有时企业名称中的地理位置也略有差异,例如从“XX市机电厂”变成“XX机电厂”。如果按照企业名称进行精确匹配会错误地识别出“过多”的企业。
Stata程序
第一部分,从预处理的数据中保留下基本的用于match的变量。包括:法人代码、企业名称、法人、地址、省份等等信息。分别保存为m1998.dta~m2007.dta。
clear all
set more offglobal PATH "/Volumes/TOSHIBA EXT/Projects/NBS/China Industry Business Performance Data/Match Over Years"
cd "$PATH"******************************************************************************
* Part 1
* Befor run this do-file, orignial_1998.dta ~ original_2007 must be already
* generated. Whic means that do-files 1998.do ~ 2007.do have already been
* runned.
*
* Generate a id variable (id_in_source) for further combining data set
* after match over years.
*
* Only keep match variables and id_in_source for the next steps
*****************************************************************************forvalues i = 1998/2007{disp "File `i'"use `"../original_`i'.dta"',clear
*   gen id_in_source = _nif `i'==2003{gen town = address}gen cic = cic_adjreplace cic = real(industry_code) if cic == ./*if year <2003{gen cic = cic_adj}else{gen cic = cic03}*/if year<2004{gen revenue = sales_revenue}else{gen revenue = operating_revenue}gen profit = total_profitif year ==1999 | year == 2002{gen employment = staff}keep id_in_source firm_id firm_name legal_person town province ///telephone zip product1 founding_year cic region_code revenue ///employment profitdestring founding_year revenue employment profit,replace forcetostring cic,replace format(%04.0f)rename firm_id idrename firm_name namerename founding_year bdatrename region_code dqrename product1 product1_rename telephone phoneforeach var of varlist *{rename `var' `var'`i'}compresssaveold m`i'.dta,replace
}

第二部分,跨期匹配样本。

步骤1. 匹配连续两年的数据(1998-1999;1999-2000;...)
1.把id中的小写字母全部转换为大写。
forval i =1998/2007{use m`i'.dta,clearreplace id`i' = strupper(id`i')compresssaveold m`i'.10.dta,replace
}
forval i =1998/2007{use m`i'.10.dta,cleardes,short
}

2.使用循环,匹配连续两年之间的数据。loca i 代表当年年份,local j=i+1 代表未来一年。

Step 10.  根据法人代码 firm_id 匹配。

   *deal with duplicates of IDs (There are a few firms that have same IDs)disp "Step 10 "use m`i'.10.dta,clearbysort id`i': keep if _N>1compresssaveold duplicates_ID`i'.dta,replaceuse m`i'.10.dta,clearbysort id`i': drop if _N>1rename id`i' idsort idkeep *`i' idcompresssaveold match`i'.1.dta,replaceuse m`j'.10.dta,clearbysort id`j': keep if _N>1compresssaveold duplicates_ID`j'.dta,replaceuse m`j'.10.dta,clearbysort id`j': drop if _N>1rename id`j' idkeep *`j' idsort idcompresssaveold match`j'.1.dta,replaceuse match`i'.1.dta,clearmerge 1:1 id using match`j'.1.dtakeep if _m==3gen id`i' = idrename id id`j'drop _mergegen match_method_`i'_`j'="ID"gen match_status_`i'_`j'="3"compresssaveold matched_by_ID`i'_`j'.dta,replace

匹配后生成三类文件:

duplicates_ID`i'.dta; duplicates_ID`j'.dta - 同一年内,多个企业共用同一id的企业文件;

match`i'.1.dta; match`j'.1.dta - 不存在多个企业共用同一id的企业文件,用于 连续两年之间的merge

matched_by_ID`i'_`j'.dta - match`i'.1.dta和 match`j'.1.dta merge之后 _m == 3 即利用id匹配成功的记录;

*另外 step10之后可以注意到没有匹配成功的记录并不包括在上述三类文件中,在后续合并步骤中这些记录还会被重新匹配。

Step20 利用 firmname 继续匹配Step10中未匹配的记录。

   **step20: match by firm names***match those unmatched firms in previous step by firm names*disp "Step 20 "    use match`i'.1.dta,clearmerge 1:1 id using match`j'.1.dtakeep if _m==1rename id id`i'append using duplicates_ID`i'.dtabysort name`i': keep if _N>1keep *`i'compresssaveold duplicates_name`i'.dta,replaceuse match`i'.1.dta,clearmerge 1:1 id using match`j'.1.dtakeep if _m==1rename id id`i'append using duplicates_ID`i'.dtabysort name`i': drop if _N>1rename name`i' namesort namekeep *`i' namecompresssaveold unmatched_by_ID`i'.dta,replaceuse match`i'.1.dta,clearmerge 1:1 id using match`j'.1.dtakeep if _m==2rename id id`j'append using duplicates_ID`j'.dtabysort name`j': keep if _N>1keep *`j'compresssaveold duplicates_name`j'.dta,replace use match`i'.1.dta,clearmerge 1:1 id using match`j'.1.dtakeep if _m==2rename id id`j'append using duplicates_ID`j'.dtabysort name`j': drop if _N>1rename name`j' namesort namekeep *`j' namecompresssaveold unmatched_by_ID`j'.dta,replaceuse unmatched_by_ID`i'.dta,clearmerge 1:1 name using unmatched_by_ID`j'.dtakeep if _m==3gen name`i' = namerename name name`j'drop _mgen match_method_`i'_`j'="firm name"gen match_status_`i'_`j'="3"compresssaveold matched_by_name`i'_`j'.dta,replace

匹配之后生成三类文件

duplicates_name`i'.dta - Step10中合并失败_m==1的文件+duplicates_ID`i'.dta中的文件 append在一起之后,存在多个企业共享“企业名称”字段的记录。

duplicates_name`j'.dta - Step10中合并失败_m==2的文件+duplicates_ID`j'.dta中的文件 append在一起之后,存在多个企业共享“企业名称”字段的记录。

unmatched_by_ID`i'.dta - Step10中合并失败_m==1且不存在共享“企业名称”字段的记录,用于按照firm_name merge.

unmatched_by_ID`i'.dta - Step10中合并失败_m==2且不存在共享“企业名称”字段的记录,用于按照firm_name merge.

matched_by_name`i'_`j'.dta unmatched_by_ID`i'.dta 和 unmatched_by_ID`j'.dta merge 之后匹配成功的记录,即按照firm_name匹配成功。

*另外 step10之后可以注意到没有匹配成功的记录并不包括在上述三类文件中,也就是既不能按照id也不能按照name匹配成功的记录,在后续合并步骤中这些记录还会被重新匹配。

Step30 利用 法人 legal person 继续匹配Step10中未匹配的记录。

思路与Step10一致,同样生成了三类文件。

    disp "Step 30 "use unmatched_by_ID`i'.dta,clearmerge 1:1 name using unmatched_by_ID`j'.dtakeep if _m == 1rename name name`i'append using duplicates_name`i'.dtareplace legal_person`i' = "." if legal_person`i' == ""gen code1 = legal_person`i' + substr(dq`i',1,4)bysort code1: keep if _N>1keep *`i' compresssaveold duplicates_code1_`i'.dta,replaceuse unmatched_by_ID`i'.dta,clearmerge 1:1 name using unmatched_by_ID`j'.dtakeep if _m == 1rename name name`i'append using duplicates_name`i'.dtareplace legal_person`i' = "." if legal_person`i' == ""gen code1 = legal_person`i' + substr(dq`i',1,4)bysort code1: drop if _N>1sort code1keep code1 *`i'compresssaveold unmatched_by_ID_and_name`i'.dta,replaceuse unmatched_by_ID`i'.dta,clearmerge 1:1 name using unmatched_by_ID`j'.dtakeep if _m == 2rename name name`j'append using duplicates_name`j'.dta
*   replace legal_person`j' = "." if legal_person`j' == ""gen code1 = legal_person`j' + substr(dq`j',1,4)bysort code1: keep if _N>1keep *`j' compresssaveold duplicates_code1_`j'.dta,replace   use unmatched_by_ID`i'.dta,clearmerge 1:1 name using unmatched_by_ID`j'.dtakeep if _m == 2rename name name`j'append using duplicates_name`j'.dta
*   replace legal_person`j' = "." if legal_person`j' == ""gen code1 = legal_person`j' + substr(dq`j',1,4)bysort code1: drop if _N>1sort code1keep code1 *`j'compresssaveold unmatched_by_ID_and_name`j'.dta,replaceuse unmatched_by_ID_and_name`i'.dta,cleardisp _Nmerge 1:1 code1 using unmatched_by_ID_and_name`j'.dtakeep if _m==3drop _m code1gen match_method_`i'_`j' = "legal_person"gen match_status_`i'_`j' = "3"compresssaveold matched_by_legalperson`i'_`j'.dta,replace

此后,还继续使用了phone number 、foudingyear等信息,经过 Step40 Step50 Step60进一步匹配了信息。得到了如下几个文件:

matched_by_name`i'_`j'.dta
matched_by_legalperson`i'_`j'.dta
matched_by_phone`i'_`j'.dta
matched_by_code3_`i'_`j'.dta
unmatched_by_ID_and_name_and_legalperson_and_phone_and_code2`i'.dta
unmatched_by_ID_and_name_and_legalperson_and_phone_and_code2`j'.dta

将这六个文件合并,就得到了所有连续两年匹配后的样本

    disp "Step 60 "   use matched_by_ID`i'_`j'.dta,clearappend using matched_by_name`i'_`j'.dtaappend using matched_by_legalperson`i'_`j'.dtaappend using matched_by_phone`i'_`j'.dtaappend using matched_by_code3_`i'_`j'.dtaappend using unmatched_by_ID_and_name_and_legalperson_and_phone_and_code2`i'.dtaappend using unmatched_by_ID_and_name_and_legalperson_and_phone_and_code2`j'.dta    compresssaveold m`i'-m`j'.dta,replace   

匹配后的效果以m1998-m1999.dta为例:

这里只用开头的文件作为检查是不合适的,应该同时使用m2006-m2007.dta作为检查。

对比 Brandet(2012)中每年记录数目的表格:

可以验证合并过程没有问题,根据图1,1998年-1999年匹配的有140653条,未匹配成功1998年的共有24465条,相加刚好是165118条;其他年份的数据经检验后也是如此。至此,连续两年的跨期合并执行结束。

步骤2. 匹配连续三年的数据(1998-1999-2000;1999-2000-2001;...)

Step 70. 生成连续三年的平衡面板,并生成用于后续继续匹配的未匹配数据。年份用loca i, j, k 表示先后的连续三年。

  **Step 70: Create a three-year balanced sampledisp "Step 70 " use m`i'-m`j'.dta,clearkeep if match_status_`i'_`j' == "1"keep *`i'compresssaveold unmatched`i'.10.dta,replaceuse m`i'-m`j'.dta,cleardrop if match_status_`i'_`j' == "1"gen code = id`j'+string(revenue`j')+string(employment`j')+string(profit`j')+province`j'sort codecompresssaveold m`i'-m`j'.10.dta,replaceuse m`j'-m`k'.dta,clearkeep if match_status_`j'_`k' == "2"keep *`k'compresssaveold unmatched`k'.10.dta,replaceuse m`j'-m`k'.dta,cleardrop if match_status_`j'_`k' == "2"gen code = id`j'+string(revenue`j')+string(employment`j')+string(profit`j')+province`j'sort codecompresssaveold m`j'-m`k'.10.dta,replaceuse m`i'-m`j'.10.dta,clearmerge 1:1 code using m`j'-m`k'.10.dtadrop _m codekeep if match_status_`i'_`j'=="3" & match_status_`j'_`k'=="3"gen match_status_`i'_`k'="3"gen match_method_`i'_`k'="`j'"compresssaveold balanced.m`i'-m`j'-m`k'.dta,replace

执行之后生成了如下几类文件

unmatched`i'.10.dta - 来自于 m`i'-m`j'.dta 中,未成功匹配且仅在year i 中的记录。

m`i'-m`j'.10.dta - 来自于 m`i'-m`j'.dta中,包括成功匹配的和仅在year j中的记录。

unmatched`k'.10.dta - 来自于m`j'-m`k'.dta中,未成功匹配且仅在year k中的记录

m`j'-m`k'.10.dta - 来自于m`j'-m`k'.dta中,包括成功匹配和仅在year j中的记录

balanced.m`i'-m`j'-m`k'.dta - m`i'-m`j'.10.dta和m`j'-m`k'.10.dta merge之后,两边都match的记录,即连续三年均出现的记录。

Step 80. 生成未成功匹配的文件,用于后续的匹配。

Step 70 生成了连续三年的平衡面板数据,但还有部分记录未能match起来,这一部分就是提取出这部分数据以便用于进一步的匹配。

    **Step 80: Creat files for unmatched `i' firms and `k' firms**disp "Step 80"use m`i'-m`j'.10.dta,clearmerge 1:1 code using m`j'-m`k'.10.dtadrop _m codedrop if match_status_`i'_`j'=="3" & match_status_`j'_`k'=="3"drop if id`i'==""gen code = id`i'+string(revenue`i')+string(employment`i')+string(profit`i')+province`i'sort codecompresssaveold unmatched`i'.15.dta,replaceuse unmatched`i'.15.dta,clearkeep *`i' append using unmatched`i'.10.dtacompresssaveold unmatched`i'.20.dta,replaceuse m`i'-m`j'.10.dta,clearmerge 1:1 code using m`j'-m`k'.10.dtadrop _m codedrop if match_status_`i'_`j'=="3" & match_status_`j'_`k'=="3"drop if id`k'== ""gen code = id`k'+string(revenue`k')+string(employment`k')+string(profit`k')+province`k'sort codecompresssaveold unmatched`k'.15.dta,replaceuse unmatched`k'.15.dta,clearkeep *`k' append using unmatched`k'.10.dtacompresssaveold unmatched`k'.20.dta,replaceuse m`i'-m`j'.10.dta,clearmerge 1:1 code using m`j'-m`k'.10.dtadrop _m codedrop if match_status_`i'_`j'=="3" & match_status_`j'_`k'=="3"gen code = id`j'+string(revenue`j')+string(employment`j')+string(profit`j')+province`j'sort codecompresssaveold unmatched`j'.15.dta,replace

生成的各个文件的含义

unmatched`i'.15.dta - m`i'-m`j'.10.dta和m`j'-m`k'.10.dta merge之后不在平衡面板中且仅仅来自于year i的记录。

unmatched`i'.20.dta - unmatched`i'.15.dta 与 unmatched`i'.10.dta append起来的记录,其中 10.dta 是由Step70生成,表示 m`i'-m`j'.dta 中仅仅来自于year i 的记录。二者合并之后得到的就是目前为止所有来自于i的未能匹配的记录。

unmatched`k'.15.dta - 同unmatched`i'.15.dta

unmatched`k'.20.dta - 同unmatched`i'.20.dta

unmatched`j'.15.dta -  m`i'-m`j'.10.dta和m`j'-m`k'.10.dta merge之后 不在平衡面板中所有记录(与 以i, k为下表的同类文件相比,由于这次merge肯定是完全merge,因此所有都是“无法按照j进行match的记录”,但显然这样存在一定的重叠。后续在合并的时候会对这里的重叠部分进行处理)

Step90 对Step80中得到的未匹配数据(即不在三年平衡面板中的记录:ummatched`i'.20.dta,unmatched`k'.20.dta)进行再一次匹配,运用 firm_id 和firm_name 进行匹配。

匹配思路与构建两年平衡面板时对应的处理思路是完全一样的:先确定有否duplicates的现象,区分后分别merge

  **Step 90: Match `i' firms and `k' firms by firm ID and name***ID*disp "Step 90"use unmatched`i'.20.dta,clearbysort id`i': keep if _N>1compresssaveold duplicates_ID`i'.dta,replaceuse unmatched`i'.20.dta,clearbysort id`i': drop if _N>1rename id`i' idkeep *`i' idsort idcompresssaveold match`i'.1.dta,replaceuse unmatched`k'.20.dta,clearbysort id`k': keep if _N>1compresssaveold duplicates_ID`k'.dta,replaceuse unmatched`k'.20.dta,clearbysort id`k': drop if _N>1rename id`k' idkeep *`k' idsort idcompresssaveold match`k'.1.dta,replaceuse match`i'.1.dta,clearmerge 1:1 id using match`k'.1.dtakeep if _m==3gen id`i'=idrename id id`k'drop _mgen match_method_`i'_`k'="`j'"gen match_status_`i'_`k'="3"compresssaveold matched_by_ID`i'_`k'.dta,replace*name*use match`i'.1.dta, clearmerge 1:1 id using match`k'.1.dtakeep if _merge==1rename id id`i'append using duplicates_ID`i'.dtabysort name`i': keep if _N>1keep *`i'compresssaveold duplicates_name`i'.dta, replaceuse match`i'.1.dta, clearmerge 1:1 id using match`k'.1.dtakeep if _merge==1rename id id`i'append using duplicates_ID`i'.dtabysort name`i': drop if _N>1rename name`i' namesort namekeep name *`i'compresssaveold unmatched_by_ID`i'.dta, replaceuse match`i'.1.dta, clearmerge 1:1 id using match`k'.1.dtakeep if _merge==2rename id id`k'append using duplicates_ID`k'.dtabysort name`k': keep if _N>1keep *`k'compresssaveold duplicates_name`k'.dta, replaceuse match`i'.1.dta, clearmerge 1:1 id using match`k'.1.dtakeep if _merge==2rename id id`k'append using duplicates_ID`k'.dtabysort name`k': drop if _N>1rename name`k' namesort namekeep name *`k'compresssaveold unmatched_by_ID`k'.dta, replaceuse unmatched_by_ID`i'.dta, clearmerge 1:1 name using unmatched_by_ID`k'.dtakeep if _merge==3gen name`i'=namerename name name`k'drop _mergegen match_method_`i'_`k'="firm name"gen match_status_`i'_`k'="3"compresssaveold matched_by_name`i'_`k'.dta, replaceuse unmatched_by_ID`i'.dta, clearmerge 1:1 name using unmatched_by_ID`k'.dtakeep if _merge==1rename name name`i'keep *`i'append using duplicates_name`i'.dtagen match_method_`i'_`k'=""gen match_status_`i'_`k'="1"compresssaveold unmatched_by_ID_and_name_`i'.dta, replace  use unmatched_by_ID`i'.dta, clearmerge 1:1 name using unmatched_by_ID`k'.dtakeep if _merge==2rename name name`k'keep *`k'append using duplicates_name`k'.dtagen match_method_`i'_`k'=""gen match_status_`i'_`k'="2"compresssaveold unmatched_by_ID_and_name_`k'.dta, replace

执行之后得到了如下几个文件:

matched_by_ID`i'_`k'.dta, clear
matched_by_name`i'_`k'.dta
unmatched_by_ID_and_name_`i'.dta
unmatched_by_ID_and_name_`k'.dta

文件含义从名字上就已经很清楚。

Step 100 合并所有文件,处理冲突问题,生成连续三年的非平衡面板

   **step 100: merge the files**disp "Step 100"use matched_by_ID`i'_`k'.dta, clearappend using matched_by_name`i'_`k'.dtaappend using unmatched_by_ID_and_name_`i'.dtaappend using unmatched_by_ID_and_name_`k'.dtacompresssaveold m`i'-m`k'.dta, replaceuse m`i'-m`k'.dta, cleargen code = id`i'+string(revenue`i')+string(employment`i')+string(profit`i')+province`i'sort code*drop if code == "..."merge code using unmatched`i'.15.dtadrop code _mergesort id`i'compresscompresssaveold m`i'-m`k'.05.dta, replace*deal with disagreement (_merge==5 if "update" is used)*use m`i'-m`k'.05.dta, cleargen code = id`k'+string(revenue`k')+string(employment`k')+string(profit`k')+province`k'sort codemerge code using unmatched`k'.15.dta, updatekeep if _merge==5drop *`k'drop code _merge sort id`i'compresscompresssaveold m`i'-m`k'.disagree.dta, replaceuse m`i'-m`k'.05.dta, clearmerge id`i' using m`i'-m`k'.disagree.dtadrop if _merge==3drop _mergeappend using m`i'-m`k'.disagree.dtagen code = id`k'+string(revenue`k')+string(employment`k')+string(profit`k')+province`k'sort codemerge code using unmatched`k'.15.dta, updatedrop code _merge gen code = id`j'+string(revenue`j')+string(employment`j')+string(profit`j')+province`j'sort codemerge code using unmatched`j'.15.dta, updatedrop code _mergecompresssaveold m`i'-m`k'.dta.10.dta, replaceuse m`i'-m`k'.dta.10.dta, clearappend using balanced.m`i'-m`j'-m`k'.dtadrop match_status_`i'_`j'drop match_status_`j'_`k'drop match_status_`i'_`k'drop match_method_`i'_`j'drop match_method_`j'_`k'drop match_method_`i'_`k'gen match_status_`i'_`j'_`k'="`i'-`j'-`k'" if id`i'!=""&id`j'!=""&id`k'!=""replace match_status_`i'_`j'_`k'="`i'-`j' only" if id`i'!=""&id`j'!=""&id`k'==""replace match_status_`i'_`j'_`k'="`j'-`k' only" if id`i'==""&id`j'!=""&id`k'!=""replace match_status_`i'_`j'_`k'="`i'-`k' only" if id`i'!=""&id`j'==""&id`k'!=""replace match_status_`i'_`j'_`k'="`i' no match" if id`i'!=""&id`j'==""&id`k'==""replace match_status_`i'_`j'_`k'="`j' no match" if id`i'==""&id`j'!=""&id`k'==""replace match_status_`i'_`j'_`k'="`k' no match" if id`i'==""&id`j'==""&id`k'!=""compresssaveold unbalanced.`i'-`j'-`k'.dta, replace

执行完了之后 以unbalanced.1998-1999-2000.dta,检查匹配状况:

可以验证合并过程没有问题

*最初只用了unbalanced.1998-1999-2000.dta作为检查对象,没有用unbalanced.2005-2006-2007.dta 同时做检查,导致有一个小错误没有发现,所有检查应注意至少检测所有的情况。

第三部分,生成10年的非平衡面板。

首先,将1998-1999-2000的非平衡面板保存为test1.dta

use unbalanced.1998-1999-2000.dta, clear
tab match_status_1998_1999_2000
gen code=id2000+string(revenue2000)+string(employment2000)+string(profit2000)
sort code
save test1.dta, replace

Step 110. 将2011年的数据合并进来

**step 110: add 2001 from 1999-2000-2001**use unbalanced.1999-2000-2001.dta, clear
tab match_status_1999_2000_2001
keep if match_status_1999_2000_2001=="1999-2000-2001"|match_status_1999_2000_2001=="2000-2001 only"
gen code=id2000+string(revenue2000)+string(employment2000)+string(profit2000)
sort code
save test2.dta, replaceuse test1.dta, clear
merge code using test2.dta
tab _merge
drop _merge code
gen code=id1999+string(revenue1999)+string(employment1999)+string(profit1999)
sort code
save test3.dta, replaceuse unbalanced.1999-2000-2001.dta, clear
tab match_status_1999_2000_2001
keep if match_status_1999_2000_2001=="1999-2001 only"
gen code=id1999+string(revenue1999)+string(employment1999)+string(profit1999)
sort code
save test4.dta, replaceuse test3.dta, clear
merge code using test4.dta, update
tab _merge
drop code _merge
save test5.dta, replaceuse test3.dta, clear
merge code using test4.dta, update replace
keep if _merge==5
keep id2001 bdat2001 cic2001 dq2001 e_HMT2001 e_collective2001 e_foreign2001 e_individual2001 e_legal_person2001 e_state2001 employment2001 export2001  fa_net2001 fa_original2001 a_dep2001 c_dep2001 input2001    name2001 new_product2001 output2001 profit2001 revenue2001 type2001 va2001 wage2001 legal_person2001 phone2001 product1_2001 street2001 town2001 village2001 zip2001
save test6.dta, replaceuse unbalanced.1999-2000-2001.dta, clear
keep if match_status_1999_2000_2001=="2001 no match"
display _N
save test7.dta, replaceuse test5.dta, clear
append using test6.dta
dis _N
append using test7.dta
dis _N
gen code=id2001+string(revenue2001)+string(employment2001)+string(profit2001)
sort code
save test1.dta, replace

思路如下:

从 1999-2000-2001中挑选出 以2000年为合并基准的记录,保存为test2.dta

将test1.dta和test2.dta 依据 code2000 merge起来,存为test3

从 1999-2000-2001中挑选出 以1999年为合并基准的记录,保存为test4.dta

将test3.dta和test4.dta依据code1999 merge起来,存为test5.

将test3.dta和test4.dta依据code1999 merge起来,取值存在冲突的记录,存为test6. test3.dta和test4.dta中公共的部分是var2000-var2002。如果merge的时候这部分公共变量有不同,说明不是同一条,应作为两条数据处理。

将2001年未能匹配的记录存为test7.dta

append test5.dta, test6.dta, test7.dta。

随后,通过Step120将2002将2002合并进来,。。。,直到顺次将2007也合并进来,就得到了这样一个非平衡面板。

最后,通过下面的代码,得到面板和原始数据的对应关系

use "unbalanced.1998--2007.dta",clear
keep id_in_source*
gen id_in_panel=_n
reshape long id_in_source, i(id_in_panel) j(year)
drop if id_in_source == .
sort id_in_panel year
saveold "PanelID_1998-2007.dta",replace

转换后检查每一年的样本数量:

*由于数据库来源的问题,我使用的数据与Brandt(2012)的数据在某些年份上存在一定的误差。(主要是2004年,所用的数据来自于全国经济普查,这同时也导致了很多关键指标的缺失等问题)

至此,匹配程序处理完毕,完整版程序见另一篇博文: 工业企业数据库处理代码完整版本——2.匹配样本 。

工业企业数据库处理——2.匹配样本相关推荐

  1. 工业企业数据库匹配土地出让数据库(2000-2014年)

    1.数据来源:工业企业数据库,土地出让数据库,自主整理 2.时间跨度:2000-2014 3.区域范围:工业企业,地级市 4.指标说明:基于土地出让数据库,计算各地级市每年的土地出让面积及金额,后根据 ...

  2. 文献回顾 | 你还在这样使用工业企业数据库吗?

    你还在这样使用工业企业数据库吗? 编者按:本文根据聂辉华.江艇.杨汝岱三位学者的<中国工业企业数据库的使用现状与潜在问题>(世界经济,2012)总结而成. 众所周知的是,中国工业企业数据库 ...

  3. 数据改版 | CnOpenData中国工业企业基本信息扩展数据

    CnOpenData中国工业企业基本信息扩展数据 一.数据简介   拉动中国经济的三个产业中,工业企业占有特殊的地位,是推动国内经济发展的重要产业.工业是最主要的物质生产部门,为居民生活.各行业的经济 ...

  4. 数据优化 | CnOpenData中国工业企业专利及引用被引用数据

    中国工业企业专利及引用被引用数据 一.数据简介    国家统计局构建了1998-2013年所有规模以上工业企业的数据,包括全部国有企业和年主营业务收入500 万元及以上的非国有工业企业.可以说,这些企 ...

  5. CnOpenData中国工业企业基本信息扩展数据

    一.数据简介   拉动中国经济的三个产业中,工业企业占有特殊的地位,是推动国内经济发展的重要产业.工业是最主要的物质生产部门,为居民生活.各行业的经济活动提供物质产品,这一重要作用是其他任何产业部门都 ...

  6. 黄向东:工业物联网数据库 IoTDB及其应用

    本文约7200字,建议阅读15分钟 本文分享关于工业时序数据库IoTDB(全称Apache IoTDB)及它的一些应用. IoTDB源自清华大学软件学院.王院长带领团队从2011年开始关注,2014/ ...

  7. “清华数为”工业时序数据库IoTDB与DWF应用开发寒假师资培训圆满结束

    来源:数字技术学习中心本文约600字,建议阅读5分钟"清华数为"工业时序数据库IoTDB与基于DWF的大数据应用开发在线师资培训成功举办. 2021年1月21日至25日,大数据系统 ...

  8. 网易云发布“工业智能平台”,开放技术赋能工业企业

    4月25日,在2018年中国工业大数据大会(钱塘峰会)上,网易云首次发布整合集团技术和数据能力的"工业智能平台",该平台是网易在互联网+领域的重点战略布局,定位于帮助不同阶段的制造 ...

  9. 工业企业危险源管理和应急管理解决方案

    1 概述 对于存在重大危险源的工业企业,危险源管理和应急管理是非常重要的管理内容,但当前市场上缺乏这方面的解决方案.而且,当前的企业虽然很多具有报警系统,但是当建设危险源管理的时候,会遇到以下难题: ...

  10. 新库上线 | CnOpenData中国工业企业信息变更数据

    CnOpenData中国工业企业信息变更数据 一.数据简介    中国工业企业数据是学术界最常使用也最重要的经济数据之一,其由国家统计局建立,数据来自于样本企业提交给当地统计局的季报和年报汇总形成,覆 ...

最新文章

  1. curl php 空,直接访问链接有数据,CURL GET 一片空白
  2. 风变编程python第一关脸黑怪我喽_风变编程:Python适合编程初学者学习吗?
  3. suse linux标准c安装,suse linux安装cmake时ccmake没有安装上的原因
  4. php自定义中文分词方法,PHPAnalysis中文分词类详解
  5. mysql建表用的什么语句_mysql建表常用sql语句个人经验分享
  6. C和C++线性表的链式存储
  7. 38译码器数码管c语言代码,38译码器驱动数码管电路图
  8. linux socket epoll
  9. 在CentOS安装PHP5.6
  10. 香港科技大学计算机专业国内就业6,香港科技大学就业好吗?
  11. Java网络编程总结
  12. 源泉书签支持批量删除功能啦
  13. 两个字节合并成一个16位short类型
  14. dw网页制作的基本步骤_dreamweaver制作网页详细步骤(设计网站首页)
  15. 纯css单击事件,纯css实现点击事件
  16. 当老鼠拥有“鹰眼”,人类世界会发生什么变化?
  17. CHD5.3.6在线安装和维护踩坑指南
  18. 学会python,妈妈再也不用担心我乱花钱了!
  19. labview--VIPM(VI package manager)打开后闪退
  20. 微信JS-SDK的PHP demo页面,解决Internal error 500错误

热门文章

  1. 遗传算法python
  2. 破解vysor为专业版
  3. 此版本专旧版本为android,关于Android9.0 此应用专为旧版Android打造,因此可能无法正常运行。请尝试检查更新或与开发者联系...
  4. Axure中引入Echarts图表并制作元件库
  5. 李迅雷+老龄化下中青年人消费心态的变化的角度来看未来十倍股
  6. 电路分析实验一 Pspice编写电路程序并运行
  7. RPA机器人可以为工业制造业带来什么巨变
  8. Listary -- 高效率办公软件
  9. Oracle学习资料分享(含教程、笔记、题库下载与学习方法)
  10. Windows下IIS搭建Ftp服务器