经济与商务实证研究方法

第 7 周:结构估计应用——需求、均衡、反事实与人工智能辅助工作流

陈志远

中国人民大学商学院

2026-06-12

上节课回顾

结构估计基础

  • 结构模型由_原语、决策、均衡、观测方程_组成
  • 估计目标可写成 NLS、MLE、GMM 或 SMM
  • 固定点、数值梯度、蒙特卡洛模拟是结构估计的日常工具
  • 先模拟模型,再估计参数,最后做反事实

本节课的问题

估计出偏好和成本后,如何回答“如果政策或市场结构改变,会发生什么”?

本讲路线图

五个应用模块

  1. 随机效用需求:从逻辑选择模型到随机系数
  2. 替代模式与弹性:模型如何决定反事实可信度
  3. 供应侧与合并模拟:从价格和份额恢复边际成本
  4. 战略模型与引力模型:进入、定价和贸易反事实
  5. 人工智能辅助结构工作流:提速但不替代识别判断

一、随机效用需求

需求估计为什么重要?

需求系统是很多结构研究的入口

  • 工业组织:市场力、合并、反垄断
  • 市场营销:产品定位、定价、促销
  • 贸易:进口竞争、关税、产品替代
  • 金融与平台:费率、补贴、两边市场

核心任务:从消费者选择中恢复偏好参数,并用这些参数预测新情景。

离散选择需求模型

消费者 i 对产品 j 的效用:

u_{ij} = \delta_j + \mu_{ij} + \varepsilon_{ij}

其中

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

三层异质性

  • \delta_j:所有消费者共同看到的平均效用
  • \mu_{ij}:消费者异质性带来的偏好差异
  • \varepsilon_{ij}:模型未显式刻画的个体口味冲击

价格内生性:为什么 OLS 不能直接估计需求?

需求估计的核心挑战

价格和销量数据是需求与供给_同时决定_的均衡结果——我们看不到需求曲线本身。

考虑单产品需求:\ln(Q_{jt}) = \alpha \ln(P_{jt}) + X_{jt}\beta + \xi_{jt}

需求冲击 \xi_{jt} \uparrow → 需求右移 → 均衡量↑ → 均衡价格↑

结果:E[\xi_{jt} \cdot P_{jt}] > 0,OLS 的 \alpha 向上偏误(低估价格弹性)。

内生性偏误的数学分解

假设 \xi_{jt} = \rho \ln(P_{jt}) + \epsilon_{jt},代入需求方程:

\begin{align*} \ln(Q_{jt}) &= \alpha \ln(P_{jt}) + X_{jt}\beta + \rho \ln(P_{jt}) + \epsilon_{jt} \\ &= \underbrace{(\alpha + \rho)}_{\hat{\alpha}}\ln(P_{jt}) + X_{jt}\beta + \epsilon_{jt} \end{align*}

  • \rho > 0(需求冲击推高价格):\hat{\alpha} 向上偏误
  • 解决方案:工具变量 Z_{jt},满足 Cov(Z_{jt}, P_{jt}) \neq 0Cov(Z_{jt}, \xi_{jt}) = 0

工具变量与 GMM 方法

\xi_{jt} 表达为数据和参数的函数:

\xi_{jt}(\alpha, \beta) = \ln(Q_{jt}) - \alpha \ln(P_{jt}) - X_{jt}\beta

用工具变量构建矩条件 E[Z_{jt} \cdot \xi_{jt}(\alpha,\beta)] = 0

\min_{\alpha,\beta} \left\{ \frac{1}{N}\sum_j \xi_j(\alpha,\beta)'Z_j \; W \; \frac{1}{N}\sum_j Z_j'\xi_j(\alpha,\beta) \right\}

提示

单产品 → 多产品

以上是单产品的 IV/GMM 逻辑。在多产品离散选择模型中,内生性问题的结构更复杂,解决思路一脉相承。

产品空间 vs 特征空间

产品空间方法 特征空间方法
参数数量 J^2 个交叉价格效应 只估计特征偏好参数
新产品预测 无法预测 可预测(新产品 = 新特征组合)
替代模式 需 CES 等额外假设 由特征相似度自然产生

本课程聚焦特征空间方法——它是现代结构需求估计的主流范式。

逻辑选择模型的聚合:从 Type-I EV 到闭式解

\varepsilon_{ij} 服从第一型极值分布(Type-I Extreme Value),其 CDF 为:

F(\varepsilon) = e^{-e^{-\varepsilon}}

关键性质:若 \varepsilon_{ij} \sim_{iid} Type-I EV,则 \max_j\{U_{ij}\} 也服从 Type-I EV, 且选择概率有解析闭式(McFadden, 1973):

\begin{aligned} P_{ij} &= \Pr(U_{ij} \geq U_{ik}, \forall k) \\ &= \int_{-\infty}^{\infty} \prod_{k \neq j} e^{-e^{-(\delta_j - \delta_k + \varepsilon_{ij})}} \cdot e^{-\varepsilon_{ij}} e^{-e^{-\varepsilon_{ij}}} d\varepsilon_{ij} \\ &= \frac{e^{\delta_j}}{\sum_{k=0}^{J} e^{\delta_k}} \end{aligned}

因此市场份额和外部选项份额分别为:

s_j = \frac{e^{\delta_j}}{1+\sum_{k=1}^{J}e^{\delta_k}}, \quad s_0 = \frac{1}{1+\sum_{k=1}^{J}e^{\delta_k}}

Logit 模型的线性化:取对数比

\ln(s_j) - \ln(s_0),消去分母:

\ln(s_j) - \ln(s_0) = \delta_j = x_j\beta - \alpha p_j + \xi_j

提示

美妙的性质

取对数比后,Logit 模型变成线性方程!左边是数据(从市场份额计算),右边是参数。

在 Stata 中可直接用 logit 命令估计(假设价格外生)。

Logit 模型中的内生性处理

当价格内生时,利用 Logit 的解析结构:

\xi_j = \ln(s_j) - \ln(s_0) - (x_j\beta - \alpha p_j)

估计策略: 1. 从数据计算 \ln(s_j) - \ln(s_0) 作为因变量 2. 用工具变量 Z_j 构建矩条件 E[Z_j \cdot \xi_j(\alpha,\beta)] = 0 3. GMM 同时估计 \alpha\beta

优点:Logit 结构将非线性份额方程转化为线性矩条件。 局限:仍受制于 IIA——所有产品之间的替代模式完全相同。

独立无关替代限制与替代模式

逻辑选择模型隐含:

\frac{s_j}{s_k} = \frac{\exp(\delta_j)}{\exp(\delta_k)}

这个比值不受其他产品影响。

红巴士 / 蓝巴士问题

如果新加入一个“蓝巴士”,标准逻辑选择模型会让它从所有产品按比例抢份额,而不是主要从“红巴士”抢份额。这会扭曲合并模拟和新产品预测。

Nested Logit:放松 IIA

核心思想

将产品分成若干”巢”(nest),假设 IIA 在巢内成立,但不同巢之间的替代可以有不同强度。

例如:出行方式 → {自驾, 拼车} + {公交, 地铁}

  • 同一巢内的产品替代更强(红巴士 vs 蓝巴士)
  • 不同巢之间的替代更弱(汽车 vs 地铁)

Nested Logit 的随机项结构

J 个产品分入 K 个互斥的巢 B_1, \ldots, B_K。随机项 \varepsilon_{ij} 的联合 CDF 为:

F(\varepsilon) = \exp\left[-\sum_{k=1}^K \left(\sum_{j \in B_k} e^{-\varepsilon_{ij}/\lambda_k}\right)^{\lambda_k}\right]

  • 参数 \lambda_k \in (0,1]\lambda_k 越小,巢内相关性越强(替代越强)
  • \lambda_k = 1 退化为标准 Logit
  • 巢内相关性:\text{Corr}(\varepsilon_{ij}, \varepsilon_{i\ell}) = 1 - \lambda_k^2j, \ell \in B_k

Nested Logit 选择概率

产品 j \in B_k 的选择概率:

P_{ij} = \frac{e^{\delta_{ij}/\lambda_k} \cdot \left(\sum_{\ell \in B_k} e^{\delta_{i\ell}/\lambda_k}\right)^{\lambda_k-1}} {\sum_{m=1}^K \left(\sum_{\ell \in B_m} e^{\delta_{i\ell}/\lambda_m}\right)^{\lambda_m}}

  • 巢内 IIA 依然成立:\frac{P_{ij}}{P_{i\ell}} = \frac{e^{\delta_{ij}/\lambda_k}}{e^{\delta_{i\ell}/\lambda_k}}j, \ell \in B_k
  • 跨巢替代更灵活——由 \lambda_k 控制强度

局限

巢的划分是事先指定的(ex-ante),需要研究者的领域知识。划分不当则结果有误导性。能否让数据_自己告诉我们_替代模式?→ 随机系数模型

随机系数:让消费者不同

随机系数模型允许价格敏感度或特征偏好因人而异:

u_{ij} = x_j\beta_i - \alpha_i p_j + \xi_j + \varepsilon_{ij}

例如

\alpha_i = \alpha + \sigma_\alpha v_i

为什么有用

替代关系来自消费者异质性:价格敏感消费者在低价产品之间替代,质量敏感消费者在高质量产品之间替代。

用模拟计算市场份额

随机系数下没有简单闭式聚合:

s_j(\theta) = \int \frac{\exp(\delta_j+\mu_{ij})} {1+\sum_k\exp(\delta_k+\mu_{ik})} dF(v_i)

R 个模拟消费者近似:

\hat{s}_j(\theta) = \frac{1}{R}\sum_{r=1}^{R} \frac{\exp(\delta_j+\mu_{rj})} {1+\sum_k\exp(\delta_k+\mu_{rk})}

模拟异质性如何改变份额

BLP 估计:三步迭代法(Berry, 1994)

目标

估计参数 \theta = (\alpha, \beta, \Pi, \Sigma),使模型预测的市场份额匹配实际数据。关键是——只有非线性参数 \theta_2 = (\Pi, \Sigma) 需要数值搜索,线性参数 (\alpha, \beta) 有解析解。

步骤 做什么 输入 → 输出
Step 1 固定 \theta_2,用压缩映射求 \delta s^{data} = s(\delta; \theta_2) \Rightarrow \delta(\theta_2)
Step 2 \delta 做 IV 回归,得 \xi \delta = X\beta - \alpha p + \xi \Rightarrow \xi(\theta_2)
Step 3 计算 GMM 目标,搜索 \theta_2 \min_{\theta_2} \xi'Z W Z'\xi

Step 1:模拟市场份额

消费者 i 选择产品 j 的概率(Logit 核 + 随机系数):

function [pjt, pijt] = rc_share_safe(delta, params, draws, mkt)
    u1 = repmat(delta, [1 ns]) + mkt.x2 * params.betai';
    utils = exp(u1);
    pijt = utils ./ (1 + sum(utils));      % 每个消费者的选择概率
    pjt = pijt * draws.w;                   % 加权平均 → 市场份额
end
  • delta:当前平均效用猜测值(J \times 1
  • draws.vns 个模拟消费者的随机偏好抽取
  • draws.w:积分权重

Step 1(续):压缩映射求解 \delta

Berry (1994) 证明了如下压缩映射(contraction mapping):

\delta^{h+1} = \delta^{h} + \ln(s^{data}) - \ln(s(\delta^{h}; \theta_2))

% BLP 压缩映射
f = @(x) x + log(mkt.sjt) - log(rc_share_safe(x, params, draws, mkt));
% SQUAREM 加速算法(比标准压缩快约 5 倍)
[delta_hat] = fp_squarem(f, delta_init, 'algorithm', 'squarem');

提示

SQUAREM 加速(Reynaerts, Varadhan & Nash, 2012)

利用平方多项式外推,保持全局收敛性。每个市场独立求解,可并行计算(parfor)。

Step 2:IV 回归恢复 \xi

得到 \delta(\theta_2) 后,\xi 就是 IV 回归的残差:

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

function [beta, resid] = ivregression(Y, X, Z, W)
    if nargin < 4
        W = (Z' * Z) \ eye(size(Z, 2));
    end
    beta = (X' _ Z _ W _ Z' _ X) \ (X' _ Z _ W _ Z' _ Y);
    resid = Y - X * beta;
end
  • Y = \delta(Step 1 的输出),X = [x, -p]Z:工具变量矩阵
  • BLP 工具变量:同一企业其他产品特征 + 竞争企业产品特征

Step 3:GMM 目标函数与优化

function [fval, g] = evalSingle(theta)
    p = get_params(theta, draws);
    [delta, Jac] = solveAllShares(dtable, draws, p, 'fixed-point');
    [beta, resid] = ivregression(delta, X, Z, W);
    fval = (resid' _ Z) _ W _ (resid' _ Z)';       % GMM 目标值
    g = -2 _ (Jac' _ Z) _ W _ (resid' * Z)';        % 解析梯度
end

两步 GMM

  1. 第一阶段:W_1 = (Z'Z)^{-1},得到一致但不有效的初值

  2. 第二阶段:\hat{W}_{opt} = (Z'\hat{\xi}\hat{\xi}'Z)^{-1},得到有效估计

BLP 主程序骨架(MATLAB)

%% BLP 需求估计主程序(基于 Nevo 2000 谷物数据)
% 1. 加载数据和工具变量
load cereal_data.mat;

% 2. 设定模拟消费者(ns=500, K 个随机偏好维度)
draws.v = randn(ns, K);
draws.w = ones(ns, 1) / ns;

% 3. 第一步 GMM:一致估计
theta0 = zeros(n_theta, 1);
W1 = (Z' * Z) \ eye(size(Z,2));
[results1] = get_results(dtable, theta0);

% 4. 构建最优权重矩阵
[W_opt, ~] = getCovariance(results1.theta, dtable, draws);

% 5. 第二步 GMM:有效估计
[results2] = get_results(dtable, results1.theta);

% 6. 输出:价格系数 α、特征偏好 β、随机系数 σ
fprintf('价格系数 = %.3f (SE=%.3f)\n', results2.beta(end), results2.SE(end));

提示

学生实操建议

从玩具案例开始(3-5 个产品、50 个模拟消费者),理解每步的输入输出后,再扩展到完整数据(如 Nevo 2000 谷物数据)。

二、弹性与供应侧

价格弹性

自价格弹性:

\epsilon_{jj} = \frac{\partial s_j}{\partial p_j} \frac{p_j}{s_j}

交叉价格弹性:

\epsilon_{jk} = \frac{\partial s_j}{\partial p_k} \frac{p_k}{s_j}

经济含义

弹性矩阵告诉我们:当某个产品涨价,需求从哪里流走,又流向哪里。

逻辑选择弹性的限制

标准逻辑选择模型下:

\frac{\partial s_j}{\partial p_k} = \alpha s_j s_k \quad (j\neq k)

交叉替代主要由产品 k 的份额决定。

反事实风险

如果现实中的替代发生在“相似产品”之间,而模型只按份额分配替代,合并模拟会系统性失真。

供应侧:从价格恢复边际成本

假设单产品企业进行伯特兰价格竞争:

\max_{p_j} (p_j-mc_j)M s_j(p)

一阶条件:

s_j(p) + (p_j-mc_j)\frac{\partial s_j}{\partial p_j} =0

因此

mc_j = p_j + \frac{s_j(p)} {\partial s_j(p)/\partial p_j}

多产品企业的定价

若企业 f 拥有多个产品,定价一阶条件写成矩阵形式:

\mathbf{s}(p) + \Delta(p)(p-mc)=0

其中 \Delta_{jk} 取决于产品 j,k 是否属于同一企业:

\Delta_{jk} = \mathbb{1}\{j,k \in \mathcal{J}_f\} \frac{\partial s_k}{\partial p_j}

mc = p + \Delta(p)^{-1}\mathbf{s}(p)

合并模拟的逻辑

三步

  1. 用需求估计恢复 \hat{\theta}_D
  2. 用合并前一阶条件恢复 \widehat{mc}
  3. 改变所有权矩阵,重新解伯特兰定价固定点

合并后的价格满足:

\mathbf{s}(p^{new};\hat{\theta}_D) + \Delta^{new}(p^{new})(p^{new}-\widehat{mc}) =0

一个极简反事实代码骨架

def demand_shares(price, theta):
    delta = theta["beta"] _ x - theta["alpha"] _ price + xi
    exp_delta = np.exp(delta)
    return exp_delta / (1 + exp_delta.sum())

def pricing_residual(price, mc, ownership, theta):
    s = demand_shares(price, theta)
    deriv = demand_derivative(price, theta)
    Delta = ownership * deriv.T
    return s + Delta @ (price - mc)

price_new = solve_root(
    lambda p: pricing_residual(p, mc_hat, ownership_after, theta_hat),
    price_before
)

三、战略模型与贸易反事实

简单进入博弈

企业 i 是否进入市场:

a_i = \mathbb{1}\{\pi_i(a_{-i},X;\theta)+\varepsilon_i \geq 0\}

均衡要求每个企业的进入决策都是最优反应。

识别问题

我们观察到进入结果,但看不到每家企业的进入成本、私人信息和未实现反事实利润。

定价竞争:古诺与伯特兰

古诺双寡头中,企业选择产量:

\max_{q_i} P(q_i+q_{-i})q_i - C_i(q_i)

均衡由两个一阶条件同时决定:

f_i(q) = P(Q) + P'(Q)q_i - C_i'(q_i) =0

这就是 W6 中非线性方程求解的直接应用。

引力模型:结构与反事实

传统引力方程:

x_{ij} = \alpha + \alpha_1 y_i + \alpha_2 y_j + \theta d_{ij} + \gamma \delta_{ij} + \epsilon_{ij}

Anderson-van Wincoop 的结构逻辑:

x_{ij} = \frac{y_i y_j}{y^W} \left( \frac{t_{ij}}{P_iP_j} \right)^{1-\sigma}

多边阻力

贸易流取决于 i,j 之间的贸易成本,也取决于它们面对所有其他伙伴的贸易成本。

关税反事实

若关税下降改变 t_{ij},不能只替换一个回归变量。

需要重新求解:

P_j^{1-\sigma} = \sum_i P_i^{\sigma-1}\theta_i t_{ij}^{1-\sigma}

再计算新的贸易流:

x_{ij}^{new} = \frac{y_i y_j}{y^W} \left( \frac{t_{ij}^{new}}{P_i^{new}P_j^{new}} \right)^{1-\sigma}

减少形式 vs 结构反事实

同一问题 减少形式做法 结构做法
关税下降 估计关税对贸易流的平均影响 改变贸易成本并求解新均衡
平台补贴 DiD 估计补贴对交易量影响 模拟两边市场价格和参与
合并 研究既有合并案例 改变所有权矩阵并解新价格
新产品 找类似历史进入事件 加入选择集并重新聚合需求

互补而非替代

减少形式结果常用于验证结构模型;结构模型用于外推到未发生的政策情景。

四、人工智能辅助结构工作流

人工智能可以提高哪些环节的速度?

高收益环节

  • 从论文公式生成目标函数代码
  • 写市场份额模拟和蒙特卡洛抽样
  • 为内层固定点添加收敛日志
  • 用有限差分检查解析梯度
  • 比较 scipy.optimize 中不同求解器的失败模式

人工智能最适合做“工程加速器”,不适合做“经济假设裁判”。

一份结构估计审计清单

每次结构估计都要留下这些记录

  • 参数、初值、约束和缩放
  • 内层求解器的容差、最大迭代、失败次数
  • 蒙特卡洛抽样的种子和维度
  • 目标函数在最优点附近的稳定性
  • 识别参数的核心变异来源
  • 反事实改变了哪些原语,哪些对象保持不变

Copilot / 大语言模型提示模板

# 提示示例:
# 写一个 Python 函数,计算逻辑选择模型的市场份额和解析价格导数。
# 使用向量化 NumPy,加入维度检查,并同时返回份额和导数矩阵。

提示

好提示的结构

说明模型、输入形状、输出形状、数值稳定要求和要通过的单元测试。

本讲总结

本周带走的东西

  1. 需求估计的关键不是份额公式,而是替代模式和价格内生性
  2. 合并、关税、补贴等反事实都要求重新求解系统
  3. 人工智能可以显著加快结构编码,但不能替代对识别和经济假设的判断

期末项目建议:如果你的问题涉及“未发生的政策情景”,请认真考虑是否需要结构模型。