查看原文
其他

Stata:缺失值的填充和补漏

连享会 连享会 2023-02-21

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


连享会 · 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 中较为常用的缺失数据处理命令 tsfillipolate,旨在为大家处理缺失数据问题时提供帮助。

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 命令

下面对 tsfillipolate 在时间序列和面板数据中的使用方法进行举例说明。

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 搜索神器:lianxhsongbl  GIF 动图介绍
搜: 推文、数据分享、期刊论文、重现代码 ……
👉 安装:
. ssc install lianxh
. ssc install songbl
👉  使用:
. lianxh DID 倍分法
. songbl all

🍏 关于我们

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

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

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