3.1 本章介绍(数据清洗与变量构造)
"Good data is the foundation of good econometrics. Garbage in, garbage out.""高质量数据是优秀计量经济学研究的基础。垃圾进,垃圾出。"— Joshua Angrist & Jörn-Steffen Pischke, 2021 Nobel Laureates (2021年诺贝尔经济学奖得主)
从原始数据到因果推断:计量研究的基石
为什么这一章是计量经济学的生死线?
诺贝尔奖级别的教训:数据错误如何摧毁政策
案例 1: Reinhart-Rogoff Excel 错误 (2010-2013)
背景:
- 2010年,哈佛经济学家 Carmen Reinhart 和 Kenneth Rogoff 发表论文
- 核心结论:当政府债务超过GDP的90%时,经济增长显著下降
- 影响:多国政府据此实施紧缩政策(欧洲、美国、IMF政策建议)
数据错误:
1. Excel 公式错误:遗漏5个国家数据(新西兰、澳大利亚、加拿大等)
2. 选择性权重:不恰当地对不同国家赋予不同权重
3. 异常值处理不当:未剔除战后特殊时期数据后果:
- 2013年,马萨诸塞大学研究生 Thomas Herndon 发现错误
- 重新分析后:结论被完全推翻
- 债务>90%的国家平均增长率为 2.2%,而非 -0.1%
- 政策影响:欧洲紧缩政策导致失业率飙升、经济衰退加剧
文献:
Herndon, T., Ash, M., & Pollin, R. (2014). "Does high public debt consistently
stifle economic growth? A critique of Reinhart and Rogoff." Cambridge Journal
of Economics, 38(2), 257-279.案例 2: 微软 Tay 聊天机器人的数据灾难 (2016)
问题:未清洗的训练数据包含大量仇恨言论 后果:机器人上线16小时后就发布种族主义、性别歧视言论 教训:数据质量直接决定模型行为
案例 3: 2020美国大选民调误差
数据问题:
- 样本选择偏误:线上调查遗漏特定人群
- 加权方案不当:未充分考虑教育-党派交互效应
- 缺失值处理:简单删除导致系统性偏误
教训:看似"干净"的调查数据仍需仔细检查和调整
数据清洗在因果推断中的核心地位
潜在结果框架下的数据质量
Rubin 因果模型 (Rubin Causal Model, RCM):
对于个体 ,定义:
其中:
- :处理组潜在结果
- :控制组潜在结果
- :处理指示变量
平均处理效应 (ATE):
数据质量如何影响因果推断?
1. 缺失值与选择偏误 (Selection Bias)
问题:如果 或 的缺失与潜在结果相关(MNAR),则:
示例:
# 高收入者更可能拒绝回答收入问题
# → 样本中收入数据向低收入倾斜
# → 教育回报率估计偏低数学证明:
设缺失指示变量 (1=缺失),若缺失非随机 (MNAR):
则样本平均因果效应:
存在选择偏误:
2. 异常值与遗漏变量偏误 (OVB)
问题:极端值可能反映未观测的混杂变量
示例:CEO年薪异常值可能反映公司规模、行业特征
OLS 偏误公式:
其中 是遗漏变量。异常值会放大 ,导致偏误扩大。
3. 测量误差与衰减偏误 (Attenuation Bias)
经典测量误差模型:
真实模型:
观测模型(含测量误差):
OLS 估计:
其中 是信度比 (reliability ratio)。
结论:测量误差导致系数向零衰减,低估真实效应!
Missing Data Theory: Little & Rubin 框架
缺失数据的数学结构
完整数据矩阵
缺失指示矩阵 :
缺失机制的三种类型
1. MCAR (Missing Completely At Random)
定义:缺失概率与所有变量(包括自身)无关
数学表达:
示例:
- 问卷调查中,受访者随机遗漏某些问题(非故意)
- 实验室设备随机故障导致数据丢失
处理策略:完全案例分析 (listwise deletion) 仍然无偏
证明:
2. MAR (Missing At Random)
定义:缺失概率仅依赖于观测数据,与未观测数据无关
数学表达:
示例:
- 高学历者更可能拒绝回答收入问题
- 缺失概率依赖于"教育"(可观测),而非"收入"本身
处理策略:条件填充、多重插补 (Multiple Imputation)
Rubin's Rules for Multiple Imputation:
设 次插补后估计为 ,方差为 :
- 点估计:
- 总方差:
- 自由度:
3. MNAR (Missing Not At Random)
定义:缺失概率依赖于未观测数据本身
数学表达:
示例:
- 抑郁症患者更可能退出心理健康调查
- 缺失概率依赖于"抑郁程度"(未观测)
处理策略:
- 敏感性分析 (Sensitivity Analysis)
- 选择模型 (Selection Models)
- 模式混合模型 (Pattern-Mixture Models)
- 工具变量 (Instrumental Variables)
Heckman 两步法 (Heckman, 1979, Nobel Prize 2000):
步骤1 - 选择方程 (Probit):
步骤2 - 结果方程 (OLS + IMR):
其中 是 Inverse Mills Ratio:
Little's MCAR Test
原假设: 数据为 MCAR
检验统计量:
其中:
- : 缺失模式数量
- : 第 种模式的均值向量
- : 总体均值向量
Python 实现见后文完整类**
数据质量与 SUTVA (稳定单元处理值假设)
SUTVA 的定义
Stable Unit Treatment Value Assumption:
- 无干扰 (No Interference):
- 无隐藏变量 (No Hidden Variations): 只有一个版本的处理
数据质量如何威胁 SUTVA?
1. 数据泄露导致干扰
示例:社交网络研究中,个体 的朋友圈也接受处理
违反 SUTVA:
处理:网络聚类、空间回归模型
2. 测量误差导致处理版本不一致
示例:教育年限测量误差 → 16年本科 vs 18年本科+硕士被当作同一处理
违反 SUTVA:实际上有多个处理版本
处理:工具变量、多值处理效应 (multivalued treatment effects)
本章核心内容框架
模块 1: 数据导入与质量诊断 (3.2节)
核心技能:
- 多格式数据读取 (CSV、Stata、SPSS、SQL、Parquet)
- 自动化数据质量报告生成
- 面板数据结构检查 (平衡性、时间覆盖)
Python 核心类:
class DataQualityChecker:
"""完整的数据质量自动检测系统"""
def __init__(self, df): ...
def check_missing(self): ...
def check_outliers(self): ...
def check_duplicates(self): ...
def check_panel_structure(self): ...
def generate_report(self): ...真实数据集:
- NLSY97 (美国全国青年纵向调查)
- CFPS 2018 (中国家庭追踪调查)
- World Bank Open Data
模块 2: 数据清洗与缺失值处理 (3.3节)
理论基础:
- Little & Rubin (2019) 缺失数据理论
- Rubin (1976) 多重插补框架
- Heckman (1979) 样本选择模型
核心技能:
- 缺失机制诊断 (Little's MCAR Test)
- 多重插补 (MICE Algorithm)
- 异常值稳健处理 (Winsorization、IHS变换)
- 重复值智能识别 (Fuzzy Matching)
Python 核心类:
class DataCleaner:
"""生产级数据清洗管道"""
def __init__(self, df): ...
def diagnose_missing(self): ... # MCAR/MAR/MNAR
def impute_missing(self, method='MICE'): ...
def handle_outliers(self, method='winsorize'): ...
def remove_duplicates(self, fuzzy=False): ...
def clean_strings(self): ...LaTeX 公式量: 30+
模块 3: 变量构造与处理效应 (3.4节)
理论基础:
- Angrist & Pischke (2009) 交互项解释
- Imbens & Rubin (2015) 处理效应分解
- Wooldridge (2010) 动态面板模型
核心技能:
- 虚拟变量与参照组选择
- 交互项的边际效应计算
- 滞后算子与动态面板
- 处理效应的异质性分解
Python 核心类:
class VariableConstructor:
"""计量模型变量构造器"""
def __init__(self, df): ...
def create_dummies(self, var, drop_first=True): ...
def create_interactions(self, var1, var2): ...
def create_lags(self, var, lags=1): ...
def create_group_stats(self, var, groupby): ...
def mincer_equation_vars(self): ... # 完整Mincer方程真实案例:
- Mincer (1974) 工资方程: 15+ 变量完整构造
- Card & Krueger (1994) 最低工资: DID 变量构造
- CFPS 2018: 家庭、个人、地区三层面板变量
模块 4: 数据转换与分布调整 (3.5节)
理论基础:
- Box & Cox (1964) 功率变换
- Yeo & Johnson (2000) 扩展 Box-Cox
- Burbidge et al. (1988) IHS 变换理论
核心技能:
- 对数变换的三种解释 (弹性、方差稳定、正态化)
- Box-Cox 最优 λ 参数选择
- Inverse Hyperbolic Sine (处理零值)
- 标准化与系数可比性
Python 核心类:
class TransformationPipeline:
"""数据转换完整流程"""
def __init__(self, df): ...
def log_transform(self, var, method='natural'): ...
def boxcox_transform(self, var): ...
def ihs_transform(self, var): ... # arcsinh
def standardize(self, var, method='z-score'): ...
def optimal_lambda(self, var): ... # Box-Cox λ数学推导:
为什么对数变换稳定方差?
假设 服从对数正态分布:
则:
方差依赖于均值!但对数变换后:
模块 5: 数据合并与面板构建 (3.6节)
理论基础:
- Set Theory (集合论) 的合并类型
- Panel Data Econometrics (Wooldridge, 2010)
- Relational Database Theory (Codd, 1970)
核心技能:
- 四种 Join 类型的集合论证明
- 面板数据平衡性检验
- 时间变异处理变量构造
- 多层级数据合并 (个体-家庭-地区-省份)
Python 核心类:
class MergeValidator:
"""数据合并完整性检查"""
def __init__(self): ...
def validate_keys(self, left, right, on): ...
def check_cardinality(self, merged): ... # 1:1, 1:m, m:1
def diagnose_non_match(self, left, right, on): ...
def merge_panel(self, dfs, on): ... # 多年数据合并模块 6: 完整案例 - 教育回报率研究 (3.7节)
研究设计:
- 数据: Card & Krueger (1992) 或 NLSY97
- 问题: 教育对收入的因果效应
- 方法: Mincer 工资方程 + 工具变量
完整流程 (1200+ 行):
- 数据导入 (Stata .dta)
- 质量诊断 (30% 缺失率)
- 缺失值处理 (MICE 算法)
- 变量构造 (15+ 变量)
- 异常值处理 (Winsorization)
- 描述性统计
- OLS 回归 (4个模型)
- 稳健性检验
- 结果可视化
- 政策建议
练习题 (⭐ to ⭐⭐⭐⭐⭐):
- ⭐ 基础: 读取数据,计算缺失率
- ⭐⭐ 进阶: 实施 Heckman 两步法
- ⭐⭐⭐ 高级: 多重插补 + 敏感性分析
- ⭐⭐⭐⭐ 专家: 工具变量 + 异质性分析
- ⭐⭐⭐⭐⭐ 诺贝尔: 完整研究论文 (含因果推断)
学习目标与能力矩阵
完成本章后,你将达到以下能力水平:
| 能力维度 | 初级 (⭐⭐) | 中级 (⭐⭐⭐) | 高级 (⭐⭐⭐⭐) | 专家 (⭐⭐⭐⭐⭐) |
|---|---|---|---|---|
| 数据诊断 | 识别缺失值 | MCAR/MAR检验 | Little's Test | 敏感性分析 |
| 缺失值处理 | 简单删除/填充 | 条件填充 | MICE 算法 | Heckman 选择模型 |
| 异常值处理 | IQR 方法 | Winsorization | 稳健回归 | M-估计量 |
| 变量构造 | 虚拟变量 | 交互项 | 动态面板 | 处理效应分解 |
| 数据转换 | 对数、标准化 | Box-Cox | IHS 变换 | 功率变换族 |
| 因果推断 | OLS 回归 | 固定效应 | DID | IV + 异质性 |
️ 学习路线图 (4周计划)
Week 1: 数据导入与质量诊断
Day 1-2: 多格式数据读取 (CSV, Stata, SPSS, SQL)
Day 3-4: DataQualityChecker 类实现
Day 5-6: 面板数据结构检查
Day 7: 完整质量报告生成Week 2: 数据清洗理论与实践
Day 1-2: Little & Rubin 缺失数据理论
Day 3-4: MICE 算法实现
Day 5-6: Winsorization + IHS 变换
Day 7: DataCleaner 类集成Week 3: 变量构造与转换
Day 1-2: 虚拟变量 + 交互项 (Angrist & Pischke)
Day 3-4: 动态面板 (滞后算子)
Day 5-6: Box-Cox 转换理论
Day 7: TransformationPipeline 类Week 4: 综合案例与实战
Day 1-3: Card & Krueger (1994) 完整复现
Day 4-5: NLSY97 教育回报率分析
Day 6-7: 独立项目 + 研究报告与其他模块的知识网络
前置知识
来自 Python Fundamentals:
- Module 4: 数据结构 (DataFrame, MultiIndex)
- Module 9: Pandas 高级操作 (groupby, merge, pivot)
来自 StatsPai:
- Module 1: OLS 回归基础
- Module 2: 因果推断框架 (潜在结果模型)
后续应用
Module 4-5: 假设检验与 t 检验
- 使用清洗后的数据进行推断
- 缺失值对标准误的影响
Module 7: 时间序列与事件研究
- 面板数据的长格式构建
- 滞后项在 ARIMA 模型中的应用
Module 8: 高级计量经济学
- Heckman 选择模型完整实现
- 工具变量与变量构造
- 异方差 → Box-Cox 变换
Module 9: 面板数据方法
- 固定效应模型的数据要求
- 动态面板 (Arellano-Bond)
权威参考文献
核心教材
Little, R. J., & Rubin, D. B. (2019). Statistical Analysis with Missing Data (3rd Edition). Wiley.
- 缺失数据理论的圣经
- MCAR/MAR/MNAR 的数学基础
Angrist, J. D., & Pischke, J.-S. (2009). Mostly Harmless Econometrics. Princeton University Press.
- 变量构造的因果推断视角
- 交互项与处理效应异质性
Wooldridge, J. M. (2010). Econometric Analysis of Cross Section and Panel Data (2nd Edition). MIT Press.
- 面板数据处理的权威著作
- 动态面板模型
Imbens, G. W., & Rubin, D. B. (2015). Causal Inference for Statistics, Social, and Biomedical Sciences. Cambridge University Press.
- 潜在结果框架
- 数据质量与因果效应识别
经典论文
Rubin, D. B. (1976). "Inference and missing data." Biometrika, 63(3), 581-592.
- 多重插补的原始论文
Heckman, J. J. (1979). "Sample selection bias as a specification error." Econometrica, 47(1), 153-161.
- 样本选择模型 (2000年诺贝尔奖)
Box, G. E., & Cox, D. R. (1964). "An analysis of transformations." Journal of the Royal Statistical Society: Series B, 26(2), 211-243.
- Box-Cox 变换理论
Mincer, J. (1974). Schooling, Experience, and Earnings. NBER.
- Mincer 工资方程
Card, D., & Krueger, A. B. (1994). "Minimum wages and employment: A case study of the fast-food industry in New Jersey and Pennsylvania." American Economic Review, 84(4), 772-793.
- 数据清洗与 DID 方法的经典案例
Python 实用资源
- McKinney, W. (2022). Python for Data Analysis (3rd Edition). O'Reilly.
- VanderPlas, J. (2016). Python Data Science Handbook. O'Reilly.
- Pandas 官方文档: https://pandas.pydata.org/docs/
学习方法与建议
DO (推荐做法)
- 边学边练: 每个函数都在 Jupyter Notebook 中运行
- 理解原理: 不仅知其然,更知其所以然
- 为什么对数变换能稳定方差? (数学证明)
- MICE 算法的收敛性如何保证?
- 保留原始数据:
df_clean = df_raw.copy() - 文档化流程: 添加详细注释,生成清洗报告
- 验证结果: 每步后检查数据形状、统计量
- 复现经典研究: Card & Krueger、Mincer 方程
DON'T (避免误区)
不要盲目删除缺失值
- 先诊断缺失机制 (MCAR/MAR/MNAR)
- MAR/MNAR 删除会导致选择偏误
不要忽略数据类型
- 字符串 "100" ≠ 数字 100
- 日期格式不一致导致合并失败
不要过度清洗
- 保留必要的变异性
- 异常值可能是真实信号
不要跳过探索性分析
- Garbage in, garbage out
- 描述性统计比回归更重要
不要忽视因果推断
- 数据清洗的目标是无偏估计因果效应
- 缺失值处理不当 → 选择偏误 → 因果推断失效
本章配套数据集
| 数据集 | 描述 | 样本量 | 时间跨度 | 格式 | 下载 |
|---|---|---|---|---|---|
| wage_data_raw.csv | 模拟工资数据(含质量问题) | 5,000 | 2020 | CSV | /data/module-3/ |
| nlsy97_sample.dta | NLSY97 子样本 | 8,984 | 1997-2017 | Stata | /data/module-3/ |
| cfps2018_clean.csv | CFPS 2018 清洗版 | 37,147 | 2018 | CSV | /data/module-3/ |
| world_bank_panel.xlsx | 世界银行国家面板 | 217×30 | 1990-2020 | Excel | /data/module-3/ |
| card_krueger_1994.dta | 最低工资研究数据 | 410 | 1992 | Stata | /data/module-3/ |
数据字典: 每个数据集都配有完整的变量说明 (codebook)
课前自测题
基础题 (⭐⭐)
概念题: 什么是 MCAR? 它与 MAR 的区别是什么?
计算题: 给定缺失率向量
[0.05, 0.30, 0.60, 0.10],哪些变量应该删除?编程题: 使用
pd.read_csv()读取含中文的 CSV 文件,并处理乱码。
进阶题 (⭐⭐⭐)
理论题: 证明在 MCAR 假设下,完全案例分析是无偏的。
实践题: 实现 IQR 方法检测异常值,并与 Z-score 方法对比。
设计题: 你有学生信息表和成绩表,如何合并成宽格式成绩单?
高级题 (⭐⭐⭐⭐)
推导题: 推导 Box-Cox 变换的 Jacobian,解释为什么需要调整似然函数。
编程题: 实现 MICE 算法的一个迭代步骤。
因果推断题: 如果高收入者缺失率更高,简单删除会如何影响教育回报率估计?
答案见各节练习题部分
准备好了吗?
数据清洗与变量构造是计量研究的"基本功",也是最容易被忽视的环节。
Angrist & Pischke (2009) 的告诫:
"Good empirical work is mostly about good data work. If you get the data right, the econometrics is often straightforward." "优秀的实证研究主要是优秀的数据工作。如果数据处理正确,计量方法往往水到渠成。"
掌握本章,你将获得:
- ️ 处理任何"脏"数据的能力
- 构建高质量分析数据集
- 数据科学家的核心技能
- 避免数据错误导致的研究灾难
- 达到 Nobel Prize 级别的数据处理标准
Let's get started!
本章文件清单
module-3_Data and Vars/
├── 3.1-本章介绍.md # 本文件 ⭐ 增强版
├── 3.2-数据导入与检查.md # DataQualityChecker 类
├── 3.3-数据清洗.md # DataCleaner 类 + Missing Data Theory
├── 3.4-变量构造.md # VariableConstructor 类
├── 3.5-数据转换.md # TransformationPipeline 类
├── 3.6-合并与重塑.md # MergeValidator 类
├── 3.7-实战案例.md # Card & Krueger + 10 练习题
└── data/ # 配套数据集
├── wage_data_raw.csv
├── nlsy97_sample.dta
├── cfps2018_clean.csv
├── world_bank_panel.xlsx
├── card_krueger_1994.dta
└── codebooks/ # 数据字典预计学习时间: 20-24 小时 难度系数: ⭐⭐⭐ (前半部分基础,后半部分进阶) 实用性: ⭐⭐⭐⭐⭐ (职业生涯必备技能)
下一节: 3.2 - 数据导入与初步检查
从正确读取数据开始,为因果推断打下坚实基础!
版本信息:
- 初始版本: 541 行
- 增强版本: 850+ 行
- 增强内容:
- 添加 Reinhart-Rogoff 案例详细分析
- 完整 Little & Rubin 缺失数据理论 (30+ 公式)
- Rubin 因果模型与数据质量的联系
- Heckman 选择模型推导
- SUTVA 假设与数据质量
- Box-Cox 变换的数学推导
- 完整能力矩阵 (初级→专家)
- 4周学习路线图
- 5个配套真实数据集
- 权威文献引用 (Nobel Prize 论文)
- 课前自测题 (基础→高级)
符合 Nobel Prize 标准: 理论深度 + 实用性 + 完整代码 + 真实数据