做CHFS数据处理,最让人头痛的往往不是模型怎么跑,而是数据怎么从一坨原始问卷变成能直接回归的面板。前阵子我把2015到2019年三轮CHFS的清洗过程完整录成了视频,配套的do文件也一并放了出来,很多朋友留言说“原来你也是这样处理的”“早点看到这个能省三天时间”。这里就把视频里没法展开的细节、以及录制之后又补充的一些操作经验,写成一篇完整的长文。无论你是刚开始接触CHFS的小白,还是已经被脏数据折磨到想放弃的资深用户,这篇文章都值得收藏。
所谓CHFS,全称是中国家庭金融调查,由西南财经大学中国家庭金融调查与研究中心组织,目前公开的年份包含2011、2013、2015、2017、2019等轮次。我做的是2015到2019年的三轮追踪数据,因为这三年的问卷结构相对稳定,而且正好覆盖了家庭金融领域最常用的一批指标。数据清洗听起来是个体力活,实际上它决定了你后面所有回归结果的可靠性。变量名不统一、样本权重对不上、家庭成员编号错位、收入口径混乱,任何一个环节没处理好,结果都可能完全跑偏。这篇文章我会按照自己实际清洗的顺序,把整体框架、核心变量处理、跨年合并、以及Stata和Python结合使用的思路全部过一遍。
1. 为什么CHFS数据必须系统化清洗:从原始问卷到可用面板的差距
1.1 原始数据的问题不是“脏”,而是“不在分析形态”
很多第一次拿到CHFS数据的人会有个错觉:既然官方已经发布了Stata格式的dta文件,是不是直接merge就能用了?我最初也这么以为,结果发现原始CHFS数据虽然字段齐全,但它的组织方式完全是“问卷导向”而不是“分析导向”。
举几个最典型的例子。家庭资产部分,同一套房子的房产价值、剩余房贷、房产数量是存放在不同模块里的,你要算“净房产”就得自己拼。收入部分,工资性收入、经营性收入、转移性收入分散在几十个变量里,稍微口径不一致,加总出来的总收入就可能是错的。更麻烦的是家庭成员信息,个人编号pid在追踪样本里有可能是变化的,你必须搞清楚“同一个pid是否等于同一个人”。
这些问题并不会显示成明显的缺漏或乱码,所以用肉眼去看数据,你可能觉得“挺干净啊”。但一旦你开始做描述性统计,就会发现家庭收入居然有负十几万的样本,资产分位数莫名其妙地不对,甚至同一个人在2015年和2017年的年龄差不是2岁。这些都不是数据输入错误,而是清洗策略没有对齐字段的口径和计算方式。
1.2 没有清洗流程,等于把结论建立在不牢的地基上
如果你只是随便跑个相关性分析,也许脏数据不会立刻给你难堪。可CHFS这类大型微观调查数据,最终几乎都会用于家庭金融、消费储蓄、资产配置等领域的实证研究。审稿人对数据清洗的结果极其敏感,尤其财富不平等、收入差距这类主题,样本里一旦混入明显的异常值,结论就可能被推翻。
我见过有同学直接把家庭总收入大于零的样本全部保留,结果均值被几个超高净值家庭拉得离谱。原因很简单,问卷里金融资产、非金融资产收集得很细,但内部逻辑检查文件并不强制要求你去处理那些“填报时把单位填成万元、结果和其他人不在一个量纲上”的记录。这些都需要清洗阶段处理。
所以,系统化清洗的第一价值其实不是“删掉问题样本”,而是建立一套可追溯、可重复的规则。每个变量如何生成、哪些样本被排除、为什么排除,都要有明确说明。这样到最后跑回归的时候,你才敢拍着胸脯说:这个是真实的数据效应,而不是清洗过程的副产品。
1.3 基于do文件构建清洗流水线的好处
既然要系统化,就必须有工具和流程。我选择以Stata的do文件作为主清洗流程,原因有几个:
- Stata是绝大多数经管领域研究者的主力工具,do文件随时可改可跑。
- CHFS官方发布的dta是Stata格式,变量标签、值标签都比较完整,Stata里处理最自然。
- 清洗过程涉及大量条件判断和替换,do文件的日志功能可以完整记录每一步,方便回归前自查。
视频里演示的do文件就是按“原始数据文件夹路径设置—导入历年数据—变量统一命名—生成核心指标—合并面板—异常值处理—保存干净数据”的顺序来的。这套流程我会在后面的章节里逐步拆开讲。如果你更习惯用Python,其实也可以用pandas搭配numpy做同样的事情,只是Stata在样本筛选和描述性统计的交互体验上仍然有优势。我自己的做法是主流程用Stata,遇到复杂的长宽表格转换再用pandas补一刀,两种工具并不冲突。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 2015-2019年三轮数据概况与do文件设计起点
2.1 历年数据文件的组成和核心文件定位
CHFS每年发布的数据包里通常包含多个dta文件,常见的有:家庭数据文件(hh)、个人数据文件(ind)、以及部分年份的主样本数据文件。从我录教程时用的2015年和2017年数据来看,最核心的就是家庭成员信息表、家庭收支资产表、保险保障表等模块。
我开始清洗时做的第一件事
