Skip to content

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),则:

示例:

python
# 高收入者更可能拒绝回答收入问题
# → 样本中收入数据向低收入倾斜
# → 教育回报率估计偏低

数学证明:

设缺失指示变量 (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:

次插补后估计为 ,方差为 :

  1. 点估计:
  1. 总方差:
  1. 自由度:

3. MNAR (Missing Not At Random)

定义:缺失概率依赖于未观测数据本身

数学表达:

示例:

  • 抑郁症患者更可能退出心理健康调查
  • 缺失概率依赖于"抑郁程度"(未观测)

处理策略:

  1. 敏感性分析 (Sensitivity Analysis)
  2. 选择模型 (Selection Models)
  3. 模式混合模型 (Pattern-Mixture Models)
  4. 工具变量 (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:

  1. 无干扰 (No Interference):
  1. 无隐藏变量 (No Hidden Variations): 只有一个版本的处理

数据质量如何威胁 SUTVA?

1. 数据泄露导致干扰

示例:社交网络研究中,个体 的朋友圈也接受处理

违反 SUTVA:

处理:网络聚类、空间回归模型

2. 测量误差导致处理版本不一致

示例:教育年限测量误差 → 16年本科 vs 18年本科+硕士被当作同一处理

违反 SUTVA:实际上有多个处理版本

处理:工具变量、多值处理效应 (multivalued treatment effects)


本章核心内容框架

模块 1: 数据导入与质量诊断 (3.2节)

核心技能:

  • 多格式数据读取 (CSV、Stata、SPSS、SQL、Parquet)
  • 自动化数据质量报告生成
  • 面板数据结构检查 (平衡性、时间覆盖)

Python 核心类:

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 核心类:

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 核心类:

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 核心类:

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 核心类:

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+ 行):

  1. 数据导入 (Stata .dta)
  2. 质量诊断 (30% 缺失率)
  3. 缺失值处理 (MICE 算法)
  4. 变量构造 (15+ 变量)
  5. 异常值处理 (Winsorization)
  6. 描述性统计
  7. OLS 回归 (4个模型)
  8. 稳健性检验
  9. 结果可视化
  10. 政策建议

练习题 (⭐ to ⭐⭐⭐⭐⭐):

  1. ⭐ 基础: 读取数据,计算缺失率
  2. ⭐⭐ 进阶: 实施 Heckman 两步法
  3. ⭐⭐⭐ 高级: 多重插补 + 敏感性分析
  4. ⭐⭐⭐⭐ 专家: 工具变量 + 异质性分析
  5. ⭐⭐⭐⭐⭐ 诺贝尔: 完整研究论文 (含因果推断)

学习目标与能力矩阵

完成本章后,你将达到以下能力水平:

能力维度初级 (⭐⭐)中级 (⭐⭐⭐)高级 (⭐⭐⭐⭐)专家 (⭐⭐⭐⭐⭐)
数据诊断识别缺失值MCAR/MAR检验Little's Test敏感性分析
缺失值处理简单删除/填充条件填充MICE 算法Heckman 选择模型
异常值处理IQR 方法Winsorization稳健回归M-估计量
变量构造虚拟变量交互项动态面板处理效应分解
数据转换对数、标准化Box-CoxIHS 变换功率变换族
因果推断OLS 回归固定效应DIDIV + 异质性

️ 学习路线图 (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)

权威参考文献

核心教材

  1. Little, R. J., & Rubin, D. B. (2019). Statistical Analysis with Missing Data (3rd Edition). Wiley.

    • 缺失数据理论的圣经
    • MCAR/MAR/MNAR 的数学基础
  2. Angrist, J. D., & Pischke, J.-S. (2009). Mostly Harmless Econometrics. Princeton University Press.

    • 变量构造的因果推断视角
    • 交互项与处理效应异质性
  3. Wooldridge, J. M. (2010). Econometric Analysis of Cross Section and Panel Data (2nd Edition). MIT Press.

    • 面板数据处理的权威著作
    • 动态面板模型
  4. Imbens, G. W., & Rubin, D. B. (2015). Causal Inference for Statistics, Social, and Biomedical Sciences. Cambridge University Press.

    • 潜在结果框架
    • 数据质量与因果效应识别

经典论文

  1. Rubin, D. B. (1976). "Inference and missing data." Biometrika, 63(3), 581-592.

    • 多重插补的原始论文
  2. Heckman, J. J. (1979). "Sample selection bias as a specification error." Econometrica, 47(1), 153-161.

    • 样本选择模型 (2000年诺贝尔奖)
  3. 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 变换理论
  4. Mincer, J. (1974). Schooling, Experience, and Earnings. NBER.

    • Mincer 工资方程
  5. 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 (推荐做法)

  1. 边学边练: 每个函数都在 Jupyter Notebook 中运行
  2. 理解原理: 不仅知其然,更知其所以然
    • 为什么对数变换能稳定方差? (数学证明)
    • MICE 算法的收敛性如何保证?
  3. 保留原始数据: df_clean = df_raw.copy()
  4. 文档化流程: 添加详细注释,生成清洗报告
  5. 验证结果: 每步后检查数据形状、统计量
  6. 复现经典研究: Card & Krueger、Mincer 方程

DON'T (避免误区)

  1. 不要盲目删除缺失值

    • 先诊断缺失机制 (MCAR/MAR/MNAR)
    • MAR/MNAR 删除会导致选择偏误
  2. 不要忽略数据类型

    • 字符串 "100" ≠ 数字 100
    • 日期格式不一致导致合并失败
  3. 不要过度清洗

    • 保留必要的变异性
    • 异常值可能是真实信号
  4. 不要跳过探索性分析

    • Garbage in, garbage out
    • 描述性统计比回归更重要
  5. 不要忽视因果推断

    • 数据清洗的目标是无偏估计因果效应
    • 缺失值处理不当 → 选择偏误 → 因果推断失效

本章配套数据集

数据集描述样本量时间跨度格式下载
wage_data_raw.csv模拟工资数据(含质量问题)5,0002020CSV/data/module-3/
nlsy97_sample.dtaNLSY97 子样本8,9841997-2017Stata/data/module-3/
cfps2018_clean.csvCFPS 2018 清洗版37,1472018CSV/data/module-3/
world_bank_panel.xlsx世界银行国家面板217×301990-2020Excel/data/module-3/
card_krueger_1994.dta最低工资研究数据4101992Stata/data/module-3/

数据字典: 每个数据集都配有完整的变量说明 (codebook)


课前自测题

基础题 (⭐⭐)

  1. 概念题: 什么是 MCAR? 它与 MAR 的区别是什么?

  2. 计算题: 给定缺失率向量 [0.05, 0.30, 0.60, 0.10],哪些变量应该删除?

  3. 编程题: 使用 pd.read_csv() 读取含中文的 CSV 文件,并处理乱码。

进阶题 (⭐⭐⭐)

  1. 理论题: 证明在 MCAR 假设下,完全案例分析是无偏的。

  2. 实践题: 实现 IQR 方法检测异常值,并与 Z-score 方法对比。

  3. 设计题: 你有学生信息表和成绩表,如何合并成宽格式成绩单?

高级题 (⭐⭐⭐⭐)

  1. 推导题: 推导 Box-Cox 变换的 Jacobian,解释为什么需要调整似然函数。

  2. 编程题: 实现 MICE 算法的一个迭代步骤。

  3. 因果推断题: 如果高收入者缺失率更高,简单删除会如何影响教育回报率估计?

答案见各节练习题部分


准备好了吗?

数据清洗与变量构造是计量研究的"基本功",也是最容易被忽视的环节。

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 标准: 理论深度 + 实用性 + 完整代码 + 真实数据

基于 MIT 许可证发布。内容版权归作者所有。