引言
前几周课程主要处理“已经发生的政策或冲击如何影响结果变量”。这种思路的典型工具是 DiD、IV、RD、合成控制和因果机器学习。它们的共同目标是把某个处理变量的因果效应识别出来。结构估计问的是另一个层次的问题:如果政策改变了价格、选择集、市场结构、进入成本或均衡条件,我们如何预测一个没有在样本中出现过的世界?
结构估计的核心不是“公式更多”,而是显式写出经济主体的决策系统。消费者如何选择,企业如何定价,市场如何出清,冲击如何进入行为,研究者看见什么、看不见什么,这些都要在模型中承担清楚。也正因为如此,结构估计能做反事实分析,但它的可信度高度依赖模型原语、识别假设与数值实现。
本讲的主线是“先模拟、后估计”。如果我们不能给定参数模拟一个模型,就很难真正理解估计器在恢复什么。如果我们能模拟,就可以在已知真值的世界中测试估计器、检查识别来源、观察目标函数形状,并提前暴露数值问题。
第一部分:结构估计的基本对象
从减少形式到结构系统
减少形式方法通常估计如下对象:
这里的重点是识别 的因果解释。只要处理分配在某种设计下足够“像随机”,研究者可以不显式刻画个体为何接受处理、市场价格如何形成、其他主体如何反应。
结构模型则把观测结果看作一个经济系统的输出:
原语包括偏好、技术、成本、信息、约束和冲击分布。决策规则来自优化或行为假设。均衡条件要求主体的选择相互一致。观测方程把模型中的内生对象连接到数据中的价格、销量、份额、利润、进入状态或贸易流。
结构估计的优势来自这种系统性。比如我们不仅可以说“合并平均上是否提高价格”,还可以问“这两家企业合并之后,所有产品的新价格向量是多少,消费者剩余和企业利润如何变化”。但这种优势也对应更重的责任:必须说明模型假设为何合理,参数如何识别,反事实改变了哪些原语,哪些规则保持不变。
一个简单需求模型
以离散选择需求为例。消费者 在市场 中选择产品 的效用为
平均效用写作
其中 是产品特征, 是价格, 是研究者没有观察到但消费者和企业可能观察到的产品质量, 是个体层面的特异性偏好冲击。参数 衡量价格敏感度, 衡量对产品特征的平均偏好。
这个模型马上暴露需求估计的核心内生性问题。如果企业观察到 ,高质量产品会有更高需求,也可能被设置更高价格,于是 与 正相关。直接回归市场份额或销量对价格,价格系数会混合需求曲线斜率和未观测质量。结构模型没有自动解决内生性;它只是更清楚地说明内生性来自哪里,并迫使我们寻找工具变量、成本变动来源或其他识别变异。
第二部分:先模拟,后估计
模拟的作用
模拟是结构估计最好的入口。给定参数,我们可以生成市场、消费者选择、企业价格和观测误差。然后我们把模拟数据当成真实数据,测试估计程序能否恢复已知参数。这一过程至少有三点价值。
第一,它帮助我们理解模型的经济机制。比如提高价格敏感度 后,高价产品份额是否下降;提高产品质量 后,企业是否倾向于设置更高价格。第二,它帮助我们理解识别。只有当不同参数对数据产生可区分的变化时,参数才可能被识别。第三,它帮助我们调试代码。结构估计的目标函数往往有内层固定点、模拟积分和非线性优化,直接在真实数据上调试很容易分不清是模型错、代码错还是数据弱。
模拟一个逻辑选择市场
下面的代码模拟一个 的产品市场。消费者有外部选项,产品份额由逻辑选择公式聚合。
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)
| 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 |
逻辑选择模型有一个重要的反演关系:
代入平均效用方程得到
这说明市场份额不是模型的终点,而是把选择结果转化为平均效用的入口。真实需求估计中,价格内生性、工具变量、随机系数和供应侧定价都会围绕这个平均效用展开。
识别的直觉
结构估计中的识别不是“参数个数少于样本量”这么简单。识别要求数据中的变异能够区分参数的作用。价格敏感度 需要价格变化和份额变化,但价格变化必须有外生来源;产品特征偏好 需要特征变化,但特征不能完全由未观测质量驱动;成本参数需要供应侧行为假设;替代模式需要看到消费者如何在不同产品之间转移。
一个实用的识别检查是:改变某个参数,模拟数据中哪个矩最明显变化?如果答案含糊,或者多个参数总是产生相似变化,估计器在真实数据中就可能脆弱。
第三部分:估计准则
非线性最小二乘
如果模型给出条件均值
非线性最小二乘选择
许多结构模型虽然看起来复杂,但最终可以写成“观测值与模型预测值之间的距离”。Anderson-van Wincoop 引力模型就是典型例子。贸易流不仅取决于双边距离和边界,还取决于多边阻力项 。这些价格指数不是普通控制变量,而是由全局贸易成本系统内生决定。估计时要在给定参数下解出这些价格指数,再计算模型预测的贸易流。
最大似然
最大似然要求模型给出观测数据的概率分布。若样本独立同分布,密度为 ,似然函数为
通常最大化对数似然:
最大似然的直觉是选择一组参数,让我们看到的数据在模型中最可能出现。Rust (1987) 的公交车发动机更换模型是结构最大似然的经典例子。外层参数决定动态规划问题,内层求解决策价值函数,最后用观测到的更换决策构造似然。这也是嵌套固定点的经典来源。
GMM 与 SMM
GMM 从矩条件出发:
样本矩为
估计量为
如果模型矩无法解析计算,但可以模拟,就得到 SMM:
SMM 的关键是选择矩。好的矩应当对目标参数敏感,并且能被数据可靠估计。矩的选择既有统计效率问题,也有经济解释问题。比如进入模型中,进入率、竞争者数量分布、市场规模与进入的相关性可能分别识别固定进入成本、竞争效应和需求规模。
第四部分:数值基础
非线性方程
结构估计经常要求解非线性方程:
也可以写成固定点:
古诺模型中的一阶条件、BLP 的平均效用反演、引力模型中的多边阻力项、动态模型中的 Bellman 方程,都属于这一类问题。
牛顿方法来自一阶 Taylor 展开:
令近似式为 0,可得
牛顿方法在根附近可能非常快,但需要好的初值、平滑函数和可逆雅可比矩阵。实际结构估计中,牛顿方法失败不一定是程序写错,也可能意味着目标函数局部不稳定、参数缩放糟糕、约束没有处理好,或者模型在某些参数下没有均衡。
数值梯度和雅可比矩阵
如果解析梯度难以写出,可以用有限差分近似:
中心差分更准确:
步长 不能随意选。过大产生截断误差,过小产生舍入误差。实践中常用 作为一侧差分的起点,其中 是机器精度。正式估计前,应当用数值梯度检查解析梯度,尤其是矩阵维度复杂的需求估计和动态模型。
固定点与压缩映射
如果映射 满足
则 是压缩映射。Banach 固定点定理保证唯一固定点存在,并且迭代
从任意初值收敛到该固定点。
这对结构估计很重要。BLP 需求估计中的平均效用收缩映射、Alvarez-Lucas 类型贸易模型中的价格系统、某些动态规划中的 Bellman 算子,都依赖固定点逻辑。只要能证明或经验上确认内层映射稳定,整个估计程序就更可审计。
第五部分:嵌套固定点
结构估计常有内外两层循环。外层优化器选择参数 ,内层在给定 下求解模型均衡 。目标函数依赖这个内层解:
伪代码如下。
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))
调试顺序非常重要。第一,先确认模拟器在给定参数下能生成合理数据。第二,确认内层固定点在一组参数上稳定收敛。第三,固定内层解,测试目标函数是否随参数有合理变化。第四,最后才启动外层优化器。很多结构估计失败,并不是因为优化器不够高级,而是因为前面三步没有被单独验证。
第六部分:人工智能辅助但不替代经济判断
大语言模型和 Copilot 可以显著提高结构估计编码速度。它们适合把公式翻译成函数、生成有限差分检查、写求解器日志、重构重复代码、解释错误信息、比较优化器接口。尤其是在目标函数和矩阵维度复杂时,人工智能可以减少低级工程错误。
但人工智能不能替代经济判断。它无法替你决定市场边界是否合理,工具变量是否可信,均衡概念是否适用,反事实是否改变了模型外生原语,或者某个参数是否真的被数据识别。结构估计的可信度来自经济论证、数据变异、模型验证和审计记录,而不是代码看起来优雅。
一份最低限度的结构估计审计记录应包括:参数定义、初值和约束;内层求解容差和失败次数;蒙特卡洛抽样的种子与维度;目标函数在最优点附近的稳定性;关键识别变异来源;反事实中被改变和保持不变的对象。没有这些记录,结构反事实很难被复现和评估。
小结
本讲建立了结构估计的基础语言。结构模型把数据解释为经济主体决策和均衡系统的结果。估计方法可以是 NLS、MLE、GMM 或 SMM,但共同点都是让模型生成的对象接近数据中的对象。数值方法不是附属工具,而是结构估计能否运行、能否被验证、能否被复现的核心部分。
下一讲将进入应用:随机效用需求估计、替代模式、价格弹性、合并模拟、进入博弈、引力模型和人工智能辅助结构工作流。