Stata:缺失值的填充和补漏

发布时间:2020-07-02 阅读 1000

Stata 连享会   主页 || 视频 || 推文

温馨提示: 定期 清理浏览器缓存,可以获得最佳浏览体验。

课程详情 https://gitee.com/arlionn/Course   |   lianxh.cn

课程主页 https://gitee.com/arlionn/Course

作者: 刘祎 (江西财经大学国贸学院)
邮箱: louisones@qq.com


目录


1. 引言

在实证研究中,我们经常会遇到数据缺失的问题。在样本较大的情况下,我们可以删除缺失值,而在样本较小的情况下,缺失值的影响会变得很大,此时,填补数据这项工作就变得相对重要。

本文主要介绍了 Stata 中较为常用的缺失数据处理命令 tsfillipolate,旨在为大家处理缺失数据问题时提供帮助。

2. 问题与方法

2.1 缺失数据会带来的问题

通常,在缺失部分数据的情况下,只要数据量足够大,我们可以将含有缺失值的样本删掉,并且不会对结果产生太大影响。但是,在「样本量小」和「缺失数据多」的情况下,我们简单的删掉数据,会损失较多的信息,并且使得结果有偏。

例如,下表中有 8 个样本,左边为含有缺失值的数据,右边为完整数据,并且左边部分 age 有 4 个缺失值。当我们删除缺失值时,左边 age 均值为 39,而右边 age 均值为 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 的主要作用是对数据中时间变量 (timevar) 的缺失值进行填补或扩充。

ipolate 原理

  • 如一份数据有 3 个变量 ty 和 x, t 是时间,且 y 变量在 t1 时点有缺失值 y1
+-------------+
| t    y    x |
|-------------|
| 0   65    8 |
| 1    .   15 |
| 2   80   20 |
+-------------+
  • y1 的计算公式:

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」

具体来看,我们先生成一份数据,然后剔除一部分数据,最后再分别用「插值」和「插值+外推」的方法生成变量 y1 和 y2。观察下表,我们可以发现,在 list x if ymissing != . 范围内,y1 和 y2 是相同的,但是在范围外,「插值法」不起作用,而「插值+外推法」可以填充缺失值。

*-产生一份数据
  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

相关课程

连享会-直播课 上线了!
http://lianxh.duanshu.com

免费公开课:


课程一览

支持回看,所有课程可以随时购买观看。

专题 嘉宾 直播/回看视频
最新专题 DSGE, 因果推断, 空间计量等
Stata数据清洗 游万海 直播, 2 小时,已上线
研究设计 连玉君 我的特斯拉-实证研究设计-幻灯片-
面板模型 连玉君 动态面板模型-幻灯片-
面板模型 连玉君 直击面板数据模型 [免费公开课,2小时]

Note: 部分课程的资料,PPT 等可以前往 连享会-直播课 主页查看,下载。


关于我们

  • Stata连享会 由中山大学连玉君老师团队创办,定期分享实证分析经验。直播间 有很多视频课程,可以随时观看。
  • 连享会-主页知乎专栏,300+ 推文,实证分析不再抓狂。
  • 公众号推文分类: 计量专题 | 分类推文 | 资源工具。推文分成 内生性 | 空间计量 | 时序面板 | 结果输出 | 交乘调节 五类,主流方法介绍一目了然:DID, RDD, IV, GMM, FE, Probit 等。
  • 公众号关键词搜索/回复 功能已经上线。大家可以在公众号左下角点击键盘图标,输入简要关键词,以便快速呈现历史推文,获取工具软件和数据下载。常见关键词:课程, 直播, 视频, 客服, 模型设定, 研究设计, stata, plus, 绘图, 编程, 面板, 论文重现, 可视化, RDD, DID, PSM, 合成控制法

连享会主页  lianxh.cn
连享会主页 lianxh.cn

连享会小程序:扫一扫,看推文,看视频……

扫码加入连享会微信群,提问交流更方便

✏ 连享会学习群-常见问题解答汇总:
https://gitee.com/arlionn/WD

热门资讯

08/29 专题课程 2429
03/12 计量专题 5153
01/01 工具软件 5523
09/22 专题课程 553
09/21 专题课程 1953
09/21 专题课程 78
09/20 Probit-Logit 57