经济与商务实证研究方法 - 第 6 周:结构估计基础

完整讲义:模型原语、识别、仿真、估计准则与数值方法

作者
单位

陈志远

中国人民大学商学院

发布于

2026年5月29日

1 引言

前几周课程主要处理“已经发生的政策或冲击如何影响结果变量”。这种思路的典型工具是 DiD、IV、RD、合成控制和因果机器学习。它们的共同目标是把某个处理变量的因果效应识别出来。结构估计问的是另一个层次的问题:如果政策改变了价格、选择集、市场结构、进入成本或均衡条件,我们如何预测一个没有在样本中出现过的世界?

结构估计的核心不是“公式更多”,而是显式写出经济主体的决策系统。消费者如何选择,企业如何定价,市场如何出清,冲击如何进入行为,研究者看见什么、看不见什么,这些都要在模型中承担清楚。也正因为如此,结构估计能做反事实分析,但它的可信度高度依赖模型原语、识别假设与数值实现。

本讲的主线是“先模拟、后估计”。如果我们不能给定参数模拟一个模型,就很难真正理解估计器在恢复什么。如果我们能模拟,就可以在已知真值的世界中测试估计器、检查识别来源、观察目标函数形状,并提前暴露数值问题。

2 第一部分:结构估计的基本对象

2.1 从减少形式到结构系统

减少形式方法通常估计如下对象:

Yi=τDi+Xiβ+εi Y_i = \tau D_i + X_i'\beta + \varepsilon_i

这里的重点是识别 τ\tau 的因果解释。只要处理分配在某种设计下足够“像随机”,研究者可以不显式刻画个体为何接受处理、市场价格如何形成、其他主体如何反应。

结构模型则把观测结果看作一个经济系统的输出:

原语决策规则均衡观测数据 \text{原语} \rightarrow \text{决策规则} \rightarrow \text{均衡} \rightarrow \text{观测数据}

原语包括偏好、技术、成本、信息、约束和冲击分布。决策规则来自优化或行为假设。均衡条件要求主体的选择相互一致。观测方程把模型中的内生对象连接到数据中的价格、销量、份额、利润、进入状态或贸易流。

结构估计的优势来自这种系统性。比如我们不仅可以说“合并平均上是否提高价格”,还可以问“这两家企业合并之后,所有产品的新价格向量是多少,消费者剩余和企业利润如何变化”。但这种优势也对应更重的责任:必须说明模型假设为何合理,参数如何识别,反事实改变了哪些原语,哪些规则保持不变。

2.2 一个简单需求模型

以离散选择需求为例。消费者 ii 在市场 tt 中选择产品 jj 的效用为

uijt=δjt+εijt u_{ijt} = \delta_{jt} + \varepsilon_{ijt}

平均效用写作

δjt=xjtβαpjt+ξjt \delta_{jt} = x_{jt}\beta - \alpha p_{jt} + \xi_{jt}

其中 xjtx_{jt} 是产品特征,pjtp_{jt} 是价格,ξjt\xi_{jt} 是研究者没有观察到但消费者和企业可能观察到的产品质量,εijt\varepsilon_{ijt} 是个体层面的特异性偏好冲击。参数 α\alpha 衡量价格敏感度,β\beta 衡量对产品特征的平均偏好。

这个模型马上暴露需求估计的核心内生性问题。如果企业观察到 ξjt\xi_{jt},高质量产品会有更高需求,也可能被设置更高价格,于是 pjtp_{jt}ξjt\xi_{jt} 正相关。直接回归市场份额或销量对价格,价格系数会混合需求曲线斜率和未观测质量。结构模型没有自动解决内生性;它只是更清楚地说明内生性来自哪里,并迫使我们寻找工具变量、成本变动来源或其他识别变异。

3 第二部分:先模拟,后估计

3.1 模拟的作用

模拟是结构估计最好的入口。给定参数,我们可以生成市场、消费者选择、企业价格和观测误差。然后我们把模拟数据当成真实数据,测试估计程序能否恢复已知参数。这一过程至少有三点价值。

第一,它帮助我们理解模型的经济机制。比如提高价格敏感度 α\alpha 后,高价产品份额是否下降;提高产品质量 ξ\xi 后,企业是否倾向于设置更高价格。第二,它帮助我们理解识别。只有当不同参数对数据产生可区分的变化时,参数才可能被识别。第三,它帮助我们调试代码。结构估计的目标函数往往有内层固定点、模拟积分和非线性优化,直接在真实数据上调试很容易分不清是模型错、代码错还是数据弱。

3.2 模拟一个逻辑选择市场

下面的代码模拟一个 J=8J=8 的产品市场。消费者有外部选项,产品份额由逻辑选择公式聚合。

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_share = 1 - shares.sum()

pd.DataFrame({
    "product": np.arange(1, J + 1),
    "x": x,
    "price": price,
    "xi": xi,
    "share": shares
}).round(3)
product x price xi share
0 1 0.200 1.140 -0.070 0.076
1 2 0.457 1.218 0.081 0.098
2 3 0.714 1.409 -0.070 0.079
3 4 0.971 1.608 -0.070 0.073
4 5 1.229 1.596 0.036 0.102
5 6 1.486 1.724 -0.287 0.076
6 7 1.743 1.998 -0.259 0.065
7 8 2.000 2.061 -0.084 0.087

逻辑选择模型有一个重要的反演关系:

logsjlogs0=δj \log s_j - \log s_0 = \delta_j

代入平均效用方程得到

logsjlogs0=xjβαpj+ξj \log s_j - \log s_0 = x_j\beta - \alpha p_j + \xi_j

这说明市场份额不是模型的终点,而是把选择结果转化为平均效用的入口。真实需求估计中,价格内生性、工具变量、随机系数和供应侧定价都会围绕这个平均效用展开。

3.3 识别的直觉

结构估计中的识别不是“参数个数少于样本量”这么简单。识别要求数据中的变异能够区分参数的作用。价格敏感度 α\alpha 需要价格变化和份额变化,但价格变化必须有外生来源;产品特征偏好 β\beta 需要特征变化,但特征不能完全由未观测质量驱动;成本参数需要供应侧行为假设;替代模式需要看到消费者如何在不同产品之间转移。

一个实用的识别检查是:改变某个参数,模拟数据中哪个矩最明显变化?如果答案含糊,或者多个参数总是产生相似变化,估计器在真实数据中就可能脆弱。

4 第三部分:估计准则

4.1 非线性最小二乘

如果模型给出条件均值

yi=h(xi;θ)+εi y_i = h(x_i;\theta) + \varepsilon_i

非线性最小二乘选择

θ̂NLS=argminθi[yih(xi;θ)]2 \hat{\theta}_{NLS} = \arg\min_{\theta} \sum_i [y_i-h(x_i;\theta)]^2

许多结构模型虽然看起来复杂,但最终可以写成“观测值与模型预测值之间的距离”。Anderson-van Wincoop 引力模型就是典型例子。贸易流不仅取决于双边距离和边界,还取决于多边阻力项 Pi,PjP_i,P_j。这些价格指数不是普通控制变量,而是由全局贸易成本系统内生决定。估计时要在给定参数下解出这些价格指数,再计算模型预测的贸易流。

4.2 最大似然

最大似然要求模型给出观测数据的概率分布。若样本独立同分布,密度为 f(xi|θ)f(x_i|\theta),似然函数为

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

通常最大化对数似然:

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

最大似然的直觉是选择一组参数,让我们看到的数据在模型中最可能出现。Rust (1987) 的公交车发动机更换模型是结构最大似然的经典例子。外层参数决定动态规划问题,内层求解决策价值函数,最后用观测到的更换决策构造似然。这也是嵌套固定点的经典来源。

4.3 GMM 与 SMM

GMM 从矩条件出发:

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

样本矩为

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

估计量为

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

如果模型矩无法解析计算,但可以模拟,就得到 SMM:

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

SMM 的关键是选择矩。好的矩应当对目标参数敏感,并且能被数据可靠估计。矩的选择既有统计效率问题,也有经济解释问题。比如进入模型中,进入率、竞争者数量分布、市场规模与进入的相关性可能分别识别固定进入成本、竞争效应和需求规模。

5 第四部分:数值基础

5.1 非线性方程

结构估计经常要求解非线性方程:

f(x)=0 f(x)=0

也可以写成固定点:

T(x)=x T(x)=x

古诺模型中的一阶条件、BLP 的平均效用反演、引力模型中的多边阻力项、动态模型中的 Bellman 方程,都属于这一类问题。

牛顿方法来自一阶 Taylor 展开:

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

令近似式为 0,可得

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

牛顿方法在根附近可能非常快,但需要好的初值、平滑函数和可逆雅可比矩阵。实际结构估计中,牛顿方法失败不一定是程序写错,也可能意味着目标函数局部不稳定、参数缩放糟糕、约束没有处理好,或者模型在某些参数下没有均衡。

5.2 数值梯度和雅可比矩阵

如果解析梯度难以写出,可以用有限差分近似:

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

中心差分更准确:

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

步长 hh 不能随意选。过大产生截断误差,过小产生舍入误差。实践中常用 h=max(|x|,1)ϵh=\max(|x|,1)\sqrt{\epsilon} 作为一侧差分的起点,其中 ϵ\epsilon 是机器精度。正式估计前,应当用数值梯度检查解析梯度,尤其是矩阵维度复杂的需求估计和动态模型。

5.3 固定点与压缩映射

如果映射 TT 满足

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

TT 是压缩映射。Banach 固定点定理保证唯一固定点存在,并且迭代

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

从任意初值收敛到该固定点。

这对结构估计很重要。BLP 需求估计中的平均效用收缩映射、Alvarez-Lucas 类型贸易模型中的价格系统、某些动态规划中的 Bellman 算子,都依赖固定点逻辑。只要能证明或经验上确认内层映射稳定,整个估计程序就更可审计。

6 第五部分:嵌套固定点

结构估计常有内外两层循环。外层优化器选择参数 θ\theta,内层在给定 θ\theta 下求解模型均衡 x*(θ)x^*(\theta)。目标函数依赖这个内层解:

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

伪代码如下。

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

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

调试顺序非常重要。第一,先确认模拟器在给定参数下能生成合理数据。第二,确认内层固定点在一组参数上稳定收敛。第三,固定内层解,测试目标函数是否随参数有合理变化。第四,最后才启动外层优化器。很多结构估计失败,并不是因为优化器不够高级,而是因为前面三步没有被单独验证。

7 第六部分:人工智能辅助但不替代经济判断

大语言模型和 Copilot 可以显著提高结构估计编码速度。它们适合把公式翻译成函数、生成有限差分检查、写求解器日志、重构重复代码、解释错误信息、比较优化器接口。尤其是在目标函数和矩阵维度复杂时,人工智能可以减少低级工程错误。

但人工智能不能替代经济判断。它无法替你决定市场边界是否合理,工具变量是否可信,均衡概念是否适用,反事实是否改变了模型外生原语,或者某个参数是否真的被数据识别。结构估计的可信度来自经济论证、数据变异、模型验证和审计记录,而不是代码看起来优雅。

一份最低限度的结构估计审计记录应包括:参数定义、初值和约束;内层求解容差和失败次数;蒙特卡洛抽样的种子与维度;目标函数在最优点附近的稳定性;关键识别变异来源;反事实中被改变和保持不变的对象。没有这些记录,结构反事实很难被复现和评估。

8 小结

本讲建立了结构估计的基础语言。结构模型把数据解释为经济主体决策和均衡系统的结果。估计方法可以是 NLS、MLE、GMM 或 SMM,但共同点都是让模型生成的对象接近数据中的对象。数值方法不是附属工具,而是结构估计能否运行、能否被验证、能否被复现的核心部分。

下一讲将进入应用:随机效用需求估计、替代模式、价格弹性、合并模拟、进入博弈、引力模型和人工智能辅助结构工作流。