Stata数据处理:面板数据的填充和补漏

发布时间:2020-06-27 阅读 74

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

Source: http://www.statalist.org/forums/forum/general-stata-discussion/general/17996-substitute-rows-with-average-of-row-above-and-below

连享会 - Stata 暑期班

线上直播 9 天:2020.7.28-8.7
主讲嘉宾:连玉君 (中山大学) | 江艇 (中国人民大学)
课程主页https://gitee.com/arlionn/PX | 微信版


目录



问题描述

我有一份面板数据,有些年份上的数据有两行或多行记录 (例如,本例中 2007 年的数据)。棘手的是,这两行数据存在差异,且无法判断哪一个记录是正确的。此时,比较稳妥的选择是:将这两汉数据都舍弃,使用相邻年度 (2006 和 2008 年) 的均值作为 2007 年的观察值 (插值)。

  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
clearinput ID    year    var1    var2    var3      1     2006     34      45      65      1     2007     45      43      41      1     2007      3      56      59      1     2008     39      54      76      1     2009     41      57      68endsave "data00.dta", replace

原始数据详情:

  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
. list
+--------------------------------+ | ID year var1 var2 var3 | |--------------------------------| 1. | 1 2006 34 45 65 | 2. | 1 2007 45 43 41 | 3. | 1 2007 3 56 59 | 4. | 1 2008 39 54 76 | 5. | 1 2009 41 57 68 | +--------------------------------+


解决方法1: 使用 tssmooth ma 命令

思路:

  • 先删除重复的观察值 (2007 年的数据)
  • 继而使用 tsfill 填充年份,让数据变成平行面板;
  • 最后用 tssmooth ma 命令插值 (用前后两年的平均值代替 2007 年的缺失值)。 说明:此处 mamoving average 的简写。

命令如下:

  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
. use "data00.dta", clear*-删除重复值  (数据有误). drop if year == 2007. tsset ID year. tsfill. list     +--------------------------------+     | ID   year   var1   var2   var3 |     |--------------------------------|  1. |  1   2006     34     45     65 |  2. |  1   2007      .      .      . |  3. |  1   2008     39     54     76 |  4. |  1   2009     41     57     68 |     +--------------------------------+*-填充缺失值:forv i = 1/3 {    tssmooth ma v`i' = var`i' , w(1, 0, 1)    replace var`i' = v`i' if var`i' == .}drop v?list

运行结果如下:

  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
. forv i = 1/3 {  2.     tssmooth ma v`i' = var`i' , w(1, 0, 1)  3.     replace var`i' = v`i' if var`i' == .  4. }The smoother applied was     (1/2)*[x(t-1) + 0*x(t) + x(t+1)]; x(t)= var1(1 real change made)The smoother applied was     (1/2)*[x(t-1) + 0*x(t) + x(t+1)]; x(t)= var2(1 real change made)The smoother applied was     (1/2)*[x(t-1) + 0*x(t) + x(t+1)]; x(t)= var3(1 real change made)
. drop v?
. list +--------------------------------+ | ID year var1 var2 var3 | |--------------------------------| 1. | 1 2006 34 45 65 | 2. | 1 2007 36.5 49.5 70.5 | 3. | 1 2008 39 54 76 | 4. | 1 2009 41 57 68 | +--------------------------------+

从结果的提示信息可以看出 w(1, 0, 1) 选项的含义:

  • ounter(line
  • ounter(line
The smoother applied was     (1/2)*[x(t-1) + 0*x(t) + x(t+1)]; x(t)= var1


解决方法2: 使用 duplicates tag 命令

思路:

  • 使用 duplicates tag 命令标记重复的观察值,并使用 gen() 选项产生新变量用以记录标记情况;
  • 删除重复的观察值 (其实,这两步可以合为一步);
  • 使用 _n 标记观察先后顺序 (x[_n] 表示 xtx[_n-1] 表示 xt1x[_n+1] 表示 xt+1),进行插值;
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
clearinput id year var1 var2 var31 2006 34 45 651 2007 45 43 411 2007 3 56 591 2008 39 54 761 2009 41 57 68end

使用 duplicates tag 标记重复的观察值:

  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
. duplicates tag id year, gen(mistake)  . list. bysort id year: keep if (_n == 1)  foreach v of varlist var1 var2 var3 {       replace `v' =  (`v'[_n-1] + `v'[_n+1])/2 if mistake  }

结果如下:

  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
.  duplicates tag id year, gen(mistake)  Duplicates in terms of id year
. list // A-1 +------------------------------------------+ | id year var1 var2 var3 mistake | |------------------------------------------| 1. | 1 2006 34 45 65 0 | 2. | 1 2007 45 43 41 1 | 3. | 1 2007 3 56 59 1 | 4. | 1 2008 39 54 76 0 | 5. | 1 2009 41 57 68 0 | +------------------------------------------+
. bysort id year: keep if (_n == 1)(1 observation deleted)
. list // A-2 +------------------------------------------+ | id year var1 var2 var3 mistake | |------------------------------------------| 1. | 1 2006 34 45 65 0 | 2. | 1 2007 45 43 41 1 | 3. | 1 2008 39 54 76 0 | 4. | 1 2009 41 57 68 0 | +------------------------------------------+
. foreach v of varlist var1 var2 var3 { 2. replace `v' = (`v'[_n-1] + `v'[_n+1])/2 if mistake 3. }
. list // A-3 +------------------------------------------+ | id year var1 var2 var3 mistake | |------------------------------------------| 1. | 1 2006 34 45 65 0 | 2. | 1 2007 36.5 49.5 70.5 1 | 3. | 1 2008 39 54 76 0 | 4. | 1 2009 41 57 68 0 | +------------------------------------------+


附:文中使用的代码

  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
*------------*-Solution 1:* You could use tssmooth ma.* For example:
clearinput ID year var1 var2 var31 2006 34 45 651 2007 45 43 411 2007 3 56 591 2008 39 54 761 2009 41 57 68end
list
drop if year == 2007tsset ID yeartsfilllist
forv i = 1/3 { tssmooth ma v`i' = var`i' , w(1, 0, 1) replace var`i' = v`i' if var`i' == .}drop v?list
*------------*-Solution 2:
clearinput id year var1 var2 var31 2006 34 45 651 2007 45 43 411 2007 3 56 591 2008 39 54 761 2009 41 57 68end
duplicates tag id year, gen(mistake) listbysort id year: keep if (_n == 1)listforeach v of varlist var1 var2 var3 { replace `v' = (`v'[_n-1] + `v'[_n+1])/2 if mistake}list

相关课程

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

免费公开课:


课程一览

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

专题 嘉宾 直播/回看视频
Stata暑期班 连玉君
江艇
线上直播 9 天
2020.7.28-8.7
效率分析-专题 连玉君
鲁晓东
张 宁
视频-TFP-SFA-DEA
已上线,3天
文本分析/爬虫 游万海
司继春
视频-文本分析与爬虫
已上线,4天
空间计量系列 范巧 空间全局模型, 空间权重矩阵
空间动态面板, 空间DID
研究设计 连玉君 我的特斯拉-实证研究设计-幻灯片-
面板模型 连玉君 动态面板模型-幻灯片-
直击面板数据模型 [免费公开课,2小时]

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


关于我们

  • Stata连享会 由中山大学连玉君老师团队创办,定期分享实证分析经验。直播间 有很多视频课程,可以随时观看。
  • 连享会-主页知乎专栏,300+ 推文,实证分析不再抓狂。
  • 公众号推文分类: 计量专题 | 分类推文 | 资源工具。推文分成 内生性 | 空间计量 | 时序面板 | 结果输出 | 交乘调节 五类,主流方法介绍一目了然:DID, RDD, IV, GMM, FE, Probit 等。
  • 公众号关键词搜索/回复 功能已经上线。大家可以在公众号左下角点击键盘图标,输入简要关键词,以便快速呈现历史推文,获取工具软件和数据下载。常见关键词:
    • 课程, 直播, 视频, 客服, 模型设定, 研究设计, 暑期班
    • stata, plus,Profile, 手册, SJ, 外部命令, profile, mata, 绘图, 编程, 数据, 可视化
    • DID,RDD, PSM,IV,DID, DDD, 合成控制法,内生性, 事件研究, 交乘, 平方项, 缺失值, 离群值, 缩尾, R2, 乱码, 结果
    • Probit, Logit, tobit, MLE, GMM, DEA, Bootstrap, bs, MC, TFP, 面板, 直击面板数据, 动态面板, VAR, 生存分析, 分位数
    • 空间, 空间计量, 连老师, 直播, 爬虫, 文本, 正则, python
    • Markdown, Markdown幻灯片, marp, 工具, 软件, Sai2, gInk, Annotator, 手写批注, 盈余管理, 特斯拉, 甲壳虫, 论文重现, 易懂教程, 码云, 教程, 知乎

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

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


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

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