
今天有同学问我怎么将每一期的CFPS合并到成一个panel。这涉及到在Stata中最常用的两个合并命令,merge
和append
,其中merge
是横向合并,用于追加变量。append
是纵向合并,用于追加样本。多期截面组合成面板一般使用append
命令。
下面我使用CFPS2014和CFPS2016做一个简单实例
首先导入CFPS2014中的adult数据,然后使用keep
命令遴选出我们需要的变量。作为示范,我仅选了pid、provcd16等4个变量。由于append
在进行合并的时候,是在同变量名后面追加样本,所以我们必须要保持各个文件的变量名一致。因此我们使用rename
命令,更换各变量的name。最后在gen
一个时间变量year
,用于识别不同期的时间。把第一份数据保存下来。
cd /Applications/Stata/personal/CFPS/CFPS2014
use cfps2014adult_201906.dta, clear
keep pid provcd14 urban14 qea0
rename (provcd14 urban14 qea0)(provcd urban marriage)
gen year = 2014
save /Applications/Stata/personal/CFPS/CFPS2016/data1.dta, replace
再者,对第二份数据进行处理,重复上一步的操作。CFPS每一期的变量命名方式都会稍作修改,即使是保留相同的变量,变量名的编码也会稍有差异。我们使用keep
保留我们需要的4个变量。使用rename
修改好变量名,并生成一个时间变量。把它保存下来。
cd /Applications/Stata/personal/CFPS/CFPS2016
use cfps2016adult_201808.dta, clear
keep pid provcd16 urban16 qea0
rename (provcd16 urban16 qea0)(provcd urban marriage)
gen year = 2016
save data2.dta, replace
最后一步,使用append
进行合并。首先要保证前面两个数据集是在同一文件夹下面,这样才比较方便合并。当然,你也可以在使用append
的时候加入具体的文件存储路径。我们使用较为简单的前者。导入第二份数据,并把第一份数据追加进去。由此,即得到了一份非平衡面板数据。
use data2.dta, clear
append using data1.dta
order pid year
xtset pid year
输入order
命令对变量排序,这样比较易读。输入xtset
查看数据格式,可以发现,这是一份非平衡面板数据,时间跨度是2014-2016年。
. xtset pid year
panel variable: pid (unbalanced)
time variable: year, 2014 to 2016, but with gaps
delta: 1 unit
一般而言,到此就结束了。但是有些同学喜欢平衡面板数据。这和时候可以引入egen
命令中的count
函数。如下所示,计算出变量pid
的个数,仅保留pid
个数为2的变量(pid
为2,表示该样本有两期)。
bys pid: egen num = count(pid)
keep if num == 2
drop num
xtset pid year
最后得到的就是平衡面板了。
. xtset pid year
panel variable: pid (strongly balanced)
time variable: year, 2014 to 2016, but with gaps
delta: 1 unit
其实CHFS、CHARLS之类的数据也可以做类似的处理。原理相同,只是具体方法不同,依操作者的具体思路而定。
以下是完整代码。
*-导入第一份数据
cd /Applications/Stata/personal/CFPS/CFPS2014
use cfps2014adult_201906.dta, clear
keep pid provcd14 urban14 qea0
rename (provcd14 urban14 qea0)(provcd urban marriage)
gen year = 2014
save /Applications/Stata/personal/CFPS/CFPS2016/data1.dta, replace
*-导入第二份数据
cd /Applications/Stata/personal/CFPS/CFPS2016
use cfps2016adult_201808.dta, clear
keep pid provcd16 urban16 qea0
rename (provcd16 urban16 qea0)(provcd urban marriage)
gen year = 2016
save data2.dta, replace
*-纵向合并
use data2.dta, clear
append using data1.dta
order pid year
xtset pid year
bys pid: egen num = count(pid)
keep if num == 2
drop num
xtset pid year
save data.dta, replace