Stata: 缺失值填充之 carryforward 命令

Stata: 缺失值填充之 carryforward 命令

作者:黄俊凯 (中国人民大学财政金融学院)
Stata 连享会: 知乎 | 简书 | 码云 | CSDN
连享会最新专题直播

连享会-知乎推文列表


Note: 助教招聘信息请进入「课程主页」查看。

qr32.cn/BlTL43 (二维码自动识别)

gitee.com/arlionn/DSGE (二维码自动识别)


缺失值就像灭霸,不可避免,我们能做的只有迎难而上
今天我们介绍一个外部命令carryforward,用于简单的填充缺失值

顾名思义,carryforward用非空前值填充缺失的观测值
carryforward will carry values forward from one observation to the next, filling in missing values with the previous value
carryforward特别适用于以下三个场景:

  1. 根据变动事件构造每一期的数据,下文会举例
  2. 用于填补数据横向合并(merge)造成的缺失值
  3. 其他面板数据缺失值问题,因此特别适用于使用面板数据较多的研究领域,如:区域经济增长,财政,公司金融,会计等

1 一个简单的例子

carryforward x, gen(y)

//  按顺序用 **x** 的非空前值填充 **y** 的缺失值
-----------
   x    y 
-----------
  12   12 
   4    4 
   .    4 
   .    4 
   .    4 
   3    3 
   .    3 
   7    7 
   .    7 
   .    7 
-----------

如果不使用 carryforward 命令,你可以借助系统变量 _n ,但效率低且易出错

2 下载安装

ssc install carryforward, replace

3 语法结构

3.1 基本语法

carryforward varlist [if] [in], gen(newvarlist) | replace

Notes: carryforward 命令支持分组计算

3.2 进阶语法

carryforward varlist [if] [in], {gen(varlist1) | replace}  ///
   [cfindic(varist2) back carryalong(varlist3) strict ///
    nonotes dynamic_condition(dyncond) extmiss]

各个选项简要解释如下:

  • gen(varlist1) 生成填充后的变量列表 varlist1,varlist 和 varlist1 是一一对应的关系,因此必须包含相同数量的变量
  • cfindic(varist2) 生成指示变量列表 varlist2,若指示变量等于 1,对应的是原始数据;若等于 0,对应的是填充数据
  • carryalong(varlist3) 对已存在的变量列表 varlist3,应用与 varlist 相同的填充规则,这意味着:
  • varlist3 中的非缺失值可能被填充
  • varlist3 中的缺失值可能不被填充
  • 必须配合 replace 选项一起使用
  • extmiss 选项仅限于数值型变量,它视扩展型缺失值 extended missing values (.a, .b, etc.) 为实际数值
  • Stata 中只有一种字符型缺失值,即""
  • Stata 中有27种数值型缺失值,默认的缺失值为sysmiss(.)
  • 另外26种数值型缺失值是:.a, .b,.c, ..., .z,即 extended missing values
  • 数值型缺失值在stata中被定义为无穷大,大小关系为:nonmissing numbers < . < .a < .b < ... < .z
连享会最新专题直播

4 实例

4.1 向后填充

sort id year 
carryforward id year, replace

4.2 向前填充

gsort id -year 
carryforward id year, replace

4.3 广义缺失值

carryforward x ,gen(x1)
carryforward y ,gen(y1)
carryforward x ,gen(x2) extmiss
carryforward y ,gen(y2) extmiss

* extmiss 选项指定 extended missing values (.a, .b, etc.) 为实际数值
* y1 是没有 extmiss 选项的填充结果,.z 等扩展型缺失值不参与向后填充
* y2 是有 extmiss 选项的填充结果,.z 等扩展型缺失值参与向后填充
  +----------------------------+
  | x    y   x1   y1   x2   y2 |
  |----------------------------|
  | 1    1    1    1    1    1 |
  | .    .    1    1    1    1 |
  | .   .z    1    1    1   .z |
  | .    .    1    1    1   .z |
  | 3    3    3    3    3    3 |
  | .   .b    3    3    3   .b |
  | .   .c    3    3    3   .c |
  | .    .    3    3    3   .c |
  | 3    3    3    3    3    3 |
  | .   .d    3    3    3   .d |
  | .    .    3    3    3   .d |
  | .    .    3    3    3   .d |
  +----------------------------+

4.4 根据 CSMAR 股本变动文件生成日股本数据

中南财经政法大学的李春涛教授有一个借助 post 命令实现的版本
在这里我尝试借助 carryforward 命令,仅用十行核心代码

//  原始数据( CSMAR 数据库股本变动文件)
---------------------------------------------------
clear
input long stkcd float date double(nshrttl nshra)
1 11415    48500171    26500000
1 11535    89751643    44988921
1 11770   134696625    67518049
1 12197   269417899   145138500
1 12599   269417899   179122251
1 12610   431068638   286595634
1 12663   431068638   297371634
1 13051   517282365   356851292
1 13296  1034564728   713934984
1 13751  1551847092  1070902476
1 14920  1945822149  1393124764
1 15263  1945822149  1409361965
1 16435  1945822149  1409361965
1 17337  2086758345  1550187787
1 17527  2086758345  1550186587
1 17528  2293407145  1756820549
1 17708  2293407145  1756791401
1 17709  2293407145  2046520536
1 17710  2388795202  2142004409
1 17836  3105433762  2784605731
1 18067  3105433762  2784593862
1 18070  3105433762  2923674599
1 18184  3105433762  2923756824
1 18185  3105433762  2924114263
1 18390  3105433762  2924114263
1 18441  3105433762  3105369975
1 18442  3485013762  3105367602
1 18627  3485013762  3105358511
1 18827  3485013762  3105358672
1 18828  5123350416  3105358672
1 19358  5123350416  3105358022
1 19523  5123350416  3105358672
1 19529  8197360665  4968573875
1 19674  8197360665  5575901875
1 19731  9520745656  5575901875
1 19880  9520745656  5575882183
1 19886 11424894787  6691058620
1 19964 11424894787  6691105775
1 19967 11424894787  9836712150
1 20191 13709873744 11804054580
1 20228 14308676139 11804054579
1 20597 14308676139 12192650323
1 20621 17170411366 14631180387
1 20828 17170411366 16917989651
1 21184 17170411366 16917983372
1 21322 17170411366 16917998790
1 21325 17170411366 17170246773
2 11351    41246700    28000000
2 11481    76970509    56518173
2 11767    92364611    67821807
end
format %tdCCYY-NN-DD date
label var stkcd "证券代码" 
label var date "股本变动日期" 
label var nshrttl "总股数 股" 
label var nshra "A股流通股数 股" 
---------------------------------------------------

//  十行代码
  sort stkcd date
  bys stkcd: keep if _n == 1
  gen last = mdy(6,29,2019)     //  今天的日期
  gen duration = last - date

  expand duration
  keep stkcd date
  sort stkcd date

  bys stkcd: replace date = date + _n - 1
  merge 1:1 stkcd date using $im, keep(1 3) nogen
  carryforward nshrttl, cfindic(change)  ///
      carryalong(nshra) replace

//  结果如下
//  cfindic(change) 生成 change 变量,当 change == 1 时代表原值为空值,被前值填充
//  carryalong(nshra) 代表 nshra 变量的缺失值填充规则跟随 nshrttl
  +---------------------------------------------------+
  | stkcd         date    nshrttl      nshra   change |
  |---------------------------------------------------|
  |     1   1991-04-03   48500171   26500000        0 |
  |     1   1991-04-04   48500171   26500000        1 |
  |     1   1991-04-05   48500171   26500000        1 |
  |     1   1991-04-06   48500171   26500000        1 |
  |     1   1991-04-07   48500171   26500000        1 |
  |     1   1991-04-08   48500171   26500000        1 |
  |     1   1991-04-09   48500171   26500000        1 |
  |     1   1991-04-10   48500171   26500000        1 |
  |     1   1991-04-11   48500171   26500000        1 |
  |     1   1991-04-12   48500171   26500000        1 |
  |     1   1991-04-13   48500171   26500000        1 |
  |     1   1991-04-14   48500171   26500000        1 |
  |     1   1991-04-15   48500171   26500000        1 |
  |     1   1991-04-16   48500171   26500000        1 |
  |     1   1991-04-17   48500171   26500000        1 |
  |     1   1991-04-18   48500171   26500000        1 |
  |     1   1991-04-19   48500171   26500000        1 |
  |     1   1991-04-20   48500171   26500000        1 |
  |     1   1991-04-21   48500171   26500000        1 |
  |     1   1991-04-22   48500171   26500000        1 |
  +---------------------------------------------------+

7 参考资料


相关课程

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

免费公开课:



课程一览
支持回看,所有课程可以随时购买观看。
连享会 - 文本分析与爬虫 - 专题视频
主讲嘉宾:司继春 || 游万海
连享会 - 效率分析专题
已上线:可随时购买学习+全套课件,课程主页 已经放置板书和 FAQs
主讲嘉宾:连玉君 | 鲁晓东 | 张宁
课程主页微信版 gitee.com/arlionn/TE
Note: 部分课程的资料,PPT 等可以前往 连享会-直播课 主页查看,下载。

关于我们
  • Stata 连享会 由中山大学连玉君老师团队创办,定期分享实证分析经验。直播间 有很多视频课程,可以随时观看。
  • 连享会-主页知乎专栏,300+ 推文,实证分析不再抓狂。
  • 公众号推文分类:计量专题 | 分类推文 | 资源工具。推文分成 内生性 | 空间计量 | 时序面板 | 结果输出 | 交乘调节 五类,主流方法介绍一目了然:DID, RDD, IV, GMM, FE, Probit 等。

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

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



编辑于 2020-09-27 20:13