温馨提示: 定期 清理浏览器缓存,可以获得最佳浏览体验。
展金泳 (对外经济贸易大学, z_paper@126.com)
吴雄 (湘潭大学)
胡杰 (中山大学)
目录
与一般的数据不同,企业层面的贸易数据往往是高维的,例如我国海关数据库中的进出口数据一般为4维的:企业A在时间B出口(或进口)产品C到(从)国家D。在处理贸易数据的过程中笔者发现很多处理面板数据(相当于二维)的命令纷纷失效,有鉴于此,笔者希望能够对以往面板数据中的常用命令进行改造,以扩大其适用的范围。在本文中,笔者就通过对连玉君老师所编写的xtbalance进行完善(可能并不精确,暂时明名为tobalance),以使其能够完成高维数据中数据的处理。
功能简介:tobalance
在xtbalance
的基础上完善得到,主要用于将非平行面板转换成平行面板,二维数据中保留个体变量在选定时间范围内均存在观测值的样本,高维数据保留选定维度(低于最高维)在选定时间范围内均有观测的样本。
注意:在实证研究中并不强求一定要将非平行面板转换成平行面板,事实上大多数回归所用数据都是非平行的,转换平行数据主要应用一些特殊的模型,或者用于做稳健性检验,或者异质性分析(例如贸易数据中筛选连续出口企业的子样本)。
tobalance
并不是Stata内置的命令,需要安装才能进行使用。目前主要有以下安装途径:
tobalance.ado
和 tobalance.sthlp
文件,并按照 连享会-外部命令集 Plus 文件夹 以及 Stata: 外部命令的搜索、安装与使用 中的说明放置文件即可。ssc install tobalance
(目前尚未开通,待后期测试完成后方可使用)。tobalance
的语法格式: tobalance [, options]
其中option选项有idvar(varlist)、timevar(varlist)、range(numlist) 、miss(varlist)
四个选项,下面分别进行介绍。
idvar(varlist)、timevar(varlist)
表示保留个体变量(idvar
)在时间变量(timevar
)特定范围(range
)内都存在的观测值。idvar(varlist)、timevar(varlist)
成对出现,如果写要一起都写,如果不写则用前文设定面板数据中的个体变量与时间变量,如果没有填写并且前文也没有设定面板(xtset panelvar timevar
或 tsset panelvar timevar
)则会报错。idvar(varlist)
括号内可以书写一个或多个变量,当写一个变量时则是二维面板数据的处理,如果写多个变量时则是高维数据的处理;timevar(varlist)
里只能写一个变量,并且要与range(numlist)
的设定要对应。
range(numlist)
括号里为时间变量(timevar
)的取值范围。如果为连续时间,可以设置为tobalance, range(2001 2008)
,表示将前面设定的面板数据转换为2001-2008年八年间的平行面板。如果为非连续时间,可以设置为balance, range(2001/2003, 2005, 2007/2010)
表示将前面设定的面板数据转换为2001-2003(三年),2005(一年), 2007-2010(四年)共8年的平行面板。时间的设定不要求按从小到大或者从大到小的顺序书写,任意顺序均可。
miss(varlist)
括号里为变量列表,可以写一个或多个变量,表示再删除选定变量的缺省值后再进行平行面板的转换。
设定案例:balance, var(firm year) range(2001 2008)
表示保留2001-2008年8年间企业均存在出口行为的样本,前面不需要用 xtset
或 tsset
设定面板,其等同于xtset firm year
加 balance, range(2001 2008)
。balance, var(firm product year) range(2001 2008)
表示保留2001-2008年8年间企业-产品组均存在出口行为的样本。balance, var(firm product year) range(2001 2003, 2007)
表示保留2001-2003与2007年四年间企业-产品对均存在出口行为的样本观测值。
改进:(1)不需要专门设定面板;(2)兼容了对非连续时间的处理;(3)可以处理高维数据的转换;(4)兼容了以往xtbalance
的设定;(5)增加了对选定变量缺省值的处理。
注意:range(numlist)
的设定与xtbalance
有所差异,在xtbalance
中range(2001 2008)表示2001至2008年(8年),tobalance
中range(2001 2008)
表示2001与2008年(两年),tobalance
中range(2001/2008)
或者range(2001(1)2008)
可以表示2001至2008年。tobalance
中range(numlist)
的设定与forvalues
循环中的设定方式保持一致。
在本部分笔者将伪造一份贸易数据来解析balance
命令对数据处理的过程。
我们首先生成一份贸易数据,100家国内公司(firm
)在2001-2010年10年间(year
)出口10种产品(product
)到10个国家(country
)共10万观测值的连续时间、高维、平行数据。
. clear
. set obs 100000
number of observations (_N) was 0, now 100,000
. gen firm =int(_n/1000.001)+1
. //100家企业的编码为从1-100,分别表示第1家企业到第100家企业。
. bysort firm: gen product = int(_n/100.001)+100001
. //海关数据库中产品代码由2、4、6、8等位次,在学术研究中大多用6位产品海关代码,因此伪造数据中产品的取值为100001-100010共10种产品。
. bysort firm product: gen country = int(_n/10.001)+1
. //10个进口国的编码为从1-10,分别表示第1个进口国到第10个进口国。
. bysort firm product country: gen year = _n+2000
. //时间的取值为2001-2010,取值2001表示2001年的出口。
. egen id=group(firm product country)
. xtset id year
panel variable: id (strongly balanced)
time variable: year, 2001 to 2010
delta: 1 unit
. count
100,000
鉴于firm product coutry year的4维数据无法直接设定面板,在数据生成中对firm product coutry进行分组配对(egen id=group(firm product country)
),生成的id变量取值范围为1-10000,每个id对应10年,这样便可以对id和year进行面板设定。
接下来,利用随机函数将平行数据转换成非平行数据,为了保证操作的可重复性在数据删除的过程中设定了种子,每条观测值被删除的概率为50%。
. set seed 123456
. //设定种子以使得操作可重复
. drop if runiform() <0.5
(49,921 observations deleted)
. dis _N
50079
. xtset id year
panel variable: id (unbalanced)
time variable: year, 2001 to 2010, but with gaps
delta: 1 unit
. count
50,079
利用随机函数进行删除后,样本观测值由100000减少至50079个。
设定案例:tobalance, idvar(firm product) timevar(year) range(2001/2008)
表示保留2001-2008年8年间企业-产品对均存在出口行为的样本。
第一步,删除不在样本范围内的样本。
. sort firm product year
. drop if year<2001 | year>2008
(10,007 observations deleted)
第二步,保留2001-2008年8年间企业-产品对均存在出口行为的样本。
. quietly :tab year
. gen lin1 = r(r)
. bysort firm product (year): gen lin2=sum(year!=year[_n-1])
. bysort firm product: egen lin3=max(lin2)
. keep if lin3==lin1
(299 observations deleted)
. drop lin*
. count
39,773
. tobalance, idvar(firm product) timevar(year) range(2001/2008)
OutRange: 10007 observations deleted
Total : 10306 observations deleted
. count
39,773
tobalance, idvar(firm product) timevar(year) range(2001/2003 2007)
本部分继续用前文所构造的贸易数据来进行模拟,数据生成的方式见2.1
小节。
第一步,删除时间范围外的样本。
. sort firm product year
. //删除选定范围外的样本观测值
. drop if year>2003 & year<2007
(15,033 observations deleted)
. drop if year>2007
(15,006 observations deleted)
第二步,筛选出企业-产品组在设定范围(2001 2003, 2007
)内均存在出口行为的样本。
. quietly :tab year
. gen lin1 = r(r)
. bysort firm product (year): gen lin2=sum(year!=year[_n-1])
. bysort firm product: egen lin3=max(lin2)
. keep if lin3==lin1
(63 observations deleted)
. drop lin*
. count
19,977
. tobalance, idvar(firm product) timevar(year) range(2001/2003 2007)
OutRange: 30039 observations deleted
Total : 30102 observations deleted
. count
19,977
tobalance
与xtbalance
都可以将二维数据转换为平行面板。tobalance
使得xtbalance
摆脱了面板数据的限制,扩大其使用的范围。tobalance
与xtbalance
处理二维数据对比。. xtset id year
panel variable: id (unbalanced)
time variable: year, 2001 to 2010, but with gaps
delta: 1 unit
.
. preserve
. timer clear 1
. timer on 1
. tobalance , range(2001/2008)
OutRange: 10007 observations deleted
Total : 49775 observations deleted
. timer off 1
. timer list 1
1: 0.07 / 1 = 0.0680
. count
304
. restore
.
. preserve
. timer clear 1
. timer on 1
. xtbalance , range(2001 2008)
(10007 observations deleted due to out of range)
(39768 observations deleted due to discontinues)
. timer off 1
. timer list 1
1: 0.49 / 1 = 0.4940
. count
304
. restore
连享会-直播课 上线了!
http://lianxh.duanshu.com
免费公开课:
直击面板数据模型 - 连玉君,时长:1小时40分钟 Stata 33 讲 - 连玉君, 每讲 15 分钟. 部分直播课 课程资料下载 (PPT,dofiles等)
支持回看,所有课程可以随时购买观看。
专题 | 嘉宾 | 直播/回看视频 |
---|---|---|
⭐ 最新专题 ⭐ | DSGE, 因果推断, 空间计量等 | |
⭕ Stata数据清洗 | 游万海 | 直播, 2 小时,已上线 |
研究设计 | 连玉君 | 我的特斯拉-实证研究设计,-幻灯片- |
面板模型 | 连玉君 | 动态面板模型,-幻灯片- |
面板模型 | 连玉君 | 直击面板数据模型 [免费公开课,2小时] |
Note: 部分课程的资料,PPT 等可以前往 连享会-直播课 主页查看,下载。
关于我们
课程, 直播, 视频, 客服, 模型设定, 研究设计, Stata, plus, 绘图, 编程, 面板, 论文重现, 可视化, RDD, DID, PSM, 合成控制法
等
连享会小程序:扫一扫,看推文,看视频……
扫码加入连享会微信群,提问交流更方便
✏ 连享会学习群-常见问题解答汇总:
✨ https://gitee.com/arlionn/WD