清洗CFPS:两步搞定中国家庭追踪调查数据清洗

发布时间:2021-06-05 阅读 11470

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

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

New! lianxh 命令发布了:
随时搜索推文、Stata 资源。安装命令如下:
. ssc install lianxh
详情参见帮助文件 (有惊喜):
. help lianxh

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

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

⛳ Stata 系列推文:

PDF下载 - 推文合集

作者:冷萱 (西南财经大学)
邮箱lx@smail.swufe.edu.cn


目录


1. 数据介绍

中国家庭追踪调查 (China Family Panel Studies,CFPS) 旨在通过跟踪收集个体、家庭、社区三个层次的数据,反映中国社会、经济、人口、教育和健康的变迁,为学术研究和公共政策分析提供数据基础。其最新的相关数据如下:

  • CFPS2018 数据已于 2020 年 12 月更新,包括经济库、个人库、少儿家长代答库;
  • 跨年个人核心变量库于 2021 年 4 月发布。

关于数据的申请,可以查看「申请指南」。当然,也可以查看连享会推文「Stata数据处理:清洗CFPS数据库」。尽管连享会已有相关推文,但我想分享一下自己处理 CFPS 的方法,以供读者参考。

关于该数据库更多详细介绍,请访问「中国家庭追踪调查网站」

2. 常规思路

由于 CFPS 是对家庭进行的全面且系统的调查,问卷信息量非常大,因此 CFPS 将整个数据划分成了几个数据集。其中,最常使用的数据集是家庭经济问卷和成人问卷。为获取上述问卷的合并面板数据,我先们按照以下常规思路对 CFPS 数据进行清理:

  • 第一,先将成人问卷中所需变量逐年清理,保留个人识别码 pid、家庭识别码 fid、以及清理后的变量;
  • 第二,纵向合并 2010-2018 年清理后的成人问卷,得到个体层面面板数据;
  • 第三,将家庭问卷中所需变量逐年清理,保留家户代码 fid 和清理后得到变量;
  • 第四,纵向合并 2010-2018 年清理后的家庭问卷,得到家庭层面面板数据;
  • 第五,根据年份 year 和家户识别码 fid 横向合并家庭层面面板数据和个体层面面板数据,得到研究所需的家户-个体层面 2010-2018 年面板数据。

以上的清理方式比较繁琐,需要自己先进行构思,搭建框架。此外,一些关键数据的缺失,或存在异常值也是上述过程面临的重要问题。

3. 根据跨年个人核心变量库清理

跨年个人核心变量库于 2021 年 4 月发布,这给我们清理数据提供了新的思路,即将其他数据与跨年个人核心变量进行匹配。

3.1 跨年个人核心变量库

跨年个人核心变量库是个人层面的数据集,即每一条记录 (数据集中的每一行) 代表一位在任意调查轮次进入 CFPS 样本的个人。他们不仅包括 CFPS 基因成员,也包括核心成员和非核心成员。其中,CFPS 的基因成员是指经 2010 年基线调查界定出来的,与家庭有血缘/婚姻/领养关系的所有家庭成员,这些基因成员今后新生的血缘/领养子女同样被视为基因成员。

基因成员是 CFPS 的永久追踪对象。从 2012 年追踪调查开始,基因成员在家中的非基因直系亲属 (父母、配偶、子女) 被定义为当期调查的核心成员,而既不是基因成员也不是核心成员的家庭成员被被定义为非核心成员。CFPS 的家庭以是否存在经济联系来进行界定,并不要求成员们居住在同一地址。

关于跨年个人核心变量库的更多详细介绍,可以查阅官方文档「CFPS-40 中国家庭追踪调查跨年个人核心变量库清理报告」

3.2 跨年个人核心变量库概览

. use cfps2018crossyearid_202104.dta, clear
. des, replace
. keep position name type varlab
. list, noobs clean compress


Contains data from cfps2018crossyearid_202104.dta
obs:        74,130                          
vars:           95          16 Apr 2021 11:09

pos~n           name	type	varlab	 
1               pid	double	个人id	 
2            birthy	double	出生年-跨年清理版	 
3            gender	double	性别-跨年清理版	 
4         ethnicity	double	民族-跨年整合版	 
5         entrayear	double	个人样本首次进入CFPS年份	 
6       fidbaseline	double	基线源头家户号	 
7               psu	double	基线源头家户号对应的PSU	 
8         subsample	double	基线源头家户号是否在全国再抽样样本中	 
9     subpopulation	double	基线源头家户号对应的抽样子总体	 
10             fid10	double	CFPS2010家户号	 
11             fid12	double	CFPS2012家户号	 
12             fid14	double	CFPS2014家户号	 
13             fid16	double	CFPS2016家户号	 
14             fid18	double	CFPS2018家户号	 
15          deceased	double	截至最近一次调查,是否被报死亡	 
16        death_year	double	死亡时间(年)	 
17       death_month	double	死亡时间(月)	 
18   deathcause_code	str14	死亡原因编码	 
19        inroster10	double	是否在CFPS2010家庭关系库中	 
20       indsurvey10	double	CFPS2010的个人数据集类型	 
21         selfrpt10	double	CFPS2010是否存在个人自答问卷	 
22          co_a10_p	double	CFPS2010时个人与fid10是否在经济上是一家	 
23         tb6_a10_p	double	CFPS2010个人是否在fid10住	 
24       marriage_10	double	CFPS2010的婚姻状态	 
25       cfps2010edu	double	CFPS2010的个人最高学历	 
26       cfps2010sch	double	CFPS2010的个人在读/离校阶段	 
27      cfps2010eduy	double	CFPS2010的个人教育年限	 
28   cfps2010eduy_im	double	CFPS2010的个人教育年限-插补值	 
29           urban10	double	基于国家统计局资料的城乡分类变量(2010)	 
30              hk10	double	CFPS2010户口状况	 
31        inroster12	double	是否在CFPS2012家庭关系库中	 
32       indsurvey12	double	CFPS2012的个人数据集类型	 
33         selfrpt12	double	CFPS2012是否存在个人自答问卷	 
34          co_a12_p	double	CFPS2012时个人与fid12是否在经济上是一家	 
35         tb6_a12_p	double	CFPS2012个人是否在fid12住	 
36       marriage_12	double	CFPS2012的婚姻状态	 
37       cfps2012edu	double	CFPS2012的个人最高学历	 
38       cfps2012sch	double	CFPS2012的个人在读/离校阶段	 
39      cfps2012eduy	double	CFPS2012的个人教育年限	 
40   cfps2012eduy_im	double	CFPS2012的个人教育年限-插补值	 
41           urban12	double	基于国家统计局资料的城乡分类变量(2012)	 
42              hk12	double	CFPS2012户口状况	 
43          employ12	double	CFPS2012就业状态	 
44       genetype12r	double	2012年基因成员类型	 
45      coremember12	double	CFPS2012年是否是核心成员	 
46           alive12	double	个人CFPS2012时是否健在	 
47        inroster14	double	是否在CFPS2014家庭关系库中	 
48       indsurvey14	double	CFPS2014的个人数据集类型	 
49         selfrpt14	double	CFPS2014是否存在个人自答问卷	 
50          co_a14_p	double	CFPS2014时个人与fid14是否在经济上是一家	 
51         tb6_a14_p	double	CFPS2014个人是否在fid14住	 
52       marriage_14	double	CFPS2014的婚姻状态	 
53       cfps2014edu	double	CFPS2014的个人最高学历	 
54       cfps2014sch	double	CFPS2014的个人在读/离校阶段	 
55      cfps2014eduy	double	CFPS2014的个人教育年限	 
56   cfps2014eduy_im	double	CFPS2014的个人教育年限-插补值	 
57           urban14	double	基于国家统计局资料的城乡分类变量(2014)	 
58              hk14	double	CFPS2014户口状况	 
59          employ14	double	CFPS2014就业状态	 
60        genetype14	double	CFPS2014基因成员类型	 
61      coremember14	double	CFPS2014年是否是核心成员	 
62           alive14	double	个人CFPS2014时是否健在	 
63        inroster16	double	是否在CFPS2016家庭关系库中	 
64       indsurvey16	double	CFPS2016的个人数据集类型	 
65         selfrpt16	double	CFPS2016是否存在个人自答问卷	 
66          co_a16_p	double	CFPS2016时个人与fid16是否在经济上是一家	 
67         tb6_a16_p	double	CFPS2016个人是否在fid16住	 
68       marriage_16	double	CFPS2016的婚姻状态	 
69       cfps2016edu	double	CFPS2016的个人最高学历	 
70       cfps2016sch	double	CFPS2016的个人在读/离校阶段	 
71      cfps2016eduy	double	CFPS2016的个人教育年限	 
72   cfps2016eduy_im	double	CFPS2016的个人教育年限-插补值	 
73           urban16	double	基于国家统计局资料的城乡分类变量(2016)	 
74              hk16	double	CFPS2016户口状况	 
75          employ16	double	CFPS2016就业状态	 
76        genetype16	double	CFPS2016基因成员类型	 
77      coremember16	double	CFPS2016年是否是核心成员	 
78           alive16	double	个人CFPS2016时是否健在	 
79        inroster18	double	是否在CFPS2018家庭关系库中	 
80       indsurvey18	double	CFPS2018的个人数据集类型	 
81         selfrpt18	double	CFPS2018是否存在个人自答问卷	 
82          co_a18_p	double	个人是否与该家庭经济上是一家人	 
83         tb6_a18_p	double	CFPS2018个人是否在fid18住	 
84       marriage_18	double	CFPS2018的婚姻状态	 
85       cfps2018edu	double	CFPS2018的个人最高学历	 
86       cfps2018sch	double	CFPS2018的个人在读/离校阶段	 
87      cfps2018eduy	double	CFPS2018的个人教育年限	 
88   cfps2018eduy_im	double	CFPS2018的个人教育年限-插补值	 
89           urban18	double	基于国家统计局资料的城乡分类变量(2018)	 
90              hk18	double	CFPS2018户口状况	 
91          employ18	double	CFPS2018就业状态	 
92        genetype18	double	CFPS2018基因成员类型	 
93      coremember18	double	CFPS2018年是否是核心成员	 
94           alive18	double	个人CFPS2018时是否健在	 
95    releaseversion	double	发布版本	 

可以看出,cfps2018crossyearid_202104.dta 数据集信息如下:

  • 数据集共有 74130 个样本 (也就是说从 2010-2018 共访问了 74130 个不同个体);
  • 数据集共有 95 个变量;
  • 数据版本为 2021 年 4 月。

该数据集涵盖了 74130 个受访者,并且调查变量分为两大部分:

  • 随时间变化的变量,如 fid10fid12fid14 等,表示个体 pid 对应年份的家户代码 fid
  • 不随时间变化的变量,如 pidbirthygender 等。

3.3 使用 sreshape 命令进行转置

本文的核心就是通过转置的命令,将数据从宽转为长,然后得到个体层面 2010-2018 的面板数据。

. use cfps2018crossyearid_202104.dta, clear

. *sreshape long后面添加需要转置的变量
. *如果年份信息在变量最后,如fid10,则可以直接写fid
. *如果年份信息在变量名中间,如co_a10_p,则用@代替年份信息
. sreshape long fid inroster indsurvey selfrpt  co_a@_p         ///
>          tb6_a@_p marriage_ cfps20@edu cfps20@sch cfps20@eduy ///
>          cfps20@eduy_im urban hk employ  genetype@r           ///
>          coremember  alive, i(pid) j(year)
  
. *整理年份信息,新生成的年份是从变量中识别出来的
. *变量中仅有10\12\14\16\18,
. *因此需要以下步骤转换为2010\2012\2014\2016\2018
. replace year=2000+year 

. *新生成的变量名太不友好,统一重命名
. rename * (pid year birthy gender ethnicity     ///
>           entrayear fidbaseline psu            ///
>           subsample subpopulation fid          ///
>           deceased death_year death_month      ///
>           deathcause_code inroster indsurvey   ///
>           selfrpt coeco_pid colive_pid         ///
>           marriage edulevel sch eduyear        ///
>           eduyear_im urban hk genetype14       ///
>           genetype16 genetype18 releaseversion ///          
>           employ genetype coremember alive)
        
. *变量加标签
.     label var   pid                "[个人ID]"
.     label var   year               "[调查年份]"
.     label var   birthy             "[出生年份]"
.     label var   gender             "[性别:男性=1]"
.     label var   ethnicity          "[民族]"
.     label var   entrayear          "[个体样本首次进入CFPS年份]"
.     label var   deceased           "[是否死亡]"
.     label var   death_year         "[是否时间(年)]"
.     label var   death_year         "[死亡时间(年)]"
.     label var   death_month        "[死亡时间(月)]"
.     label var   deathcause_code    "[死亡原因(编码)]"
.     label var   fid                "[CFPS家户号]"
.     label var   inroster           "[是否在CFPS家户关系库中]"
.     label var   indsurvey          "[个人数据集类型]"
.     label var   selfrpt            "[是否存在个人自答问卷]"
.     label var   coeco_pid          "[与pid在经济上是否为一家]"
.     label var   colive_pid         "[与pid是否同住]"
.     label var   marriage           "[婚姻状况]"
.     label var   edulevel           "[个人最高学历]"
.     label var   sch                "[个人在读/离校阶段]"
.     label var   eduyear            "[个人教育年限]"
.     label var   eduyear_im         "[个人教育年限-插补值]"
.     label var   hk                 "[户口状况]"
.     label var   employ             "[就业状态]"
.     label var   genetype           "[基因成员类型]"
.     label var   coremember         "[是否核心成员]"
.     label var   alive              "[是否健在]"
.     label var  fidbaseline         "[基线源头家户号]"
.     label var   psu                "[基线源头家户号对应PSU]"
.     label var   subsample          "[基线源头家户号是否在全国再抽样样本中]"
.     label var   subpopulation      "[基线源头家户号对应的抽样子总体]"
.     label var   releaseversion     "[发布版本]"

. save ind2010-2018.dta, replace

完成上述过程后,我们会得到一份 370650 个样本的面板数据。如果用过 CFPS,你一定会发现样本量是错误的。

实际上,该样本通过 370650=74130*5 得到,其中 74130 是初始样本量,5 是年数。如果是平衡面板,基期就有 74130 个样本,那么样本量是没有问题的。事实上,CFPS 基期只有 30000 个样本左右,后续会有新进入或者退出的样本。也就是说,上述得到的结果,某些年份个体可能没有被访问。如何清理这一部分个体呢?跨年度数据集添加了 selfrpt 变量,通过保留 selfrpt=1 的样本即可。

. tab  selfrpt

    [是否存 |
     在个人 |
     自答问 |
        卷] |      Freq.     Percent        Cum.
------------+-----------------------------------
         -8 |    149,025       40.21       40.21
          0 |     43,826       11.82       52.03
          1 |    177,799       47.97      100.00
------------+-----------------------------------
      Total |    370,650      100.00

. keep if selfrpt==1

保留 selfrpt=1 的样本后,样本量为 177799 个,与 CFPS 每一年个体样本数量相加后的结果保持一致了。同时我们也得到了 CFPS 个体层面核心变量的面板数据。

最后,也可以看一下清理好的 CFPS2010-2018 核心变量面板数据。两步能搞定的信息的确不多,但好处是搭建了一个框架,为后续数据匹配工作提供了方便。

4. 相关推文

Note:产生如下推文列表的 Stata 命令为:
lianxh cfps reshape 转换, m
安装最新版 lianxh 命令:
ssc install lianxh, replace

相关课程

免费公开课

最新课程-直播课

专题 嘉宾 直播/回看视频
最新专题 文本分析、机器学习、效率专题、生存分析等
研究设计 连玉君 我的特斯拉-实证研究设计-幻灯片-
面板模型 连玉君 动态面板模型-幻灯片-
面板模型 连玉君 直击面板数据模型 [免费公开课,2小时]
  • Note: 部分课程的资料,PPT 等可以前往 连享会-直播课 主页查看,下载。

课程主页

课程主页

关于我们

  • Stata连享会 由中山大学连玉君老师团队创办,定期分享实证分析经验。
  • 连享会-主页知乎专栏,400+ 推文,实证分析不再抓狂。直播间 有很多视频课程,可以随时观看。
  • 公众号关键词搜索/回复 功能已经上线。大家可以在公众号左下角点击键盘图标,输入简要关键词,以便快速呈现历史推文,获取工具软件和数据下载。常见关键词:课程, 直播, 视频, 客服, 模型设定, 研究设计, stata, plus, 绘图, 编程, 面板, 论文重现, 可视化, RDD, DID, PSM, 合成控制法

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

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

✏ 连享会-常见问题解答:
https://gitee.com/lianxh/Course/wikis

New! lianxh 命令发布了:
随时搜索连享会推文、Stata 资源,安装命令如下:
. ssc install lianxh
使用详情参见帮助文件 (有惊喜):
. help lianxh