查看原文
其他

Stata:如何保留时间连续的样本

连享会 连享会 2023-10-24

👇 连享会 · 推文导航 | www.lianxh.cn

连享会课程 · 基于机器学习的因果推断方法

作者: 刘欣妍 (香港中文大学)
邮箱:  liuxinyan@link.cuhk.edu.hk

温馨提示: 文中链接在微信中无法生效。请点击底部「阅读原文」。或直接长按/扫描如下二维码,直达原文:


目录

  • 1. 问题引出

  • 2. 方法 1:bysort 的运用

  • 3. 方法 2:xtpattern 的应用

  • 4. 方法 3:tsspell 的应用

  • 5. 方法 4:regress 的应用

    • 5.1 方法一

    • 5.2 方法二



1. 问题引出

试想,我们拥有一份数据,但只想保留具有连续三年观测值的样本,这又该如何实现那?为此,我们将通过一个具体例子来予以说明。具体如下:

*-输入数据
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 = 2,id = 4  和 id = 6 的情况下,才有连续三年观测值的样本。那么又如何将满足条件的样本筛选出来?接下来,我们将为大家介绍三种方法实现上述要求。

Note: 本文主要介绍如何将包含有连续三年的样本筛选出来,若仅要保留连续三年数据,只需调整部分参数。

2. 方法 1:bysort 的运用

关于 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

3. 方法 2:xtpattern 的应用

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
  • 若当年有数据,取值为 1,反之为 .,字符串长度是根据样本中最长年份确定的。

4. 方法 3:tsspell 的应用

关于 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
  • _seq 代表连续年份顺序;
  • _end 代表是否是年份顺序最后一个;
  • 最后,我们可通过找出 _seq 中最大值,找出连续三年的样本数据。

5. 方法 4:regress 的应用

5.1 方法一

*-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

5.2 方法二

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

课程推荐:因果推断实用计量方法
主讲老师:邱嘉平教授
🍓 课程主页https://gitee.com/lianxh/YGqjp

New! Stata 搜索神器:lianxhsongbl  GIF 动图介绍
搜: 推文、数据分享、期刊论文、重现代码 ……
👉 安装:
. ssc install lianxh
. ssc install songbl
👉  使用:
. lianxh DID 倍分法
. songbl all

🍏 关于我们

  • 连享会 ( www.lianxh.cn,推文列表) 由中山大学连玉君老师团队创办,定期分享实证分析经验。
  • 直通车: 👉【百度一下: 连享会】即可直达连享会主页。亦可进一步添加 「知乎」,「b 站」,「面板数据」,「公开课」 等关键词细化搜索。


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存