温馨提示: 定期 清理浏览器缓存,可以获得最佳浏览体验。
作者: 刘欣妍 (香港中文大学)
邮箱: liuxinyan@link.cuhk.edu.hk
目录
试想,我们拥有一份数据,但只想保留具有连续三年观测值的样本,这又该如何实现那?为此,我们将通过一个具体例子来予以说明。具体如下:
*-输入数据
clear
input id year price
1 2000 12
1 2001 23
1 2003 12
1 2004 13
1 2005 14
2 2000 44
2 2001 34
2 2002 67
3 2000 32
3 2004 55
3 2005 46
4 2000 34
4 2001 87
4 2002 78
4 2004 89
4 2005 99
5 2000 34
5 2002 77
5 2004 88
6 2001 14
6 2002 27
6 2003 38
end
xtset id year
save lianxh_xt_conti.dta, replace
*-样本分布
use lianxh_xt_conti.dta, clear
xtset id year
xtdes
样本分布特征:
Freq. Percent Cum. | Pattern
---------------------------+---------
1 16.67 16.67 | .111..
1 16.67 33.33 | 1...11
1 16.67 50.00 | 1.1.1.
1 16.67 66.67 | 11.111
1 16.67 83.33 | 111...
1 16.67 100.00 | 111.11
---------------------------+---------
6 100.00 | XXXXXX
可以看到,只有四个 id,即在 id = 1,id = 3,id = 4 和 id = 6 的情况下,才有连续三年观测值的样本。那么又如何将满足条件的样本筛选出来?接下来,我们将为大家介绍三种方法实现上述要求。
Note: 本文主要介绍如何将包含有连续三年的样本筛选出来,若仅要保留连续三年数据,只需调整部分参数。
关于 bysort
命令使用,其基本思想为,针对某个 id,当间隔年份差值为 2 时,判断为连续三年。具体代码如下:
*-bysort
use lianxh_xt_conti.dta, clear
gen ss = 0
by id (year), sort: replace ss = 1 if year - year[_n-2] == 2
by id (year), sort: egen ss_sum = sum(ss)
list in 1/11, sepby(id) noobs
keep if ss_sum > 0
xtdes
列出结果:
+---------------------------------+
| id year price ss ss_sum |
|---------------------------------|
| 1 2000 12 0 1 |
| 1 2001 23 0 1 |
| 1 2003 12 0 1 |
| 1 2004 13 0 1 |
| 1 2005 14 1 1 |
|---------------------------------|
| 2 2000 44 0 1 |
| 2 2001 34 0 1 |
| 2 2002 67 1 1 |
|---------------------------------|
| 3 2000 32 0 0 |
| 3 2004 55 0 0 |
| 3 2005 46 0 0 |
+---------------------------------+
Freq. Percent Cum. | Pattern
---------------------------+---------
1 25.00 25.00 | .111..
1 25.00 50.00 | 11.111
1 25.00 75.00 | 111...
1 25.00 100.00 | 111.11
---------------------------+---------
4 100.00 | XXXXXX
xtpattern
命令根据面板数据出现的时间创建字符串,我们可以依此筛选需要的样本。具体代码如下:
*-xtpattern
use lianxh_xt_conti.dta, clear
xtpattern, gen(pp)
gen ss = strpos(pp, "111")
list in 1/11, sepby(id) noobs
keep if ss > 0
xtdes
列出结果:
Freq. Percent Cum. | Pattern
---------------------------+---------
1 25.00 25.00 | .111..
1 25.00 50.00 | 11.111
1 25.00 75.00 | 111...
1 25.00 100.00 | 111.11
---------------------------+---------
4 100.00 | XXXXXX
xtpattern
命令注意事项:
xtpattern
对象为面板数据,所以在使用该命令前需 xtset
;
关于 tsspell
命令的应用。具体代码如下:
*-tsspell
use lianxh_xt_conti.dta, clear
xtset id year
tsspell, f(L.year == .)
by id: egen maxrun = max(_seq)
list in 1/11, sepby(id) noobs
keep if maxrun >= 3
xtdes
列出结果:
+---------------------------------------------------+
| id year price _spell _seq _end maxrun |
|---------------------------------------------------|
| 1 2000 12 1 1 0 3 |
| 1 2001 23 1 2 1 3 |
| 1 2003 12 2 1 0 3 |
| 1 2004 13 2 2 0 3 |
| 1 2005 14 2 3 1 3 |
|---------------------------------------------------|
| 2 2000 44 1 1 0 3 |
| 2 2001 34 1 2 0 3 |
| 2 2002 67 1 3 1 3 |
|---------------------------------------------------|
| 3 2000 32 1 1 1 2 |
| 3 2004 55 2 1 0 2 |
| 3 2005 46 2 2 1 2 |
+---------------------------------------------------+
Freq. Percent Cum. | Pattern
---------------------------+---------
1 25.00 25.00 | .111..
1 25.00 50.00 | 11.111
1 25.00 75.00 | 111...
1 25.00 100.00 | 111.11
---------------------------+---------
4 100.00 | XXXXXX
tsspell
命令注意事项:
tsspell
命令前,必须先将数据设置为面板数据;tsspell, f(L.year == .)
是找出连续年份,详情可参考 help tsspell
;
*-regress 1
use "lianxh_xt_conti.dta", clear
xtset id year
reg id F(1/2).id
gen ss = e(sample)
bysort id: gen ss_sum = sum(ss)
bysort id: gen ss_sum2 = sum(ss_sum)
list in 1/11, sepby(id) noobs
keep if ss_sum2 >= 1 & ss_sum2 <= 3
xtdes
列出结果:
+-------------------------------------------+
| id year price ss ss_sum ss_sum2 |
|-------------------------------------------|
| 1 2000 12 0 0 0 |
| 1 2001 23 0 0 0 |
| 1 2003 12 1 1 1 |
| 1 2004 13 0 1 2 |
| 1 2005 14 0 1 3 |
|-------------------------------------------|
| 2 2000 44 1 1 1 |
| 2 2001 34 0 1 2 |
| 2 2002 67 0 1 3 |
|-------------------------------------------|
| 3 2000 32 0 0 0 |
| 3 2004 55 0 0 0 |
| 3 2005 46 0 0 0 |
+-------------------------------------------+
Freq. Percent Cum. | Pattern
---------------------------+---------
2 50.00 50.00 | 111...
1 25.00 75.00 | ...111
1 25.00 100.00 | .111..
---------------------------+---------
4 100.00 | XXXXXX
use "lianxh_xt_conti.dta", clear
xtset id year
qui reg id F(1/2).id
gen s1 = e(sample)
list, sepby(id)
qui reg id L(1).id F1.id
gen s2 = e(sample)
list, sepby(id)
qui reg id L(1/2).id
gen s3 = e(sample)
list, sepby(id)
gen ss = s1+s2+s3
list in 1/11, sepby(id) noobs
by id: egen ss_sum = sum(ss)
keep if ss_sum == 3
xtdes
+---------------------------------------+
| id year price s1 s2 s3 ss |
|---------------------------------------|
| 1 2000 12 0 0 0 0 |
| 1 2001 23 0 0 0 0 |
| 1 2003 12 1 0 0 1 |
| 1 2004 13 0 1 0 1 |
| 1 2005 14 0 0 1 1 |
|---------------------------------------|
| 2 2000 44 1 0 0 1 |
| 2 2001 34 0 1 0 1 |
| 2 2002 67 0 0 1 1 |
|---------------------------------------|
| 3 2000 32 0 0 0 0 |
| 3 2004 55 0 0 0 0 |
| 3 2005 46 0 0 0 0 |
+---------------------------------------+
Freq. Percent Cum. | Pattern
---------------------------+---------
1 25.00 25.00 | .111..
1 25.00 50.00 | 11.111
1 25.00 75.00 | 111...
1 25.00 100.00 | 111.11
---------------------------+---------
4 100.00 | XXXXXX
连享会-直播课 上线了!
http://lianxh.duanshu.com
免费公开课:
直击面板数据模型 - 连玉君,时长:1小时40分钟,课程主页 Stata 33 讲 - 连玉君, 每讲 15 分钟. 部分直播课 课程资料下载 (PPT,dofiles等)
支持回看,所有课程可以随时购买观看。
专题 | 嘉宾 | 直播/回看视频 |
---|---|---|
⭐ 最新专题 | 因果推断, 空间计量,寒暑假班等 | |
⭕ 数据清洗系列 | 游万海 | 直播, 88 元,已上线 |
研究设计 | 连玉君 | 我的特斯拉-实证研究设计,-幻灯片- |
面板模型 | 连玉君 | 动态面板模型,-幻灯片- |
面板模型 | 连玉君 | 直击面板数据模型 [免费公开课,2小时] |
Note: 部分课程的资料,PPT 等可以前往 连享会-直播课 主页查看,下载。
关于我们
课程, 直播, 视频, 客服, 模型设定, 研究设计, stata, plus, 绘图, 编程, 面板, 论文重现, 可视化, RDD, DID, PSM, 合成控制法
等
连享会小程序:扫一扫,看推文,看视频……
扫码加入连享会微信群,提问交流更方便
✏ 连享会学习群-常见问题解答汇总:
✨ https://gitee.com/arlionn/WD