Stata: 缺失值填充之 carryforward 命令
作者:黄俊凯 (中国人民大学财政金融学院)
Stata 连享会: 知乎 | 简书 | 码云 | CSDN
连享会 最新专题 直播
Note: 助教招聘信息请进入「课程主页」查看。
http://qr32.cn/BlTL43 (二维码自动识别)
https://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
特别适用于以下三个场景:
- 根据变动事件构造每一期的数据,下文会举例
- 用于填补数据横向合并(
merge
)造成的缺失值 - 其他面板数据缺失值问题,因此特别适用于使用面板数据较多的研究领域,如:区域经济增长,财政,公司金融,会计等
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 参考资料
- How can I “fill down”/expand observations with respect to a time
- Carryforward data for a limited number of rows - Statalist
- carryforward——填充缺失值| Stata-Club
- 李春涛:Post 命令处理股本变动
- CARRYFORWARD: Stata module to carry forward previous observations
- How can I replace missing values with previous or following nonmissing values or within sequences?
相关课程
连享会-直播课 上线了!
http://lianxh.duanshu.com
免费公开课:
- 直击面板数据模型 - 连玉君,时长:1 小时 40 分钟
- Stata 33 讲 - 连玉君, 每讲 15 分钟.
- 部分直播课 课程资料下载 (PPT,dofiles 等)
课程一览
支持回看,所有课程可以随时购买观看。
连享会 - 文本分析与爬虫 - 专题视频
主讲嘉宾:司继春 || 游万海
连享会 - 效率分析专题
已上线:可随时购买学习+全套课件,课程主页 已经放置板书和 FAQs
主讲嘉宾:连玉君 | 鲁晓东 | 张宁
课程主页,微信版 https://gitee.com/arlionn/TE
Note: 部分课程的资料,PPT 等可以前往 连享会-直播课 主页查看,下载。
关于我们
- Stata 连享会 由中山大学连玉君老师团队创办,定期分享实证分析经验。直播间 有很多视频课程,可以随时观看。
- 连享会-主页 和 知乎专栏,300+ 推文,实证分析不再抓狂。
- 公众号推文分类:计量专题 | 分类推文 | 资源工具。推文分成 内生性 | 空间计量 | 时序面板 | 结果输出 | 交乘调节 五类,主流方法介绍一目了然:DID, RDD, IV, GMM, FE, Probit 等。
连享会小程序:扫一扫,看推文,看视频……
扫码加入连享会微信群,提问交流更方便
编辑于 2020-09-27 20:13