Stata:缺失值的填充和补漏
👇 连享会 · 推文导航 | www.lianxh.cn
🍎 Stata:Stata基础 | Stata绘图 | Stata程序 | Stata新命令 📘 论文:数据处理 | 结果输出 | 论文写作 | 数据分享 💹 计量:回归分析 | 交乘项-调节 | IV-GMM | 时间序列 | 面板数据 | 空间计量 | Probit-Logit | 分位数回归 ⛳ 专题:SFA-DEA | 生存分析 | 爬虫 | 机器学习 | 文本分析 🔃 因果:DID | RDD | 因果推断 | 合成控制法 | PSM-Matching 🔨 工具:工具软件 | Markdown | Python-R-Stata 🎧 课程:公开课-直播 | 计量专题 | 关于连享会
连享会 · 2022 面板数据因果推断专题
作者: 刘祎 (江西财经大学国贸学院)
邮箱: louisones@qq.com
目录
1. 引言
2. 问题与方法
2.1 缺失数据会带来的问题
2.2 缺失数据的常用方法
3. tsfill 和 ipolate 命令简介
4. Stata 实操:tsfill 和 ipolate 命令
4.1 时间序列数据
4.2 面板数据
5. iploate 方法评价
参考资料
温馨提示: 文中链接在微信中无法生效。请点击底部「阅读原文」。或直接长按/扫描如下二维码,直达原文:
1. 引言
在实证研究中,我们经常会遇到数据缺失的问题。在样本较大的情况下,我们可以删除缺失值,而在样本较小的情况下,缺失值的影响会变得很大,此时,填补数据这项工作就变得相对重要。
本文主要介绍了 Stata 中较为常用的缺失数据处理命令 tsfill
和 ipolate
,旨在为大家处理缺失数据问题时提供帮助。
2. 问题与方法
2.1 缺失数据会带来的问题
通常,在缺失部分数据的情况下,只要数据量足够大,我们可以将含有缺失值的样本删掉,并且不会对结果产生太大影响。但是,在「样本量小」和「缺失数据多」的情况下,我们简单的删掉数据,会损失较多的信息,并且使得结果有偏。
例如,下表中有 8 个样本,左边为含有缺失值的数据,右边为完整数据,并且左边部分 有 4 个缺失值。当我们删除缺失值时,左边 均值为 39,而右边 均值为 29.75,可以看出二者还是有很大差别的。
+--------------------------------------+
| 含有缺失值的数据 | 完整数据 |
+--------------------------------------+
|Case Age Gender | Case Age Gender |
+--------------------------------------+
|1 . Female | 1 21 Female |
|2 . Male | 2 22 Male |
|3 39 Male | 3 39 Male |
|4 . Female | 4 20 Female |
|5 42 Male | 5 42 Male |
|6 . Female | 6 18 Female |
|7 37 Male | 7 37 Male |
|8 38 Male | 8 39 Male |
+--------------------------------------+
(缺失数据和完整数据的基本格式)
2.2 缺失数据的常用方法
求均值
好处:简单 坏处:取均值会降低数据的方差 使用范围:当分组数据特征是可以观测到的情况下,可以分组求均值
删除缺失值
好处:比较干净的剔除了不完整的缺失数据 坏处:减少了样本数量,尤其是数据量不大的时候 使用范围:如果缺失数据量小于 2%
插补法
好处:简单 适用范围:当数据的缺失不是随机出现的时候。时间序列数据例如 GDP,收入等比较适用
3. tsfill 和 ipolate 命令简介
在时间序列数据中,ipolate
需要与 tsfill
搭配使用。首先用tsfill
补充缺失时间,然后用 ipolate
进行「插值或外推」补齐数据。
tsfill
注意事项
tsfill
使用前必须将数据设定为「时间序列数据」或「面板数据」;tsfill
的主要作用是对数据中时间变量 () 的缺失值进行填补或扩充。
ipolate
原理
如一份数据有 3 个变量 , 和 , 是时间,且 变量在 时点有缺失值 ;
+-------------+
| t y x |
|-------------|
| 0 65 8 |
| 1 . 15 |
| 2 80 20 |
+-------------+
的计算公式:
4. Stata 实操:tsfill 和 ipolate 命令
下面对 tsfill
和 ipolate
在时间序列和面板数据中的使用方法进行举例说明。
4.1 时间序列数据
以 tsfillxmpl
这份数据为例,数据中缺失了 1995 年 9 月、1995 年 10 月、1996 年 2 月的数据。
. use https://www.stata-press.com/data/r16/tsfillxmpl, clear
. tsset
time variable: mdate, 1995m7 to 1996m3, but with gaps
delta: 1 month
. list mdate income, sep(0)
+------------------+
| mdate income |
|------------------|
1. | 1995m7 1153 |
2. | 1995m8 1181 |
3. | 1995m11 1236 |
4. | 1995m12 1297 |
5. | 1996m1 1265 |
6. | 1996m3 1282 |
+------------------+
tsfill
的作用在于「撑大样本 (新增观察值)」,以便让缺失值所在空位一目了然。
. tsfill
. list mdate income, sep(0)
+------------------+
| mdate income |
|------------------|
1. | 1995m7 1153 |
2. | 1995m8 1181 |
3. | 1995m9 . |
4. | 1995m10 . |
5. | 1995m11 1236 |
6. | 1995m12 1297 |
7. | 1996m1 1265 |
8. | 1996m2 . |
9. | 1996m3 1282 |
+------------------+
在得到了这几个新增的观测值后,我们就可以使用 ipolate
创建新变量,并进行数据填充。
. ipolate income mdate, gen(ipinc) //income 是 mdate 函数
. list mdate income ipinc, sep(0)
+------------------------------+
| mdate income ipinc |
|------------------------------|
1. | 1995m7 1153 1153 |
2. | 1995m8 1181 1181 |
3. | 1995m9 . 1199.3333 |
4. | 1995m10 . 1217.6667 |
5. | 1995m11 1236 1236 |
6. | 1995m12 1297 1297 |
7. | 1996m1 1265 1265 |
8. | 1996m2 . 1273.5 |
9. | 1996m3 1282 1282 |
+------------------------------+
实际上,ipolate
只能填补数值范围内的缺漏值,无法填补数值范围外的缺漏值,即只能用于「插值」。若要进行「外推」,我们还需要在 ipolate
命令后加上 epolate
选项。关于「插值」和「外推」区别,详见「The Difference Between Extrapolation and Interpolation」。
具体来看,我们先生成一份数据,然后剔除一部分数据,最后再分别用「插值」和「插值+外推」的方法生成变量 和 。观察下表,我们可以发现,在 list x if ymissing != .
范围内, 和 是相同的,但是在范围外,「插值法」不起作用,而「插值+外推法」可以填充缺失值。
*-产生一份数据
clear all
set obs 20
set seed 10101
gen id =_n
gen year = _n+1999
gen x = rnormal(8,1)
gen e = rnormal(2,1)
gen y=1+2*x+e
tsset year
*-将 y > 20 定义为缺失值
gen ymissing = y
replace ymissing = . if ymissing > 20
*-进行插值和外推
ipolate ymissing x, gen(y1)
ipolate ymissing x, gen(y2) epolate
*-列示数据
sort x
list year y x ymissing y1 y2, sep(0)
+---------------------------------------------------------------+
| year y x ymissing y1 y2 |
|---------------------------------------------------------------|
1. | 2016 14.22344 6.224262 14.22344 14.223439 14.223439 |
2. | 2003 16.01714 6.299623 16.01714 16.017143 16.017143 |
3. | 2012 15.6483 6.631131 15.6483 15.648301 15.648301 |
4. | 2018 15.23791 6.776969 15.23791 15.237909 15.237909 |
5. | 2017 19.02291 7.256191 19.02291 19.022915 19.022915 |
6. | 2014 18.78441 7.443309 18.78441 18.78441 18.78441 |
7. | 2004 17.76631 7.66682 17.76631 17.76631 17.76631 |
8. | 2019 19.20397 7.694068 19.20397 19.203974 19.203974 |
9. | 2009 19.79814 7.845325 19.79814 19.798141 19.798141 |
10. | 2011 18.87022 8.242313 18.87022 18.870222 18.870222 |
11. | 2002 20.07537 8.258301 . 19.029664 19.029664 |
12. | 2008 19.78762 8.334302 19.78762 19.787622 19.787622 |
13. | 2010 19.64958 8.389261 19.64958 19.649576 19.649576 |
14. | 2000 20.51375 8.392216 . 19.649501 19.649501 |
15. | 2013 20.21895 8.769518 . 19.639873 19.639873 |
16. | 2001 19.63783 8.849615 19.63783 19.637829 19.637829 |
17. | 2005 18.35985 9.265242 18.35985 18.359848 18.359848 |
18. | 2007 22.23178 9.515868 . . 17.589214 |
19. | 2015 25.5771 10.40832 . . 14.845067 |
20. | 2006 24.7197 10.81053 . . 13.608347 |
+---------------------------------------------------------------+
4.2 面板数据
以 tsfillxmpl2.dta 为例,我们可以看到个体 2 缺失了 1991 年数据。
. webuse tsfillxmpl2, clear
. tsset
panel variable: edlevel (unbalanced)
time variable: year, 1988 to 1992, but with a gap
delta: 1 unit
. list edlevel year income, sep(0)
+-------------------------+
| edlevel year income |
|-------------------------|
1. | 1 1988 14500 |
2. | 1 1989 14750 |
3. | 1 1990 14950 |
4. | 1 1991 15100 |
5. | 2 1989 22100 |
6. | 2 1990 22200 |
7. | 2 1992 22800 |
+-------------------------+
与时间序列数据类似,我们可以通过 tsfill
命令将缺失数据扩充进来。
. tsfill
. list edlevel year income, sep(0)
+-------------------------+
| edlevel year income |
|-------------------------|
1. | 1 1988 14500 |
2. | 1 1989 14750 |
3. | 1 1990 14950 |
4. | 1 1991 15100 |
5. | 2 1989 22100 |
6. | 2 1990 22200 |
7. | 2 1991 . |
8. | 2 1992 22800 |
+-------------------------+
当然,我们也可以按照「平衡面板」数据结构来进行观察值填补,只需在 tsfill
命令后加入 full
选项。
. webuse tsfillxmpl2, clear
. xtset edlevel year
panel variable: edlevel (unbalanced)
time variable: year, 1988 to 1992, but with a gap
delta: 1 unit
. tsfill, full
. list edlevel year income
+-------------------------+
| edlevel year income |
|-------------------------|
1. | 1 1988 14500 |
2. | 1 1989 14750 |
3. | 1 1990 14950 |
4. | 1 1991 15100 |
5. | 1 1992 . |
|-------------------------|
6. | 2 1988 . |
7. | 2 1989 22100 |
8. | 2 1990 22200 |
9. | 2 1991 . |
10. | 2 1992 22800 |
+-------------------------+
可以看到在扩充了 3 个观察值后,数据变成了「平衡面板」数据。接下来,我们要对缺失值填充。
. ipolate income year, gen(ipinc1)
. list edlevel year income ipinc1
+----------------------------------+
| edlevel year income ipinc1 |
|----------------------------------|
1. | 1 1988 14500 14500 |
2. | 1 1989 14750 18425 |
3. | 1 1990 14950 18575 |
4. | 1 1991 15100 15100 |
5. | 1 1992 . 22800 |
|----------------------------------|
6. | 2 1988 . 14500 |
7. | 2 1989 22100 18425 |
8. | 2 1990 22200 18575 |
9. | 2 1991 . 15100 |
10. | 2 1992 22800 22800 |
+----------------------------------+
5. iploate 方法评价
优点
定义简单 当数据之间没有任何相关特征的时候比较适用
缺点
它仅考虑了数据的局部结构; 它通常会减少数据的变异性; 显然补齐的数据并不是数据的完整特征,数据被人为的简单化了。
注意
通过人为地在数据中引入间隙,可以了解「插值法」处理该数据的效果; 尝试不同的插值方法来了解它们之间的一致程度。
参考资料
Hamming R. Numerical methods for scientists and engineers[M]. Courier Corporation, 2012. Link Morton, B.R. Numerical approximation[M]. London: Routledge and Kegan Paul, 1964. Link Press W H, Teukolsky S A, Vetterling W T, et al. Numerical recipes 3rd edition: The art of scientific computing[M]. Cambridge university press, 2007. Link The Difference Between Extrapolation and Interpolation Link
课程推荐:面板数据因果推断
主讲老师:徐轶青 (斯坦福大学)
🍓 课程主页:https://gitee.com/arlionn/Course
New! Stata 搜索神器:
lianxh
和songbl
GIF 动图介绍
搜: 推文、数据分享、期刊论文、重现代码 ……
👉 安装:
. ssc install lianxh
. ssc install songbl
👉 使用:
. lianxh DID 倍分法
. songbl all
🍏 关于我们
连享会 ( www.lianxh.cn,推文列表) 由中山大学连玉君老师团队创办,定期分享实证分析经验。 直通车: 👉【百度一下: 连享会】即可直达连享会主页。亦可进一步添加 「知乎」,「b 站」,「面板数据」,「公开课」 等关键词细化搜索。