经济与商务实证研究方法

第 6 周:结构估计基础——模型、识别、仿真与数值方法

陈志远

中国人民大学商学院

2026-05-29

上节课回顾

从因果机器学习到结构估计

  • 因果机器学习帮助我们在高维数据中估计处理效应、异质性和正交化目标
  • 结构估计进一步追问:这些行为来自什么决策系统?
  • 当政策改变价格、选择集、均衡或外部环境时,简约形式估计往往不够

本节课的问题

如果明天把价格、补贴、关税或竞争格局改掉,我们如何预测一个从未发生过的世界?

本讲路线图

六个模块

  1. 为什么结构估计:从政策效应到反事实系统
  2. 结构模型的零件:原语、选择、均衡、观测量与扰动
  3. 先模拟、后估计:用逻辑选择需求模型看估计器在恢复什么
  4. 估计准则:NLS、MLE、GMM、SMM 的共同语言
  5. 数值基础:梯度、雅可比矩阵、固定点、蒙特卡洛模拟
  6. 嵌套固定点:结构估计中的内外循环

提示

学习策略

结构估计不是先背公式。先能模拟一个模型,再问“哪些参数能被数据恢复”,最后才写估计器。

一、为什么结构估计

简约形式与结构方法的分工

问题 简约形式方法 结构方法
已发生政策的平均效应 DiD、IV、RD、RCT 可作为模型验证对象
新政策或新价格 难以外推 通过模型原语模拟
均衡反馈 通常不显式建模 价格、进入、份额一起变化
福利与分配 需要额外假设 从效用、成本、利润推出

关键边界

结构估计更强,不是因为它“更高级”,而是因为它承担了更多模型假设

结构估计回答什么问题?

典型问题

  • 如果两个平台合并,价格会涨多少,消费者剩余会变多少?
  • 如果降低进口关税,贸易流、价格指数和福利如何变化?
  • 如果给企业研发补贴,进入、退出和投资路径会怎样变化?
  • 如果新增一个产品,现有产品的市场份额从哪里流失?

这些问题共同要求我们描述一个系统:

\text{原语} \rightarrow \text{个体决策} \rightarrow \text{市场均衡} \rightarrow \text{观测数据}

一个结构模型由什么组成?

四类对象

  • 原语:偏好、技术、成本、信息、约束、冲击分布
  • 决策规则:消费者选择、企业定价、进入退出、投资
  • 均衡条件:市场出清、最优反应一致、固定点
  • 观测方程:数据中看到的价格、份额、销量、利润、交易流

结构参数 \theta 通常不是直接观测的,而是通过行为约束被间接识别:

m_{\text{data}} \approx m_{\text{model}}(\theta)

一个极简需求模型

消费者 i 在市场 t 中选择产品 j

u_{ijt} = \delta_{jt} + \varepsilon_{ijt}

其中

\delta_{jt} = x_{jt}\beta - \alpha p_{jt} + \xi_{jt}

经济含义

  • \alpha:价格敏感度
  • \beta:消费者对产品特征的平均偏好
  • \xi_{jt}:研究者看不见、消费者看得见的产品质量
  • \varepsilon_{ijt}:个体层面的特异性偏好冲击

价格内生性为何自然出现?

企业观察到 \xi_{jt},研究者没有观察到:

\xi_{jt} \uparrow \Rightarrow \text{需求提高} \Rightarrow \text{企业提高价格} \Rightarrow E[p_{jt}\xi_{jt}] > 0

需求估计的基本陷阱

如果直接回归 \log q_{jt} 对价格,价格系数可能被需求冲击污染。结构模型没有绕过内生性;它只是让我们更明确地写出内生性从哪里来。

二、先模拟,再估计

为什么先模拟?

模拟的三重作用

  1. 理解模型:给定参数,模型会生成什么样的数据?
  2. 理解识别:哪些数据变化对哪些参数敏感?
  3. 调试估计器:在已知真值的世界里,估计器能否找回真值?

蒙特卡洛模拟的基本句式:

\theta_0 \rightarrow \text{模拟数据} \rightarrow \hat{\theta} \rightarrow \text{比较 } \hat{\theta} \text{ 与 } \theta_0

模拟一个简单逻辑选择市场

J = 8
alpha = 1.4
beta = 0.8

x = np.linspace(0.2, 2.0, J)
price = 1.0 + 0.5 * x + np.random.normal(0, 0.08, J)
xi = np.random.normal(0, 0.15, J)

delta = beta * x - alpha * price + xi
exp_delta = np.exp(delta)
shares = exp_delta / (1 + exp_delta.sum())
outside = 1 - shares.sum()

pd.DataFrame({"x": x, "price": price, "share": shares}).round(3)
x price share
0 0.200 1.140 0.076
1 0.457 1.218 0.098
2 0.714 1.409 0.079
3 0.971 1.608 0.073
4 1.229 1.596 0.102
5 1.486 1.724 0.076
6 1.743 1.998 0.065
7 2.000 2.061 0.087

逻辑选择份额的可视化

提示

课堂检查

如果 \alpha 变大,价格高的产品份额应当下降;如果 \beta 变大,特征 x 高的产品份额应当上升。模拟先帮我们确认模型方向。

从模拟到估计:反演平均效用

逻辑选择模型有一个漂亮的反演:

\log s_j - \log s_0 = \delta_j

代入 \delta_j = x_j\beta - \alpha p_j + \xi_j

\log s_j - \log s_0 = x_j\beta - \alpha p_j + \xi_j

这一步的含义

市场份额不是最终答案。份额把消费者选择的结果压缩成一个可回归的平均效用。

课堂上可以把这一步理解为“把市场份额翻译回消费者眼中的产品吸引力”。

识别:参数从哪里来?

识别不是“样本量足够大”

识别要求不同参数对观测数据产生可区分的变化。

参数 主要数据来源 识别威胁
\alpha 价格变化与份额变化 价格与 \xi 相关
\beta 产品特征与份额差异 特征与未观测质量相关
成本参数 价格、份额、竞争一阶条件 定价模型设错
替代模式 份额对价格变化的反应 独立无关替代限制或随机系数设定

结构估计中的“原语优先”

不要从估计器开始

先问经济对象:消费者知道什么?企业观察什么?谁先行动?价格如何形成?哪些冲击被研究者看不见?

模型写清楚后,估计器只是把模型接到数据上的方式:

\hat{\theta} = \arg\min_{\theta} \text{distance}\left(\text{data}, \text{model}(\theta)\right)

三、估计准则

NLS:让预测值贴近数据

若模型给出条件均值:

y_i = h(x_i;\theta) + \varepsilon_i

非线性最小二乘选择

\hat{\theta}_{NLS} = \arg\min_{\theta} \sum_i \left[y_i - h(x_i;\theta)\right]^2

引力模型

Anderson-van Wincoop 引力模型中,贸易流不仅取决于双边贸易成本,还取决于多边阻力项 P_i, P_j。这些价格指数本身由一组固定点方程决定。

MLE:让观测数据最可能出现

若模型给出密度 f(x_i|\theta),似然函数为

\mathcal{L}(\theta) = \prod_{i=1}^N f(x_i|\theta)

通常最大化对数似然:

\hat{\theta}_{MLE} = \arg\max_{\theta} \sum_{i=1}^N \log f(x_i|\theta)

提示

直觉

MLE 不是“拟合均值”,而是选择一组参数,让我们实际看到的数据路径在模型中最合理。

GMM:让模型矩接近数据矩

若模型推出矩条件:

E[g(Z_i,\theta_0)] = 0

GMM 估计量为

\hat{\theta}_{GMM} = \arg\min_{\theta} \bar{g}(\theta)' W \bar{g}(\theta)

其中

\bar{g}(\theta)=\frac{1}{N}\sum_i g(Z_i,\theta)

SMM:当矩只能模拟出来

Simulated Method of Moments

给定参数 \theta,先模拟数据 \tilde{x}(\theta),再计算模型矩:

\hat{\theta}_{SMM} = \arg\min_{\theta} \left[\hat{m}_{sim}(\theta)-\hat{m}_{data}\right]' W \left[\hat{m}_{sim}(\theta)-\hat{m}_{data}\right]

常见场景:进入博弈、拍卖、动态选择、带随机系数的需求估计。

四种估计准则的共同骨架

方法 模型给出什么 距离是什么
NLS 条件均值 h(x;\theta) 预测误差平方
MLE 完整概率分布 负对数似然
GMM 可解析矩条件 加权矩偏差
SMM 可模拟矩条件 数据矩与模拟矩距离

共同问题

你选择的距离是否真的惩罚了最能识别参数的模型错误?

四、结构估计的数值基础

非线性方程与固定点

很多结构模型的核心不是回归,而是解方程:

f(x)=0

也常写成固定点形式:

T(x)=x

经济学中的固定点

  • Solow 模型中的稳态资本
  • 古诺模型中的最优反应交点
  • BLP 中的平均效用收缩映射
  • 引力模型中的多边阻力项

牛顿方法

一阶 Taylor 展开:

f(x) \approx f(x^{(k)}) + f'(x^{(k)})(x-x^{(k)})

令近似值为 0,可得更新规则:

x^{(k+1)} = x^{(k)} - [f'(x^{(k)})]^{-1}f(x^{(k)})

牛顿方法的风险

需要好的初值、可逆雅可比矩阵和足够平滑的函数。结构估计里,失败常常来自经济模型不稳定,而不只是代码错误。

数值梯度

一侧差分:

f'(x) \approx \frac{f(x+h)-f(x)}{h}

中心差分:

f'(x) \approx \frac{f(x+h)-f(x-h)}{2h}

提示

实践原则

先写解析梯度;写不出时用数值梯度;正式结果前用有限差分检查解析梯度。

固定点迭代

T 是压缩映射:

\|T(x)-T(y)\| \leq \beta \|x-y\|,\quad 0<\beta<1

则迭代

x^{(k+1)}=T(x^{(k)})

收敛到唯一固定点。

结构估计中的价值

如果内层问题是压缩映射,我们就有一个稳定、可审计、可重复的求解器。

BLP 收缩映射

随机系数需求估计中,需要找到平均效用 \delta 使预测份额等于观测份额:

s(x,p,\delta;\theta_2)=S

BLP 的更新为

\delta^{h+1}_{\cdot t} = \delta^{h}_{\cdot t} + \log S_{\cdot t} - \log s_{\cdot t}(x_{\cdot t},p_{\cdot t},\delta^{h}_{\cdot t};\theta_2)

这就是“内层固定点”。

蒙特卡洛模拟与模拟误差

模拟积分常写成

\int h(v)dF(v) \approx \frac{1}{R}\sum_{r=1}^R h(v_r)

模拟误差不是抽象问题

如果每次评估目标函数都重新抽样,目标函数会抖动;优化器可能追逐随机噪声。实践中常固定随机抽样,使目标函数对 \theta 更平滑。

五、嵌套固定点

内外循环的基本结构

结构估计常见算法:

  1. 外层给定参数 \theta
  2. 内层解模型均衡或固定点 x^*(\theta)
  3. x^*(\theta) 计算目标函数
  4. 外层优化器更新 \theta

\hat{\theta} = \arg\min_{\theta} Q\left(\theta, x^*(\theta)\right) \quad \text{s.t.} \quad x^*(\theta)=T(x^*(\theta),\theta)

一个结构估计伪代码

def objective(theta, data, draws):
    equilibrium = solve_inner_fixed_point(theta, data, draws)
    model_moments = compute_model_moments(theta, equilibrium, data)
    distance = model_moments - data.moments
    return distance @ W @ distance

theta_hat = minimize(objective, theta0, args=(data, draws))

提示

调试顺序

先调通模拟器,再调通内层求解器,最后调外层优化器。

人工智能能帮什么?

适合交给人工智能加速的任务

  • 把数学目标函数翻译成代码
  • 写有限差分梯度检查
  • 生成求解器日志和收敛诊断图
  • 重构重复代码,减少维度错误
  • 给出多种优化器的实现模板

不能交给人工智能的任务

识别判断、外生性论证、市场边界定义、均衡概念选择、反事实情景是否有经济意义。

本讲总结

三句话

  1. 结构估计把数据解释为经济决策系统的结果
  2. 估计之前先模拟,识别之前先理解模型如何生成数据
  3. 数值方法不是附属工具,而是结构估计能否可信运行的核心部分

下节课:把这些基础工具用于需求估计、合并模拟、进入博弈、引力模型和人工智能辅助结构工作流。