s l
动态优化结构估计大全
动态优化结构估计大全
第一章:结构 vs 约化式——为什么要"多此一举"?
1.1 一个直观的例子:出租车司机的劳动供给
想象你在研究网约车司机的劳动供给问题。
约化式(Reduced-form)做法:
|
|
这告诉你"有相关性",甚至在好的研究设计下是"因果效应"。但如果政策制定者问你:
“如果我们把补贴从目前的 20%降到 10%,再引入一个’连续工作 4 小时奖励 50 元’的阶梯激励,司机行为会怎么变?”
约化式估计无法回答——因为你估计的是特定补贴形式下的边际效应,而新政策结构完全不同。
结构估计(Structural Estimation)做法:
假设司机每小时做决策:继续工作还是回家?
$$V(\text{状态}) = \max\left\{ \underbrace{u(\text{收入}) - c(\text{疲劳})}_{\text{继续工作的效用}}, \quad \underbrace{V_{\text{home}}}_{\text{回家的保留效用}} \right\}$$你估计的是:
- 收入的边际效用参数 $\theta_1$
- 疲劳成本参数 $\theta_2$
- 保留效用参数 $\theta_3$
有了这些不变的偏好参数(“深层参数”),任何新政策都可以代入模型计算反事实。
1.2 核心区别总结
| 维度 | 约化式 | 结构式 |
|---|---|---|
| 回答的问题 | “X 变化时 Y 怎么变?” | “为什么会这样变?新情境下怎么变?” |
| 依赖什么 | 研究设计(IV/RCT/DID) | 经济模型(效用/生产函数) |
| 外部效度 | 仅限相似情境 | 可外推至模型覆盖的新情境 |
| 透明度 | 高(模型假设少) | 低(依赖模型正确性) |
| 适用场景 | 政策评估、因果识别 | 机制分析、反事实模拟、福利分析 |
1.3 何时用结构?
必须用结构的场景:
- 反事实涉及从未观察过的政策(如新税制)
- 需要计算福利/消费者剩余
- 需要理解机制(行为背后的参数)
- 数据中有动态决策需要建模
可以不用结构的场景:
- 只需要回答"有没有效果"
- 有干净的自然实验且政策情境相似
- 模型假设太强、数据太弱
自检问题:你的研究问题是否必须知道"为什么"或"换一种政策会怎样"?如果是,结构估计可能是必要的。
第二章:标准工作流——从 0 到 1 的八步清单
|
|
各步核心问题
| 步骤 | 解决什么问题 | 常见坑 | 自检 |
|---|---|---|---|
| ① 问题 | 明确反事实目标 | 问题太宽泛 | 能写出具体的反事实句式? |
| ② 模型 | 写出可解的优化问题 | 状态空间太大 | 贝尔曼方程能解吗? |
| ③ 数据 | 状态/行动观测映射 | 状态变量不可观测 | 模型变量都有数据对应? |
| ④ 识别 | 参数能否被数据确定 | 参数共线/弱识别 | 能写出识别等式? |
| ⑤ 估计 | 选择计算可行的方法 | 方法与模型不匹配 | 目标函数写得出来? |
| ⑥ 数值 | 得到稳定的估计值 | 收敛到局部最优 | 多初值结果一致? |
| ⑦ 推断 | 量化不确定性 | 标准误低估 | bootstrap 结果合理? |
| ⑧ 反事实 | 回答政策问题 | 外推超出支持 | 新政策在数据支撑范围内? |
第三章:贯穿式 Toy Model——发动机更换问题
3.1 问题背景
Harold Zurcher 是麦迪逊公交公司的维修主管,每期需要决定:是否更换公交车发动机?
这是 Rust (1987) 的经典设置,是动态离散选择(DDC)的"Hello World"。
3.2 模型完整设定
符号定义
| 符号 | 含义 | 类型 |
|---|---|---|
| $x_t$ | 发动机里程(累计行驶距离) | 状态变量(可观测) |
| $d_t \in \{0, 1\}$ | 决策:0=继续使用,1=更换 | 行动 |
| $\epsilon_t = (\epsilon_{0t}, \epsilon_{1t})$ | 决策特定的私人冲击 | 状态变量(不可观测) |
| $\beta \in (0,1)$ | 折现因子 | 已知参数 |
| $\theta = (RC, \theta_c)$ | 待估参数 | 结构参数 |
当期收益函数
$$ u(x_t, d_t, \epsilon_t; \theta) = \begin{cases} -c(x_t; \theta_c) + \epsilon_{0t} & \text{if } d_t = 0 \text{ (继续使用)} \\ -RC - c(0; \theta_c) + \epsilon_{1t} & \text{if } d_t = 1 \text{ (更换发动机)} \end{cases} $$其中:
- $c(x; \theta_c) = \theta_{c1} x + \theta_{c2} x^2$ 是维护成本(里程越高成本越大)
- $RC$ 是更换发动机的固定成本
- $\epsilon_{dt}$ 是决策者私人信息(Type-I 极值分布)
状态转移
$$ x_{t+1} = \begin{cases} x_t + \Delta x_t & \text{if } d_t = 0 \\ \Delta x_t & \text{if } d_t = 1 \text{ (里程归零)} \end{cases} $$其中 $\Delta x_t$ 是单期行驶里程,服从离散分布 $g(\cdot)$(从数据估计)。
误差分布假设
$$ \epsilon_{dt} \overset{iid}{\sim} \text{Type-I Extreme Value (Gumbel)} $$为什么用这个分布?
- 解析地得出选择概率(Logit 形式)
- 计算期望最大值有闭式解(log-sum-exp)
3.3 贝尔曼方程
定义条件价值函数(conditional value function)——给定选择 $d$ 时的期望贴现收益:
$$ \bar{v}(x, d; \theta) = u(x, d; \theta) + \beta \mathbb{E}\left[ V(x', \epsilon') \mid x, d \right] $$其中 $V$ 是选择前价值函数(ex-ante value function):
$$ V(x, \epsilon) = \max_{d \in \{0,1\}} \left\{ \bar{v}(x, d; \theta) + \epsilon_d \right\} $$关键简化(极值分布的魔力):
由于 $\epsilon$ 服从 Type-I 极值分布,期望最大值有闭式解:
$$ \mathbb{E}_\epsilon[V(x, \epsilon)] = \log\left( \exp(\bar{v}(x, 0)) + \exp(\bar{v}(x, 1)) \right) + \gamma $$其中 $\gamma \approx 0.5772$ 是欧拉常数。
简化版贝尔曼方程(核心递归式)
定义期望价值函数 $EV(x) \equiv \mathbb{E}_\epsilon[V(x, \epsilon)]$:
$$ EV(x) = \log\left( \sum_{d=0}^{1} \exp\left( u(x,d) + \beta \sum_{x'} g(x' \mid x, d) \cdot EV(x') \right) \right) $$这是一个不动点方程:$EV = T(EV; \theta)$
3.4 选择概率
给定 $EV(\cdot)$,选择概率有 Logit 形式:
$$ P(d_t = 1 \mid x_t; \theta) = \frac{\exp(\bar{v}(x_t, 1))}{\exp(\bar{v}(x_t, 0)) + \exp(\bar{v}(x_t, 1))} $$这就是模型与数据的桥梁:我们观察到 $(x_t, d_t)$,用上述概率构造似然函数。
3.5 状态空间离散化(实操必须)
假设里程 $x \in \{0, 1, 2, \ldots, \bar{x}\}$(如 $\bar{x} = 90$,每单位代表 5000 英里)。
转移矩阵 $G$ 是 $(\bar{x}+1) \times (\bar{x}+1)$ 矩阵:
- $G_{0}(x, x')$ = 不更换时从 $x$ 转移到 $x'$ 的概率
- $G_{1}(x, x')$ = 更换时从 $0$ 转移到 $x'$ 的概率
自检:你的模型能否写成这种递归形式?状态空间是否有限/可离散化?
第四章:识别——结构估计的灵魂
4.1 识别的本质
问题:数据能否唯一确定参数 $\theta$?
用数学语言:观察到的分布 $P(d \mid x)$ 是否与 $\theta$ 一一对应?
“参数 → 可观察量"的映射思维:
|
|
4.2 Rust 模型中的识别逻辑
识别 $\theta_c$(维护成本参数)
利用的 variation:不同里程下的更换概率差异
观察:
- 在 $x = 20$ 时,更换概率是 5%
- 在 $x = 60$ 时,更换概率是 40%
直觉:里程越高,继续使用的期望成本越大,更换变得更吸引人。选择概率对里程的斜率识别 $\theta_c$。
$$ \frac{\partial P(d=1 \mid x)}{\partial x} \approx \theta_{c1} + 2\theta_{c2} x $$识别 $RC$(更换成本)
利用的 variation:更换概率的水平
如果 $RC$ 很大,即使里程很高也不愿更换(概率曲线整体下移)。
$$ P(d=1 \mid x=0) \text{ 的水平反映 } RC \text{ 相对于维护成本的大小} $$识别 $\beta$(折现因子)
困难! 这是 DDC 识别的经典难题。
Rust 的做法:假设 $\beta$ 已知(如 $\beta = 0.9999$)。
为什么难识别?
- $\beta$ 控制"多看重未来”
- 但"更看重未来"和"高更换成本"可能导致类似行为
- 需要额外的 variation(如利率变化、政策变化)
4.3 识别失败的五大类型
| 类型 | 现象 | Rust 模型中的例子 | 诊断方法 |
|---|---|---|---|
| 1. 参数共线/同形 | 不同参数组合给出相同似然 | $\beta$ 和 $RC$ 的共线(都影响"是否更换") | 画等似然线;检查 Hessian 奇异 |
| 2. 状态遗漏 | 未观测状态与观测状态相关 | 司机驾驶习惯影响磨损但未观测 | 控制更多协变量;使用固定效应 |
| 3. 支持集不足 | 数据中缺少关键 variation | 所有观测里程都在 30-50 之间 | 检查状态变量分布覆盖 |
| 4. 分布假设驱动识别 | 换分布后估计值大变 | Type-I 极值 vs 正态分布 | 换分布做敏感性分析 |
| 5. 多重均衡 | 模型有多个均衡,数据只反映一个 | (Rust 模型无此问题,但 IO 博弈中常见) | 检验均衡唯一性条件 |
4.4 识别分析的操作清单
- 写出识别等式:$\theta = h(P(d \mid x), G(x' \mid x, d))$
- 检查 $h$ 是否可逆:有没有两组不同的 $\theta$ 给出相同的 $P$?
- 计算 Fisher 信息矩阵:在真实参数处是否正定?
- 做 Monte Carlo:生成模拟数据,看能否恢复真实参数
- 画似然曲面:是否有平坦区域?
最常见的坑:依赖函数形式假设(如线性成本)来获得识别,但这种"识别"没有经济学内涵。
第五章:估计方法全家桶
5.1 全信息 MLE / NFXP(Nested Fixed Point)
详见MLE 法
核心思想
一句话:在似然函数中"套娃"——每次评估似然都要解一遍贝尔曼方程。
|
|
目标函数
$$ \mathcal{L}(\theta) = \sum_{i=1}^{N} \sum_{t=1}^{T_i} \left[ d_{it} \log P(d=1 \mid x_{it}; \theta) + (1-d_{it}) \log P(d=0 \mid x_{it}; \theta) \right] $$算法步骤
|
|
数值实现要点
内层迭代(解 EV):
|
|
外层优化(似然最大化):
|
|
优缺点
| 优点 | 缺点 |
|---|---|
| 统计效率最高(MLE 渐近有效) | 计算成本高(每次评估似然都解不动点) |
| 无需矩条件选择 | 对模型设定敏感 |
| 自然处理非线性模型 | 内层不收敛会导致外层失败 |
5.2 两步法 / CCP 方法(Hotz-Miller 类)
详见CCP 法
(Conditional Choice Probability)
核心思想
一句话:先非参数估计选择概率 $\hat{P}(d \mid x)$,再利用概率反推价值函数,避免解不动点。
关键洞见:选择概率和价值函数之间存在一一映射。
$$ P(d=1 \mid x) = \frac{\exp(\bar{v}(x,1))}{\exp(\bar{v}(x,0)) + \exp(\bar{v}(x,1))} $$反过来(利用 Type-I 极值分布性质):
$$ \bar{v}(x,1) - \bar{v}(x,0) = \log\left(\frac{P(d=1 \mid x)}{P(d=0 \mid x)}\right) $$这意味着不需要解贝尔曼方程,只要有 CCP 估计就能构造似然/矩条件。
概率反演(Hotz-Miller Inversion)
定义选择特定值函数(choice-specific value function)的差:
$$ \Delta \bar{v}(x) \equiv \bar{v}(x,1) - \bar{v}(x,0) = \log\left(\frac{p_1(x)}{1-p_1(x)}\right) $$进一步,可以证明:
$$ \bar{v}(x, d) = u(x, d; \theta) + \beta \sum_{x'} g(x' \mid x, d) \cdot [\bar{v}(x', 0) + \log(1-p_1(x')) + \gamma] $$这里 $\bar{v}(x', 0) + \log(1-p_1(x'))$ 可以用 $p_1$ 表示(不需要知道绝对水平)。
算法步骤
|
|
具体实现:前向模拟版本(Forward Simulation)
有一种更直观的 CCP 方法(Hotz-Miller-Wise 风格):
|
|
优缺点
| 优点 | 缺点 |
|---|---|
| 避免内层不动点迭代 | 第一步估计误差传递到第二步 |
| 计算更快 | 需要足够数据估计 CCP |
| 对初值不敏感 | 标准误计算更复杂(需考虑两步) |
| 易于并行化 | 某些反事实需要重新解不动点 |
5.3 GMM / SMM(模拟矩方法)
核心思想
GMM 直觉:选择一组矩条件(观测统计量 = 模型预测),然后最小化矩匹配误差。
SMM 直觉:当矩无法解析计算时,用模拟来近似。
矩条件的选择
对于 Rust 模型,自然的矩条件:
- 选择矩:$E[d_t - P(d=1 \mid x_t; \theta)] = 0$
- 选择 × 状态矩:$E[(d_t - P(d=1 \mid x_t; \theta)) \cdot x_t] = 0$
- 转移矩:$E[\mathbf{1}(x_{t+1} = x') - G(x' \mid x_t, d_t)] = 0$
- 更换后里程矩:$E[x_{t+1} \mid d_t = 1] = E[\Delta x]$
目标函数
$$ \hat{\theta}_{GMM} = \arg\min_\theta \left[ \hat{g}(\theta) \right]' W \left[ \hat{g}(\theta) \right] $$其中:
- $\hat{g}(\theta) = \frac{1}{N} \sum_i m(x_i, d_i; \theta) - \bar{m}^{data}$ 是样本矩
- $W$ 是权重矩阵
SMM:当矩需要模拟
|
|
代码实现
|
|
优缺点
| 优点 | 缺点 |
|---|---|
| 灵活,可处理复杂模型 | 矩选择主观(效率取决于选择) |
| 模拟误差随 S 增加消失 | 模拟噪声导致目标函数不平滑 |
| 过度识别可检验 | 权重矩阵的选择影响效率 |
5.4 间接推断(Indirect Inference)
详见间接推断
核心思想
一句话:选择一个"辅助模型"(通常是简单的回归),在数据和模拟数据上分别估计,让两者的估计值尽可能接近。
原理:我不直接匹配矩,而是匹配"在简单模型下的行为"。
算法
-
在真实数据上估计辅助模型:例如 Logit 回归 $P(d=1|x) = \Lambda(\alpha + \gamma x)$,得到 $\hat{\psi}^{data} = (\hat{\alpha}, \hat{\gamma})$
-
对每个结构参数 $\theta$:
- 模拟数据 $\{x^s, d^s\}$
- 在模拟数据上估计同样的辅助模型,得到 $\hat{\psi}^{sim}(\theta)$
-
目标函数:
$$\hat{\theta}_{II} = \arg\min_\theta \left\| \hat{\psi}^{data} - \hat{\psi}^{sim}(\theta) \right\|^2$$
为什么有用?
- 辅助模型的估计很稳定(通常是凸优化)
- 辅助模型的参数是结构参数的"平滑函数"
- 不需要写出解析矩条件
代码示例
|
|
5.5 贝叶斯方法(最小可行版本)
详见贝叶斯方法
何时考虑贝叶斯?
- 样本量小,需要正则化
- 需要参数的完整后验分布(而非点估计)
- 想自然地量化不确定性
基本框架
后验 $\propto$ 似然 $\times$ 先验
$$ p(\theta \mid \text{data}) \propto \mathcal{L}(\text{data} \mid \theta) \cdot \pi(\theta) $$MCMC 实现
|
|
实用建议
- 先验选择:使用弱信息先验(如半正态、对数正态),检验先验敏感性
- 收敛诊断:检查 $\hat{R}$(<1.01)、有效样本量(ESS > 400)、trace plot
- 计算挑战:贝叶斯 + NFXP 很慢,考虑用近似贝叶斯(如变分推断)
第六章:数值实现与工程细节
6.1 状态空间处理
离散化策略
| 方法 | 适用场景 | 实现 |
|---|---|---|
| 均匀网格 | 有界状态 | np.linspace(x_min, x_max, n) |
| 切比雪夫节点 | 函数逼近 | 避免龙格现象 |
| 内生网格法 | 连续选择问题 | EGM (Carroll, 2006) |
| 状态依赖网格 | 密度不均匀 | 在高密度区加密 |
|
|
转移矩阵构造
|
|
6.2 数值稳定性
Log-Sum-Exp 技巧
问题:$\log(\exp(a) + \exp(b))$ 当 $a, b$ 很大时溢出
解决:
$$\log(\exp(a) + \exp(b)) = \max(a, b) + \log(1 + \exp(-|a-b|))$$
|
|
概率裁剪
|
|
6.3 优化器选择与初值策略
优化器对比
| 优化器 | 适用场景 | scipy 实现 |
|---|---|---|
| L-BFGS-B | 光滑、有界约束 | method='L-BFGS-B' |
| Nelder-Mead | 非光滑、无梯度 | method='Nelder-Mead' |
| BFGS | 光滑、无约束 | method='BFGS' |
| 差分进化 | 全局优化 | scipy.optimize.differential_evolution |
| Basin-hopping | 多局部最优 | scipy.optimize.basinhopping |
多初值策略
|
|
6.4 收敛诊断
|
|
6.5 并行化
|
|
第七章:标准误与统计推断
7.1 各估计器的标准误
NFXP/MLE 标准误
理论:$\sqrt{N}(\hat{\theta} - \theta_0) \xrightarrow{d} N(0, \mathcal{I}(\theta_0)^{-1})$
计算:
$$\hat{Var}(\hat{\theta}) = \left[ -\frac{1}{N} \sum_i \frac{\partial^2 \log \mathcal{L}_i}{\partial \theta \partial \theta'} \right]^{-1}$$
|
|
两步法标准误(Murphy-Topel 修正)
问题:第一步估计的不确定性需要传递到第二步。
公式:
$$Var(\hat{\theta}_2) = V_2 + V_2 \cdot C \cdot V_1 \cdot C' \cdot V_2$$其中 $V_1$ 是第一步方差,$V_2$ 是忽略第一步时的方差,$C$ 是交叉项。
GMM/SMM 标准误
公式:
$$\hat{Var}(\hat{\theta}) = \frac{1}{N}(D'WD)^{-1} D'W \hat{\Omega} W D (D'WD)^{-1}$$其中 $D = \partial g / \partial \theta'$,$\hat{\Omega}$ 是矩条件的方差。
7.2 Bootstrap
推荐做法:参数化 bootstrap 或非参数 bootstrap
|
|
7.3 标准误失真的常见原因
| 原因 | 症状 | 解决方案 |
|---|---|---|
| Hessian 数值不稳定 | SE 过大或为 NaN | 用更精细的差分步长;改用 BHHH |
| 弱识别 | SE 巨大、CI 包含无意义值 | 检查识别条件;加数据 |
| 聚类相关 | SE 低估、t 值过大 | 聚类 bootstrap |
| 边界解 | SE 无意义 | 用 profile likelihood |
第八章:模型检验与稳健性
8.1 模型拟合检验
视觉检验
|
|
定量检验
|
|
8.2 过度识别检验(GMM)
|
|
8.3 敏感性分析
|
|
8.4 稳健性清单
|
|
第九章:反事实——结构估计的终点
9.1 反事实模拟的一般框架
|
|
9.2 反事实案例一:更换成本补贴
问题:如果政府补贴 50%的更换成本,更换率会如何变化?
|
|
9.3 反事实案例二:维护技术进步
问题:如果新技术使维护成本降低 30%,长期均衡会怎样?
|
|
9.4 反事实的不确定性
|
|
9.5 反事实报告模板
|
|
推荐资源
教材
- Aguirregabiria & Mira (2010): “Dynamic Discrete Choice Structural Models: A Survey”
- Keane, Todd & Wolpin (2011): “The Structural Estimation of Behavioral Models”
- Kenneth Train: “Discrete Choice Methods with Simulation”
经典论文
- Rust (1987): “Optimal Replacement of GMC Bus Engines”
- Hotz & Miller (1993): “Conditional Choice Probabilities”
- Keane & Wolpin (1997): “Career Decisions of Young Men”
代码资源
- QuantEcon 讲义: https://quantecon.org/
- Victor Aguirregabiria 的课程网站
- GitHub: 搜索 “rust model” 或 “DDC estimation”
附录:完整代码框架
完整 py 代码
|
|