反事实分析:结构估计的终极目的
为什么结构模型能回答"如果政策改变会怎样"?Lucas Critique 与 Policy Invariance,需求侧并购模拟、动态政策反事实、福利计算。
本页属于结构估计「基础知识库」。定位:先单独学会这个工具,再到模型分支里看它怎么用。反事实是结构估计的"终极目的"——估计出结构参数后,代入新政策/新市场结构重新解均衡,回答"如果……会怎样"。本页按「是什么 → 为什么学 → 数学定义 → 直觉 → 逐步操作 → 完整代码 → 常见错误」讲透。
01 为什么结构模型能做反事实:Lucas Critique
结构估计(structural estimation)和简约式(reduced-form)的根本区别,不在于"用了复杂模型",而在于:结构估计恢复的是 deep structural parameters(深层结构参数),这些参数被认为在政策变化时是稳定的。这就是 Lucas Critique (1976) 的核心论点:
"Given that the structure of an econometric model consists of optimal decision rules of economic agents, and that optimal decision rules vary systematically with changes in the structure of series relevant to the decision maker, it follows that any change in policy will systematically alter the structure of econometric models."
翻译:简约式回归中估计出来的"参数"(如消费函数的边际消费倾向),其实是消费者在特定政策环境下的最优决策规则。一旦政策变了,这个规则本身就变了——所以用历史回归系数去预测新政策的效果是错的。
1.1 Policy Invariance 假设
结构模型之所以能做反事实,是因为它把经济分解为:
- 偏好 / 技术参数(preferences / technology):$\theta$,如消费者对价格的边际效用、企业的边际成本函数——这些被假设不随政策变化;
- 制度 / 政策环境变量(institutions / policy environment):$\psi$,如税率、补贴、规制规则、市场结构——这些是可以在反事实中改变的。
反事实分析的合法性,完全建立在"$\theta$ 不变,$\psi$ 改变"这一假设上,即 policy invariance。
1.2 与 RCT / DID 的对比
一个好的 RCT 或 DID 能告诉你"政策 A 实施后,Y 变了多少"——但它只在政策 A 的具体形式下成立。如果政策变成 A'(比如补贴从 10% 改成 20%),RCT 外推不出去。结构模型的承诺是:只要 $\theta$ 不变,你可以任意改变 $\psi$ 并重新求解模型,得到新的均衡结果。这就是政策评估(policy evaluation)和反事实分析(counterfactual analysis)的区别。
如果政策变化大到改变了偏好本身(例如长期禁烟运动改变了人们对吸烟的 taste for smoking),那么 $\theta$ 也变了,反事实就失效。结构模型的"可信度"取决于对"什么算 deep parameter"的判断——这也是结构估计论文最容易被攻击的地方。
02 反事实分析的一般流程
无论静态(BLP)还是动态(DDCM),反事实分析都遵循同一个"四步循环":
- 静态需求模型:求新的 Bertrand-Nash 价格 $p^{cf}$(迭代求解一阶条件);
- 动态模型:在新的政策转移矩阵下,重新解 Bellman 方程,得到新的 CCP 和价值函数;
- 一般均衡模型:重新求市场出清价格与数量。
03 需求侧反事实:并购模拟与价格变化
3.1 并购模拟(Merger Simulation)
这是 BLP 最常见的应用。两家企业 $f_1$ 和 $f_2$ 合并后,它们的产品在定价时内部化彼此的利润——这会抬高均衡价格。步骤:
Step 1: 估计反事实前的均衡
用 BLP 估计出需求系统 $\hat\theta$,并用 Bertrand FOC(见 04-blp.html Equation 6.4)反推出每个产品的边际成本 $c_j$。
Step 2: 改变 ownership matrix
合并前,$\Omega_{jk} = 1$ 当且仅当 $j,k$ 同属一个企业;合并后,$f_1$ 和 $f_2$ 旗下所有产品现在同属一家企业,因此 $\Omega^{cf}_{jk} = 1$ 当 $j$ 在 $f_1$、$k$ 在 $f_2$。
Step 3: 解新的 Nash-Bertrand 均衡价格
这是一个关于 $p^{cf}$ 的 $J$ 维非线性方程组,通常用迭代法(contraction mapping)求解。
Step 4: 计算福利变化
合并导致价格上升,消费者剩余减少;企业利润上升。社会总福利变化 = $\Delta CS + \Delta PS + \Delta$ 政府税收。反垄断机构关心的是 $\Delta CS$ 与 $\Delta$ deadweight loss。
3.2 其他需求侧反事实
- 价格变化:对产品 $j$ 加从量税 $\tau$,让 $p_j^{cf} = p_j + \tau$,看份额与福利如何变;
- 新产品引入:在特征空间中加一个新产品 $J+1$,求它进入后的均衡价格与被替代的现有产品份额;
- 特征变化:车企把所有车的油耗降低 20%,估计对总需求和环境外部性的影响。
04 动态模型的反事实:长期行为变化
动态结构模型的反事实比静态更有意思,因为它能捕捉短期反应 vs 长期反应的差异。
4.1 静态 vs 动态反事实
- 静态:假设今天的选择不影响明天。政策改变 → 今天的选择概率立即变化 → 福利计算。
- 动态:政策改变 → 不仅当期效用变了,未来的价值函数 $V(x)$ 也变了 → 今天的选择不仅因为"今天更划算"而变,还因为"未来期望收益"变了。这个"forward-looking" channel 是动态模型独有的。
4.2 举例:延迟退休政策
假设我们用 DDCM 估计了中国工人的退休决策模型(状态 $x = (age, wage, pension\_wealth, health)$,选择 $d \in \{工作, 退休\}$)。现在政策把法定退休年龄从 60 推迟到 63:
- 静态反事实:60-62 岁的人现在不能退休了,被迫继续工作——只看当期 CCP 的机械变化;
- 动态反事实:工人预期到 63 岁才能退休,会提前调整年轻时的储蓄、人力资本投资、健康行为——这些是 forward-looking 反应,只有动态模型能捕捉。
4.3 求解步骤
把政策变化 $\psi^{cf}$ 代入 flow utility $u^{cf}$ 和转移 $p^{cf}$,重新解 Bellman 不动点,得到新的 CCP $P^{cf}(d|x)$,然后模拟新的选择路径与福利。
05 福利计算:CS、EV、CV
反事实分析的最终输出几乎总是福利(welfare)。三个常用概念:
5.1 消费者剩余(Consumer Surplus, CS)
在 logit / BLP 中,由于 taste shock 是 Extreme Value,个体层面的期望消费者剩余有解析形式——log-sum-exp 公式:
其中 $1/\alpha_i$ 是把效用单位换算成"美元"的系数($\alpha_i$ 是价格的边际效用,其倒数就是收入边际效用的倒数)。市场层面的总 CS 是在消费者分布上积分:
5.2 补偿变化(Compensating Variation, CV)
反事实下,价格/特征从 $x$ 变到 $x^{cf}$,补偿变化是"为了让消费者在新环境下和原环境一样幸福,需要给他多少(或收走多少)收入":
$CV > 0$ 表示政策让消费者受益(需要给他"等价"的收入补偿才能在旧环境下一样好——反事实更好);$CV < 0$ 表示政策让消费者受损。总 $CV = M_t \int CV_i \, dF$。
5.3 生产者剩余(Producer Surplus / Profit)
反事实利润 $\Pi_f^{cf}$ 用新均衡的 $p^{cf}, s^{cf}$ 计算。
5.4 总福利
反垄断 / 税收 / 补贴政策分析的核心就是报告 $\Delta W$ 及其在消费者、生产者、政府之间的分配。
06 完整 Python 案例
下面用一个简化的 BLP 需求模型,演示完整的反事实分析:(1) 估计需求;(2) 反事实:两个产品合并;(3) 计算新均衡价格、消费者剩余变化。
"""
反事实分析完整案例
==================
步骤:
1. 简化的 logit 需求系统(4 个产品 + 外部产品)
2. 估计需求参数(这里直接给定"已估计"参数)
3. Bertrand-Nash 均衡反推 marginal cost
4. 反事实:合并产品 1 和产品 2,求新均衡价格
5. 计算 CV(补偿变化)与利润变化
"""
import numpy as np
from scipy.optimize import fsolve
# ---------- 1. 设定 ----------
J = 4 # 产品数
M = 1.0 # 市场规模(标准化)
# 产品特征(观察)
X = np.array([1.0, 0.5, 2.0, 1.5]) # 产品"质量"
# 估计出的需求参数
beta = 1.0 # 对质量的偏好
alpha = -1.5 # 对价格的偏好(负号表示厌恶价格)
# ---------- 2. 市场份额函数 ----------
def shares(p, X, alpha, beta):
"""
logit 需求: s_j = exp(delta_j) / (1 + sum exp(delta_k))
delta_j = X_j*beta + alpha*p_j
"""
delta = X * beta + alpha * p
# 数值稳定
delta_max = delta.max()
exp_d = np.exp(delta - delta_max)
s = exp_d / (1 + exp_d.sum())
s0 = 1 / (1 + exp_d.sum())
return s, s0
def own_elasticity(p, X, alpha, beta):
"""
d s_j / d p_j = alpha * s_j * (1 - s_j)
交叉: d s_j / d p_k = -alpha * s_j * s_k
"""
s, s0 = shares(p, X, alpha, beta)
# 构造 Jacobian: J[j,k] = ds_j/dp_k
Jmat = np.zeros((J, J))
for j in range(J):
for k in range(J):
if j == k:
Jmat[j, k] = alpha * s[j] * (1 - s[j])
else:
Jmat[j, k] = -alpha * s[j] * s[k]
return Jmat
# ---------- 3. 基准均衡:反推 marginal cost ----------
# 假设基准价格已知(模拟数据)
p_base = np.array([1.0, 1.0, 1.2, 1.1])
s_base, s0_base = shares(p_base, X, alpha, beta)
Jmat = own_elasticity(p_base, X, alpha, beta)
# 基准 ownership: 每个产品独立企业
Omega_base = np.eye(J)
# Bertrand FOC: s + (J' * Omega)' (p - c) = 0
# 解 c: c = p + (Jmat' * Omega)^(-1) s
A = (Jmat.T * Omega_base)
c_base = p_base + np.linalg.solve(A, s_base)
print("基准 marginal costs:", np.round(c_base, 3))
print("基准 markup (p - c):", np.round(p_base - c_base, 3))
# ---------- 4. 反事实:合并产品 1 和产品 2 ----------
Omega_cf = np.eye(J)
Omega_cf[0, 1] = 1.0 # 产品 0 和产品 1 现在同属一家企业
Omega_cf[1, 0] = 1.0
# 解新的 Nash-Bertrand 均衡价格
def foc_cf(p_cf):
s, _ = shares(p_cf, X, alpha, beta)
Jm = own_elasticity(p_cf, X, alpha, beta)
A_cf = (Jm.T * Omega_cf)
return s + A_cf @ (p_cf - c_base)
p_cf = fsolve(foc_cf, p_base)
print("\n反事实均衡价格:", np.round(p_cf, 3))
print("价格变化 %:", np.round(100*(p_cf - p_base)/p_base, 2))
s_cf, s0_cf = shares(p_cf, X, alpha, beta)
print("\n基准份额:", np.round(s_base, 4))
print("反事实份额:", np.round(s_cf, 4))
# ---------- 5. 福利计算:消费者剩余变化 ----------
def consumer_surplus(p, X, alpha, beta):
"""
log-sum-exp 形式: CS = (1/alpha) * log(1 + sum exp(delta_j))
注意 alpha 是负的,所以 CS 是正的
"""
delta = X * beta + alpha * p
lse = np.log(1 + np.exp(delta - delta.max()).sum()) + delta.max()
CS = (1 / alpha) * lse # alpha 为负,但 lse 为正 → CS 为负? 用符号约定
return CS
CS_base = consumer_surplus(p_base, X, alpha, beta)
CS_cf = consumer_surplus(p_cf, X, alpha, beta)
# CV = CS_cf - CS_base(因为 alpha<0, CS 是"负效用",CV 应为正表示损失)
CV = (CS_cf - CS_base) / alpha # 单位换算
print(f"\n基准 CS: {CS_base:.4f}")
print(f"反事实 CS: {CS_cf:.4f}")
print(f"消费者剩余变化 (CV): {CV:.4f}")
# 企业利润
profit_base = np.sum((p_base - c_base) * s_base)
profit_cf = np.sum((p_cf - c_base) * s_cf)
print(f"\n基准利润: {profit_base:.4f}")
print(f"反事实利润: {profit_cf:.4f}")
print(f"利润变化: {profit_cf - profit_base:.4f}")
这段代码完整展示了反事实分析的四步:(1) 给定需求参数;(2) 由 Bertrand FOC 反推 marginal cost;(3) 改变 ownership matrix 后用 fsolve 求新均衡;(4) 用 log-sum-exp 公式算 CS/CV。学术论文级实现还需要:(a) 把简化 logit 换成 BLP 随机系数;(b) 用真实市场份额数据估计参数;(c) 报告 bootstrap 标准误;(d) 对合并的效率效应(marginal cost 下降)做敏感性分析。
07 论文案例
08 常见错误与陷阱
用历史数据回归 $Y = \alpha + \beta X + \epsilon$,然后把政策变化 $\Delta X$ 代进去预测 $\Delta Y$。这正是 Lucas 批评的做法——$\beta$ 本身就是在旧政策下的最优反应,政策变了 $\beta$ 也变了。结构模型的全部价值就在于把 $\theta$(不随政策变)和 $\psi$(随政策变)分开。
只把政策变化代入消费者需求端,假设企业定价不变,直接算新的份额。这是错的——企业会对政策做出最优反应,均衡价格会变。反事实必须重新解完整的均衡(消费者最优 + 企业最优同时满足)。
BLP 中 $\delta_j$ 的单位是"util"(效用单位),不是"美元"。要换算成货币必须除以价格的边际效用 $\alpha$(或其均值 $\bar\alpha$)。忘记这一步,福利数字会差几个数量级。
反事实结果只是一个点估计,但其分布依赖于 $\hat\theta$ 的抽样不确定性。必须用 bootstrap(重新抽样估计参数,对每个 bootstrap 重新做完整反事实)或 delta method 报告标准误 / 置信区间。
用静态 BLP 模型分析"长期补贴政策"是错的——消费者和企业的长期反应(资本积累、进入退出)不会被静态模型捕捉。这种情况下必须用动态结构模型(或双向动态模型)。
局部均衡(partial equilibrium)反事实假设其他市场不变。如果政策足够大(如全国碳税、大规模贸易协定),一般均衡(general equilibrium)反馈(工资、利率、汇率变化)会改变结果。QSGE 模块就是处理这类问题的。
09 进阶资料
- Nevo (2000, JEL) — 上文已引,反事实部分有详细的并购模拟步骤。
- Petrin (2002, JPE) — Quantifying the Benefits of New Products: The Case of the Minivan. 用 BLP 反事实计算"Minivan 引入"的消费者福利收益,是新产品福利分析的经典。
- Aguirregabiria & Nevo (2013) — Recent developments in structural estimation. 涵盖反事实分析的内部有效性(internal validity)与外部有效性(external validity)讨论。
- Keane, Todd, Wolpin (2011) — Handbook of Labor Economics 章节,动态反事实在劳动政策评估中的应用。
- Wooldridge 等关于结构模型可信度的讨论 — structural vs. causal reduced-form 的现代辩论(也见 Nevo & Whinston 2010)。
- 中文教材:陈志俊、孙宁等关于产业组织结构估计的中文综述;《数量经济技术经济研究》上关于中国政策评估的结构方法论文。