1. 项目背景与数据准备
CFPS(中国家庭追踪调查)作为国内权威的微观家庭数据库,其复杂的数据结构常常让研究者面临数据清洗的挑战。去年我在研究政府转移支付对居民消费的影响时,曾花费两周时间与CFPS的原始数据"搏斗",今天就把这套经过实战检验的Stata处理方案分享给大家。
1.1 CFPS数据结构特点
CFPS数据采用分层问卷设计,其核心特征包括:
- 多年度追踪面板(2010-2020共6期)
- 家庭/个人/社区三维数据关联
- 变量命名采用"模块前缀+问题编号"规则(如fid代表家庭ID)
- 缺失值采用"-9"、"-1"等特殊编码
重要提示:2020年CFPS首次采用CAPI电子问卷,数据结构与往期存在差异,合并时需特别注意
1.2 基础环境配置
建议使用Stata 17+版本处理CFPS数据,关键配置如下:
stata复制set more off // 关闭分页显示
set maxvar 10000 // 扩展变量上限
set excelxlsx largefile on // 处理大体积Excel
数据下载后应按年度建立如下目录结构:
code复制CFPS/
├── raw/ // 原始数据
├── cleaned/ // 清洗后数据
└── docs/ // 问卷手册与代码簿
2. 数据导入与变量处理
2.1 智能导入方案
针对CFPS的.dta和.csv格式数据,推荐使用动态导入方法:
stata复制// 自动识别文件格式
capture confirm file "raw/2020adult.dta"
if !_rc {
use "raw/2020adult.dta", clear
}
else {
import delimited "raw/2020adult.csv", encoding(UTF-8) clear
}
2.2 政府转移支付变量提取
转移支付相关变量分散在不同模块,核心变量包括:
- 养老金:
fid, pid, qg307 - 低保金:
fid, qa701_s_1 - 农业补贴:
fid, qg801
合并策略示例:
stata复制egen transfer_pension = rowtotal(qg307_*), missing
replace transfer_pension = . if transfer_pension <= 0 // 处理异常值
2.3 缺失值处理技巧
CFPS的缺失值处理需要分层判断:
stata复制foreach var of varlist qg307* {
replace `var' = . if inlist(`var', -9, -1, -8) // 系统缺失
replace `var' = 0 if `var' == -2 // "没有此项收入"转为0
}
3. 数据清洗实战
3.1 家庭面板匹配
CFPS的家庭追踪需要跨年度匹配:
stata复制merge 1:1 fid using "cleaned/2018family.dta", ///
keepusing(fid provcd countyid) nogen
经验:2014年家庭ID编码规则变更,需使用
fid14变量进行跨年匹配
3.2 异常值检测方案
针对转移支付金额的校验:
stata复制// 金额合理性检验
sum transfer_total, detail
list fid pid transfer_total if transfer_total > r(p99) & !missing(transfer_total)
// 逻辑校验
gen flag = (transfer_pension > 0 & age < 60) // 非退休年龄领养老金
3.3 通货膨胀调整
跨年度分析必须进行价格平减:
stata复制merge m:1 year using "docs/CPI_adj.dta", ///
keepusing(cpi) nogen
replace transfer_pension = transfer_pension / cpi * 100 // 以2010年为基期
4. 分析数据库构建
4.1 关键指标计算
构建家庭人均转移支付指标:
stata复制bysort fid: egen hh_size = count(pid) // 家庭规模
gen transfer_pc = transfer_total / hh_size
4.2 平衡面板处理
创建平衡面板数据:
stata复制xtset fid year
tsfill, full // 填充缺失年份
bysort fid: drop if _N < 3 // 保留至少3期观测
4.3 数据导出规范
最终分析数据集应包含:
stata复制keep fid pid year provcd countyid transfer_* hh_size
order fid pid year // 关键ID排序
save "cleaned/transfer_analysis.dta", replace
5. 常见问题排查
5.1 变量匹配失败
典型报错与解决方案:
| 问题现象 | 排查步骤 | 解决方法 |
|---|---|---|
| 家庭ID无法匹配 | 检查fid变量类型 |
tostring fid, replace |
| 跨年度样本流失 | 比较tab year分布 |
使用cfps_track模块追踪 |
5.2 内存溢出处理
大样本处理技巧:
stata复制preserve
keep if year == 2020 // 分年度处理
...
restore
5.3 跨版本兼容问题
针对不同CFPS版本的应对策略:
- 2010-2014:注意货币单位(元 vs 千元)
- 2016起:新增
wave变量标记调查轮次 - 2020:电子问卷导致变量命名变化
6. 分析建议与扩展
6.1 转移支付研究设计
可拓展的分析维度:
- 城乡差异:
tab provcd, gen(prov) - 时间趋势:
xtline transfer_pc, overlay - 收入分组:
xtile income_group = income, nq(5)
6.2 效率优化技巧
提升处理速度的方法:
stata复制// 使用frame处理大数据
frame create temp
frame temp {
use "raw/2020family.dta", clear
...
}
6.3 自动化脚本设计
建议建立标准化处理流程:
stata复制/* 注释规范示例
[功能] 转移支付数据清洗
[输入] raw/2020family.dta
[输出] cleaned/transfer_2020.dta
[作者] 更新日期 */
这套方案在多个省级财政政策评估项目中得到验证,处理过300GB+的CFPS原始数据。有个细节值得注意:2018年问卷中农业补贴的题项从qg801改为qg901,这类变动需要对照代码簿仔细核查。对于追踪样本流失问题,可以尝试使用逆概率加权(IPW)方法进行调整,这在评估政策效应时尤为重要。