楼主: 不二老三
17980 36

[学习心得] 《工业企业数据库》匹配:(二)生成平衡面板   [推广有奖]

本科生

79%

还不是VIP/贵宾

-

威望
0
论坛币
1490 个
通用积分
28.0763
学术水平
32 点
热心指数
35 点
信用等级
26 点
经验
2547 点
帖子
54
精华
0
在线时间
134 小时
注册时间
2015-6-5
最后登录
2022-3-24

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
生成平衡面板数据的代码如下,该文档被命名为balance match.do
匹配完成后可以得到连续两年的平衡面板(1998-1999,1999-2000,...,2005-2006),连续三年的平衡面板(1998-2000,1999-2001,...,2004-2006),...,连续九年的平衡面板(1998-2006)。


*生成连续2年,3年,...,9年的平衡面板

cls
clear
set more off

cd "/Users/youwang/Desktop/FIRM"  
qui do "my preprocess"
**------------------------------------------------------------------------------
*                      PART1:根据法人代码匹配   ID
**------------------------------------------------------------------------------        
*以法人代码为匹配变量对数据集进行匹配,本部分匹配和其他各部分的匹配独立

forval i = 1998/2006{
        use "m`i'.dta",clear
        gen match_id=id`i'              
        gen match_name=name`i'
        gen match_phone=substr(dq`i',1,4)+substr(phone`i',-7,7)
        gen match_rep=substr(dq`i',1,4)+substr(nic`i',1,3)+corp_representive`i'
        save "m`i'.ID.dta",replace    //保存用于匹配的样本
}
forval i = 1998/2006{  
    use "m`i'.ID.dta",clear  
    des,short     //简单描述即将用于匹配的数据集
}
*连续两年匹配
forval i = 1998/2005{
        local j=`i'+1
        use "m`i'.ID.dta",clear
        merge 1:1 match_id using "m`j'.ID.dta"
        keep if _merge==3
        gen status_ID`i'_`j' = _merge
        drop _merge
        save "matched2year.`i'-`j'.ID.dta",replace //保存连续两年匹配成功的样本
}        
*连续j年匹配,j=3,4,...,9
forval j = 3/9{
        local y=2007-`j'
        forval i = 1998/`y'{
                local j0=`j'-1
                local k=`i'+`j0'-1
                local t=`k'+1
                use "matched`j0'year.`i'-`k'.ID.dta",clear
                merge 1:1 match_id using "m`t'.ID.dta"
                keep if _merge==3           //保存连续j年匹配成功的样本(j=3,4,...,9)
                gen status_ID`i'_`t' = _merge
                drop _merge
                save "matched`j'year.`i'-`t'.ID.dta",replace
        }
}
**------------------------------------------------------------------------------
*                       PART2:根据法人名称匹配      NAME
**------------------------------------------------------------------------------
*以法人名称为匹配变量对数据集进行匹配,本部分匹配和其他各部分的匹配独立

forval i = 1998/2006{
        use "m`i'.dta",clear
        gen match_id=id`i'              
        gen match_name=name`i'
        gen match_phone=substr(dq`i',1,4)+substr(phone`i',-7,7)
        gen match_rep=substr(dq`i',1,4)+substr(nic`i',1,3)+corp_representive`i'
        bysort match_name : drop if _N>1  //剔除match_name重复的样本
        save "m`i'.NAME.dta",replace    //保存用于匹配的样本
}
forval i = 1998/2006{  
    use "m`i'.NAME.dta",clear  
    des,short     //简单描述下即将用于匹配的数据集
}
*连续两年匹配
forval i = 1998/2005{
        local j=`i'+1
        use "m`i'.NAME.dta",clear
        merge 1:1 match_name using "m`j'.NAME.dta"
        keep if _merge==3
        gen status_NAME`i'_`j' = _merge
        drop _merge
        save "matched2year.`i'-`j'.NAME.dta",replace //保存连续两年匹配成功的样本
}        
*连续j年匹配,j=3,4,...,9
forval j = 3/9{
        local y=2007-`j'
        forval i = 1998/`y'{
                local j0=`j'-1
                local k=`i'+`j0'-1
                local t=`k'+1
                use "matched`j0'year.`i'-`k'.NAME.dta",clear
                merge 1:1 match_name using "m`t'.NAME.dta"
                keep if _merge==3          //保存连续j年匹配成功的样本(j=3,4,...,9)
                gen status_NAME`i'_`t' = _merge        
                drop _merge
                save "matched`j'year.`i'-`t'.NAME.dta",replace
        }
}
**------------------------------------------------------------------------------
*                       PART3:根据电话号码匹配      PHONE
**------------------------------------------------------------------------------
*以电话号码为匹配变量对数据集进行匹配,本部分匹配和其他各部分的匹配独立

*说明:各年统计的电话号码格式不尽相同,有的年份将电话号码和长途区号一并统计,有
*的年份将电话号码和长途区号分开统计。电话号码的位数也不完全相同,有的企业用手机
*号代替电话号码,有的企业电话号码(不含长途区号)只有7位,而有的企业的电话号码
*(不含长途区号)却有8位。为了便于匹配且保证电话号码与企业一一对应,我们用“电话
*号码后七位+地区代码前六位+行业代码”构建新的匹配代码。2000-2003年,地区代码为省
*地县码,只有六位数;2004-20012年,地区代码为行政区代码,有十二位数。行政区代码=
*省地县码(六位数)+乡村码(六位数)。

forval i = 1998/2006{
        use "m`i'.dta",clear
        gen match_id=id`i'              
        gen match_name=name`i'
        gen match_phone=substr(dq`i',1,4)+substr(phone`i',-7,7)
        gen match_rep=substr(dq`i',1,4)+substr(nic`i',1,3)+corp_representive`i'
        bysort match_phone : drop if _N>1  //剔除match_phone重复的样本
        save "m`i'.PHONE.dta",replace    //保存用于匹配的样本
}
forval i = 1998/2006{  
    use "m`i'.PHONE.dta",clear  
    des,short     //简单描述下即将用于匹配的数据集
}
*连续两年匹配
forval i = 1998/2005{
        local j=`i'+1
        use "m`i'.PHONE.dta",clear
        merge 1:1 match_phone using "m`j'.PHONE.dta"
        keep if _merge==3
        gen status_PHONE`i'_`j' = _merge
        drop _merge
        save "matched2year.`i'-`j'.PHONE.dta",replace //保存连续两年匹配成功的样本
}        
*连续j年匹配,j=3,4,...,13
forval j = 3/13{
        local y=2007-`j'
        forval i = 1998/`y'{
                local j0=`j'-1
                local k=`i'+`j0'-1
                local t=`k'+1
                use "matched`j0'year.`i'-`k'.PHONE.dta",clear
                merge 1:1 match_phone using "m`t'.PHONE.dta"
                keep if _merge==3     
                gen status_PHONE`i'_`t' = _merge
                drop _merge
                save "matched`j'year.`i'-`t'.PHONE.dta",replace
        }
}
**------------------------------------------------------------------------------
*                       PART4:根据法人代表进行匹配      REP
**------------------------------------------------------------------------------
*以法人代表为匹配变量对数据集进行匹配,本部分匹配和其他各部分的匹配独立

*说明:不同企业存在同名法人代表的情形可能存在,为了解决这个问题,我们在法人代表的前面加上地区代码
*的前四位(代表企业所处的地区)和行业分类码的前三位(代表企业所处的中类)和企业的主要产品,生成新
*法人代表。

forval i = 1998/2006{
        use "m`i'.dta",clear
        gen match_id=id`i'              
        gen match_name=name`i'
        gen match_phone=substr(dq`i',1,4)+substr(phone`i',-7,7)
        gen match_rep=substr(dq`i',1,4)+substr(nic`i',1,3)+corp_representive`i'
        bysort match_rep : drop if _N>1  //剔除match_phone重复的样本
        save "m`i'.REP.dta",replace    //保存用于匹配的样本
}
forval i = 1998/2006{  
    use "m`i'.REP.dta",clear  
    des,short     //简单描述下即将用于匹配的数据集
}
*连续两年匹配
forval i = 1998/2005{
        local j=`i'+1
        use "m`i'.REP.dta",clear
        merge 1:1 match_rep using "m`j'.REP.dta"
        keep if _merge==3
        gen status_REP`i'_`j' = _merge
        drop _merge
        save "matched2year.`i'-`j'.REP.dta",replace //保存连续两年匹配成功的样本
}        
*连续j年匹配,j=3,4,...,13
forval j = 3/13{
        local y=2007-`j'
        forval i = 1998/`y'{
                local j0=`j'-1
                local k=`i'+`j0'-1
                local t=`k'+1
                use "matched`j0'year.`i'-`k'.REP.dta",clear
                merge 1:1 match_rep using "m`t'.REP.dta"
                keep if _merge==3     
                gen status_REP`i'_`t' = _merge
                drop _merge
                save "matched`j'year.`i'-`t'.REP.dta",replace
        }
}
**------------------------------------------------------------------------------
*                       PART5:生成平衡面板(连续2年,3年,...,9年)     
**------------------------------------------------------------------------------
forval j = 2/9{
        local y=2007-`j'
        forval i = 1998/`y'{
                local k=`i'+`j'-1
        use "matched`j'year.`i'-`k'.ID.dta"
        append using "matched`j'year.`i'-`k'.NAME.dta"
        append using "matched`j'year.`i'-`k'.PHONE.dta"
        append using "matched`j'year.`i'-`k'.REP.dta"
        bysort match_id : drop if _n>1
        bysort match_name : drop if _n>1
        bysort match_phone : drop if _n>1
        bysort match_rep : drop if _n>1
        save "balanced`j'year.`i'-`k'.ALL.dta",replace        
        }
}




二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝


已有 1 人评分学术水平 热心指数 信用等级 收起 理由
Sunknownay + 3 + 3 + 3 精彩帖子

总评分: 学术水平 + 3  热心指数 + 3  信用等级 + 3   查看全部评分

本帖被以下文库推荐

沙发
zhengqingchun 发表于 2018-8-13 11:28:32 |只看作者 |坛友微信交流群
给点一个大大的赞!

使用道具

藤椅
wat1231994 发表于 2018-8-20 21:27:42 |只看作者 |坛友微信交流群
楼主你好  根据ID匹配时,连续j年匹配,j=3,4,...,9    为什么根据电话号码、法人代表进行匹配时,连续j年匹配,j=3,4,...,9

使用道具

板凳
薄乐 发表于 2018-10-12 09:27:30 |只看作者 |坛友微信交流群
同问,楼主,您前面part1和part2根据法人代码匹配、根据法人名称匹配的“连续j年匹配”,j=3,4,...,9; 但后面part4和part5根据电话号码匹配和根据法人代表匹配的“连续j年匹配”,j=3,4,...,13,请问这是为什么呢?

使用道具

报纸
Echoeve 发表于 2018-12-19 13:37:34 |只看作者 |坛友微信交流群
感谢楼主 祝楼主学业有成 一切顺利

使用道具

地板
langmochang 发表于 2018-12-21 13:03:20 |只看作者 |坛友微信交流群
感谢楼主,楼主活雷锋啊

使用道具

7
windtalker312 发表于 2019-1-2 21:11:00 |只看作者 |坛友微信交流群
谢谢楼主分享

使用道具

8
paul0212 发表于 2019-1-8 17:14:55 |只看作者 |坛友微信交流群
薄乐 发表于 2018-10-12 09:27
同问,楼主,您前面part1和part2根据法人代码匹配、根据法人名称匹配的“连续j年匹配”,j=3,4,...,9; 但后 ...
应该是打错了,但其实并没有影响

使用道具

9
sohji 发表于 2019-1-18 10:36:35 |只看作者 |坛友微信交流群

工业企业数据库匹配命令

楼主你好,我还有个问题想问下对于forval i = 1998/2006{
        use "m`i'.dta",clear
        gen match_id=id`i'              
        gen match_name=name`i'  比如使用了1998年的数据,在生成这两个变量的时候显示不存在id1998和name1998这两个变量。我是不是要把原来的这两个变量id和name先定义为id1998和name1998呢。以后的每个年份的数据是否也要将变量做类似的重新命名呢?


To approve a single suggestion, mouse over it and click "✔"
Click the bubble to approve all of its suggestions.

使用道具

10
sohji 发表于 2019-1-18 10:45:48 |只看作者 |坛友微信交流群
langmochang 发表于 2018-12-21 13:03
感谢楼主,楼主活雷锋啊
你好,这个问题能否帮我解释一下呢?   对于forval i = 1998/2006{
        use "m`i'.dta",clear
        gen match_id=id`i'              
        gen match_name=name`i'  比如使用了1998年的数据,在生成这两个变量的时候显示不存在id1998和name1998这两个变量。我是不是要把原来的这两个变量id和name先定义为id1998和name1998呢。以后的每个年份的数据是否也要将变量做类似的重新命名呢?

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注jltj
拉您入交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-20 10:49