查看原文
其他

Stata: 缺失值填充之 carryforward 命令

Stata连享会 Stata连享会 2020-02-10

作者:黄俊凯 (中国人民大学财政金融学院)

Stata 连享会:知乎 | 简书 | 码云 | CSDN

2019暑期Stata现场班 (连玉君+刘瑞明主讲)

特别说明

文中包含的链接在微信中无法生效。请点击本文底部左下角的【阅读原文】,转入本文【简书版】

缺失值就像灭霸,不可避免,我们能做的只有迎难而上      
今天我们介绍一个外部命令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 一个简单的例子

  1. carryforward x, gen(y)


  2. // 按顺序用 **x** 的非空前值填充 **y** 的缺失值

  3. -----------

  4. x y

  5. -----------

  6. 12 12

  7. 4 4

  8. . 4

  9. . 4

  10. . 4

  11. 3 3

  12. . 3

  13. 7 7

  14. . 7

  15. . 7

  16. -----------

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

2 下载安装

  1. ssc install carryforward, replace

3 语法结构

3.1 基本语法

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

Notes: carryforward 命令支持分组计算

3.2 进阶语法

  1. carryforward varlist [if] [in], {gen(varlist1) | replace} ///

  2. [cfindic(varist2) back carryalong(varlist3) strict ///

  3. 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 向后填充

  1. sort id year

  2. carryforward id year, replace

4.2 向前填充

  1. gsort id -year

  2. carryforward id year, replace

4.3 广义缺失值

  1. carryforward x ,gen(x1)

  2. carryforward y ,gen(y1)

  3. carryforward x ,gen(x2) extmiss

  4. carryforward y ,gen(y2) extmiss


  5. * extmiss 选项指定 extended missing values (.a, .b, etc.) 为实际数值

  6. * y1 是没有 extmiss 选项的填充结果,.z 等扩展型缺失值不参与向后填充

  7. * y2 是有 extmiss 选项的填充结果,.z 等扩展型缺失值参与向后填充

  8. +----------------------------+

  9. | x y x1 y1 x2 y2 |

  10. |----------------------------|

  11. | 1 1 1 1 1 1 |

  12. | . . 1 1 1 1 |

  13. | . .z 1 1 1 .z |

  14. | . . 1 1 1 .z |

  15. | 3 3 3 3 3 3 |

  16. | . .b 3 3 3 .b |

  17. | . .c 3 3 3 .c |

  18. | . . 3 3 3 .c |

  19. | 3 3 3 3 3 3 |

  20. | . .d 3 3 3 .d |

  21. | . . 3 3 3 .d |

  22. | . . 3 3 3 .d |

  23. +----------------------------+

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

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

  1. // 原始数据( CSMAR 数据库股本变动文件)

  2. ---------------------------------------------------

  3. clear

  4. input long stkcd float date double(nshrttl nshra)

  5. 1 11415 48500171 26500000

  6. 1 11535 89751643 44988921

  7. 1 11770 134696625 67518049

  8. 1 12197 269417899 145138500

  9. 1 12599 269417899 179122251

  10. 1 12610 431068638 286595634

  11. 1 12663 431068638 297371634

  12. 1 13051 517282365 356851292

  13. 1 13296 1034564728 713934984

  14. 1 13751 1551847092 1070902476

  15. 1 14920 1945822149 1393124764

  16. 1 15263 1945822149 1409361965

  17. 1 16435 1945822149 1409361965

  18. 1 17337 2086758345 1550187787

  19. 1 17527 2086758345 1550186587

  20. 1 17528 2293407145 1756820549

  21. 1 17708 2293407145 1756791401

  22. 1 17709 2293407145 2046520536

  23. 1 17710 2388795202 2142004409

  24. 1 17836 3105433762 2784605731

  25. 1 18067 3105433762 2784593862

  26. 1 18070 3105433762 2923674599

  27. 1 18184 3105433762 2923756824

  28. 1 18185 3105433762 2924114263

  29. 1 18390 3105433762 2924114263

  30. 1 18441 3105433762 3105369975

  31. 1 18442 3485013762 3105367602

  32. 1 18627 3485013762 3105358511

  33. 1 18827 3485013762 3105358672

  34. 1 18828 5123350416 3105358672

  35. 1 19358 5123350416 3105358022

  36. 1 19523 5123350416 3105358672

  37. 1 19529 8197360665 4968573875

  38. 1 19674 8197360665 5575901875

  39. 1 19731 9520745656 5575901875

  40. 1 19880 9520745656 5575882183

  41. 1 19886 11424894787 6691058620

  42. 1 19964 11424894787 6691105775

  43. 1 19967 11424894787 9836712150

  44. 1 20191 13709873744 11804054580

  45. 1 20228 14308676139 11804054579

  46. 1 20597 14308676139 12192650323

  47. 1 20621 17170411366 14631180387

  48. 1 20828 17170411366 16917989651

  49. 1 21184 17170411366 16917983372

  50. 1 21322 17170411366 16917998790

  51. 1 21325 17170411366 17170246773

  52. 2 11351 41246700 28000000

  53. 2 11481 76970509 56518173

  54. 2 11767 92364611 67821807

  55. end

  56. format %tdCCYY-NN-DD date

  57. label var stkcd "证券代码"

  58. label var date "股本变动日期"

  59. label var nshrttl "总股数 股"

  60. label var nshra "A股流通股数 股"

  61. ---------------------------------------------------


  62. // 十行代码

  63. sort stkcd date

  64. bys stkcd: keep if _n == 1

  65. gen last = mdy(6,29,2019) // 今天的日期

  66. gen duration = last - date


  67. expand duration

  68. keep stkcd date

  69. sort stkcd date


  70. bys stkcd: replace date = date + _n - 1

  71. merge 1:1 stkcd date using $im, keep(1 3) nogen

  72. carryforward nshrttl, cfindic(change) ///

  73. carryalong(nshra) replace


  74. // 结果如下

  75. // cfindic(change) 生成 change 变量,当 change == 1 时代表原值为空值,被前值填充

  76. // carryalong(nshra) 代表 nshra 变量的缺失值填充规则跟随 nshrttl

  77. +---------------------------------------------------+

  78. | stkcd date nshrttl nshra change |

  79. |---------------------------------------------------|

  80. | 1 1991-04-03 48500171 26500000 0 |

  81. | 1 1991-04-04 48500171 26500000 1 |

  82. | 1 1991-04-05 48500171 26500000 1 |

  83. | 1 1991-04-06 48500171 26500000 1 |

  84. | 1 1991-04-07 48500171 26500000 1 |

  85. | 1 1991-04-08 48500171 26500000 1 |

  86. | 1 1991-04-09 48500171 26500000 1 |

  87. | 1 1991-04-10 48500171 26500000 1 |

  88. | 1 1991-04-11 48500171 26500000 1 |

  89. | 1 1991-04-12 48500171 26500000 1 |

  90. | 1 1991-04-13 48500171 26500000 1 |

  91. | 1 1991-04-14 48500171 26500000 1 |

  92. | 1 1991-04-15 48500171 26500000 1 |

  93. | 1 1991-04-16 48500171 26500000 1 |

  94. | 1 1991-04-17 48500171 26500000 1 |

  95. | 1 1991-04-18 48500171 26500000 1 |

  96. | 1 1991-04-19 48500171 26500000 1 |

  97. | 1 1991-04-20 48500171 26500000 1 |

  98. | 1 1991-04-21 48500171 26500000 1 |

  99. | 1 1991-04-22 48500171 26500000 1 |

  100. +---------------------------------------------------+

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?

关于我们

  • Stata 连享会(公众号:StataChina)】由中山大学连玉君老师团队创办,旨在定期与大家分享 Stata 应用的各种经验和技巧。

  • 公众号推文同步发布于 CSDN-Stata连享会 、简书-Stata连享会 和 知乎-连玉君Stata专栏。可以在上述网站中搜索关键词StataStata连享会后关注我们。

  • 点击推文底部【阅读原文】可以查看推文中的链接并下载相关资料。

  • Stata连享会 精彩推文1  || 精彩推文2

联系我们

  • 欢迎赐稿: 欢迎将您的文章或笔记投稿至Stata连享会(公众号: StataChina),我们会保留您的署名;录用稿件达五篇以上,即可免费获得 Stata 现场培训 (初级或高级选其一) 资格。

  • 意见和资料: 欢迎您的宝贵意见,您也可以来信索取推文中提及的程序和数据。

  • 招募英才: 欢迎加入我们的团队,一起学习 Stata。合作编辑或撰写稿件五篇以上,即可免费获得 Stata 现场培训 (初级或高级选其一) 资格。

  • 联系邮件: StataChina@163.com

往期精彩推文



欢迎加入Stata连享会(公众号: StataChina)

2019暑期“实证研究方法与经典论文”专题班

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

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