如何仿照 Brandt 方法把工企数据匹配成面板?

之前给大家分享了一些关于工企数据库和其它的数据库匹配的结果。

由于使用的工企数据分成两个部分:1998~2013 年和 2014 年,其中 1998~2013 年的数据里面有组织机构代码、企业名称和企业匹配唯一标志码,而 2014 年的数据有企业名称、组织机构代码,但是没有企业匹配唯一标志码,所以不是很容易把两份数据合并成一个面板使用。

所以今天就介绍一下如何仿照 Brandt 方法把 2014 年的数据匹配到 1998~2013 年上并最终合并生成一个面板。

Brandt 方法的原始 do 代码可以从这里下载到:https://feb.kuleuven.be/public/u0044468/CHINA/appendix/

大致匹配方法是:

  1. Match by firm ID:根据组织机构代码进行匹配;
  2. Match by firm names:根据企业名称进行匹配;
  3. Match by the names of legal person representatives:根据法人代表名称进行匹配;
  4. Match by phone number + city code:根据电话号码 + 行政区划代码进行匹配;
  5. Match by code = founding year + geographic code + industry code + name of town + name of main product:根据成立年份 + 区划代码 + 行业代码 + 所处区县 + 主营业务进行匹配。

采用类似的思想,我们可以使用下面的标准把 2014 年的数据和之前的年份进行匹配:

  1. 根据组织机构代码匹配;
  2. 根据企业名称匹配;
  3. 根据法人代表姓名+行政区划+成立年份匹配(这里的逻辑是一个人在某个区县一年基本上只会成立一家公司);
  4. 根据电话号码+行政区划+成立年份匹配(这里的逻辑是同一个区县电话号码相同、成立年份也相同的只会是一家公司);
  5. 按照成立年份+省地县码+行业代码+县的名字+主营业务匹配(逻辑类似)。

实际上这里我们不需要用到任何匹配命令,直接使用上面的规则对 2014 年的企业匹配唯一标志码进行填补缺失值即可。下面我们来用 Stata 操作下:

首先合并 1998~2013 年的数据:

cd "~/Desktop/工企数据合并1998~2014"
use 1998gq, clear
forval y = 1999 / 2013 {
append using `y'gq
}
save gq9813, replace

由于数据太大,仅仅保留需要的变量:

use gq9813, clear
keep 年份 企业匹配唯一标识码 组织机构代码 企业名称 法定代表人 省地县码 gqid 开业成立时间年 固定电话 主要业务活动或主要产品1 行业小类代码 地区市州盟
save gq9813sim, replace

同样,2014 年的数据也仅仅保留这些变量:

use 2014gq, clear
keep 年份 组织机构代码 企业名称 法定代表人 省地县码 gqid 开业成立时间年 固定电话 主要业务活动或主要产品1 行业小类代码 地区市州盟
save 2014gqsim, replace

然后我们把 gq9813sim 和 2014gqsim 合并起来:

use gq9813sim, clear
append using 2014gqsim

结果报错了,报错信息:

variable 开业成立时间年 is int in master but str11 in using data
You could specify append's force option to ignore this numeric/string mismatch. The
using variable would then be treated as if it contained numeric missing value.
r(106);

也就是说 开业成立时间年 这个变量在 gq9813sim 数据里面是 int 型的,但是在 2014gqsim 里面是 str11(字符串)型的,所以我们需要提前把两个处理成一致的:

use gq9813sim, clear
tostring 开业成立时间年, replace
append using 2014gqsim

使用 compress 命令可以压缩数据节省内存:

compress
* 把所有的字符串显示格式改为 %10s
foreach i of varlist _all {
cap format `i' %10s
}

由于主要业务活动或主要产品1变量中存着很多看起来是空的字符,可以用下面的代码删除掉:

replace 主要业务活动或主要产品1 = subinstr(主要业务活动或主要产品1, " ", "", .)

这个时候我们就把 2014 年的数据和 98~13 年的数据 append 起来了,由于 98~13 年的数据里面有企业匹配唯一标志码变量、2014 年的没有,所以 append 之后的数据里面 2014 年的企业匹配唯一标志码变量是缺失的,下面我们就根据前面预想的五步规则进行填补。

首先查看 企业匹配唯一标识码 缺失的观测值数:

count if missing(企业匹配唯一标识码)
*> 309,138

这就是 2014 年的观测值数量,然后开始填补:

* 根据组织机构代码填补 企业匹配唯一标识码
replace 组织机构代码 = strlower(组织机构代码)
bysort 组织机构代码 (年份): carryforward 企业匹配唯一标识码 if !missing(组织机构代码), replace
* 根据企业名称填补 企业匹配唯一标识码
bysort 企业名称 (年份): carryforward 企业匹配唯一标识码 if !missing(企业名称), replace
* 根据法人代表姓名+行政区划+成立年份
bysort 法定代表人 省地县码 开业成立时间年 (年份): carryforward 企业匹配唯一标识码 if !missing(法定代表人) & !missing(省地县码) & !missing(开业成立时间年), replace
* 根据电话号码+行政区划+成立年份
bysort 固定电话 省地县码 开业成立时间年 (年份): carryforward 企业匹配唯一标识码 if !missing(固定电话) & !missing(省地县码) & !missing(开业成立时间年), replace
* 按照成立年份+省地县码+行业代码+县的名字+主营业务匹配
bysort 开业成立时间年 省地县码 行业小类代码 地区市州盟 主要业务活动或主要产品1 (年份): carryforward 企业匹配唯一标识码 if !missing(行业小类代码) & !missing(省地县码) & !missing(开业成立时间年) & !missing(地区市州盟) & !missing(主要业务活动或主要产品1), replace

填补之后还有这么多缺失的:

count if missing(企业匹配唯一标识码)
*> 68,205

剩余的企业匹配唯一标识码没有填补成功的视为新企业,可以用 gqid 临时填充一下:

tostring gqid, gen(sgqid) format(%10.0f) force
replace 企业匹配唯一标识码 = sgqid if missing(企业匹配唯一标识码)
compress

然后我们就可以根据企业匹配唯一标识码变量生成个体 id 了:

egen group = group(企业匹配唯一标识码)
* 每个个体每年应该只有一个观测值,删除掉重复的(也可以只要有重复就全部删除):
duplicates drop group 年份, force
xtset group 年份
drop sgqid
gsort 年份 企业匹配唯一标识码
save "1998~2014年工企面板数据.dta", replace

工企数据里面一共出现了 1075124 个企业:

unique group

这样就匹配得到了 1998~2014 年的工企面板数据。

点击这里跳转到 RStata 短书平台获取附件:如何仿照 Brandt 方法把工企数据匹配成面板?

评论