广义矩估计 GMM
自包含完整模型分支:从经济环境与矩条件假设出发,完整推导线性 IV 模型与消费欧拉方程两个案例的矩条件;覆盖阶条件/秩条件识别、GMM 估计量推导、最优权重矩阵、Hansen J 检验、与 2SLS 的关系、弱工具诊断,最后用 Python 手写两步 GMM 并讲解如何报告结果。
本页属于结构估计「基础知识库」。定位:先单独学会这个工具,再到模型分支里看它怎么用。当分布写不出来、只能写出几个"条件矩为零"的方程时,MLE 失效、GMM 上场。本页按「是什么 → 为什么学 → 数学定义 → 直觉 → 逐步操作 → 完整代码 → 常见错误」讲透;掌握后再回模型分支看它如何嵌入。
- BLP 随机系数需求模型 —— Berry–Levinsohn–Pakes 的核心估计量:用 BLP 收缩映射求出隐含价格,再用 GMM 矩条件(含 BLP instruments)估计。
- 生产函数估计(OP/LP/ACF) —— 用投资/中间投入代理不可观测生产率,在矩条件下 GMM 估计生产函数参数。
- 消费欧拉方程(跨期最优化) —— 用 E[Δln c 的工具变量] 构造矩条件,是 GMM 最早、最经典的宏观应用。
ivreg2、gmm)或 Python(手写 scipy.optimize 矩条件 + statsmodels 辅助)。01 经济环境与假设
GMM(Generalized Method of Moments, Hansen 1982)是为"写不出完整分布、但能写出矩条件"的环境准备的。它适用的经济环境有三个关键特征:
1.1 矩条件可由经济理论推出
最常见的矩条件来源有三类:
- 正交性条件:工具变量与误差项不相关,$E[Z_i\varepsilon_i]=0$(IV 回归、动态面板);
- 最优化一阶条件:家庭/企业最优化的 Euler 方程,如 $E[\beta(1+r_{t+1})(c_{t+1}/c_t)^{-\sigma}-1\mid z_t]=0$;
- 矩匹配:模型预测矩 = 数据矩(SMM、BLP)。
这些矩条件的共同形式是:存在一个向量函数 $g_i(\theta)$,使得在真实参数 $\theta_0$ 处 $E[g_i(\theta_0)]=0$。
1.2 不需要完整分布假设
与 MLE 不同,GMM 不要求知道 $\varepsilon_i$ 的完整分布形状。你只需要知道"某个变量与误差不相关"这种正交关系。这在误差分布形状未知、或误设代价大的结构模型里特别重要——比如消费欧拉方程,没人知道跨期替代弹性 $\sigma$ 的误差服从什么分布,但最优化一阶条件是清清楚楚的。
1.3 依赖结构与渐近近似
GMM 的一致性与渐近正态性需要:样本矩满足大数定律(独立或弱依赖)、标准化样本矩满足中心极限定理、矩条件关于 $\theta$ 可微、且 $E[\partial g_i/\partial\theta']$ 满秩。时间序列数据要求平稳遍历;面板数据要求个体间独立。
当经济模型能推出"一组期望为零的正交条件",但你不想(或不能)对误差分布做强假设时,用 GMM。MLE 是"用得分作矩条件"的 GMM 特例。
02 完整模型一:线性 IV 模型
2.1 模型设定与经济背景
经济背景:估计教育回报率 $y_i=\log(\text{wage}_i)=\beta_0+\beta_1\,S_i+\beta_2\,\text{experience}_i+\varepsilon_i$,其中教育年限 $S_i$ 与能力 $\varepsilon_i$ 相关(能力高的人既多上学又工资高),OLS 估计 $\beta_1$ 有偏。工具变量 $z_i$(如出生季度、距大学距离)需要与 $S_i$ 相关、但与 $\varepsilon_i$ 不相关。
2.2 为什么用 IV?矩条件的经济含义
OLS 的识别假设是 $E[x_i\varepsilon_i]=0$。当 $x_i$ 中有内生变量(如教育与能力相关),这一假设被破坏。IV 方法把"正交"对象从 $x_i$ 换成工具变量 $z_i$:
经济含义:工具变量 $z_i$ 通过"因果通道"影响内生变量 $x_i$,但不通过任何其他通道影响 $y_i$,因此它与结构误差 $\varepsilon_i$ 正交。例如出生季度影响上学年龄(相关),但与个人能力、家庭背景无关(外生)。
2.3 从矩条件到估计量
样本矩是 $\bar g_n(\beta)=\frac1n Z'(y-X\beta)=\frac1n\sum_i z_i(y_i-x_i'\beta)$。当工具个数 $L$ 等于参数个数 $K$(恰好识别),令 $\bar g_n=0$ 直接解出 $\hat\beta_{IV}=(Z'X)^{-1}Z'y$。当 $L>K$(过度识别),矩方程多于未知数,GMM 用二次距离最小化(见第 5 节)。
03 完整模型二:消费欧拉方程
这是 GMM 最经典的"不是回归、而是最优化一阶条件"的应用。
3.1 家庭跨期优化问题
考虑一个无限期家庭,选择消费序列 $\{c_t\}$ 最大化期望折现效用:
其中 $\beta$ 是主观贴现因子,$\sigma$ 是相对风险厌恶系数(也是跨期替代弹性的倒数),$r_{t+1}$ 是资产回报率。
3.2 推导欧拉方程
在 $t$ 期,家庭权衡"今天少消费 1 单位、存到明天"的成本与收益:今天少消费的边际效用损失是 $u'(c_t)=c_t^{-\sigma}$;明天多消费 $(1+r_{t+1})$ 单位的期望边际效用收益是 $E_t[\beta(1+r_{t+1})u'(c_{t+1})]$。最优时两者相等:
把它写成无条件期望形式(用迭代期望 law of iterated expectations),并用 $t$ 期信息集 $z_t$ 中的变量做工具:
这里 $z_t$ 必须是 $t$ 期(或更早)已知的变量——滞后消费增长、滞后利率等——因为 $t$ 期信息对家庭已知,所以预测误差与 $z_t$ 正交。这就是 Hall (1978)、Hansen-Singleton (1982) 的经典设定。
3.3 为什么用 GMM 而不是 MLE?
欧拉方程只给出"预测误差与 $t$ 期信息正交"的矩条件,没有给出误差项的完整分布。你可以假设误差服从对数正态,但这是额外假设;GMM 不需要这个假设,只用矩条件就能估计 $\beta$ 和 $\sigma$。这正是 GMM 替代 MLE 的典型场景。
04 矩条件、识别:阶条件与秩条件
设矩条件个数为 $L$,参数个数为 $K$,矩条件关于参数的导数矩阵为 $G=E[\partial g_i(\theta_0)/\partial\theta']$。
4.1 识别的定义
参数 $\theta_0$ 被识别,当且仅当:若 $\theta\neq\theta_0$,则 $E[g_i(\theta)]\neq 0$。换句话说,只有真值能让所有矩条件同时成立。
4.2 阶条件(order condition)
矩条件个数至少等于参数个数。这是必要条件,不是充分条件。
4.3 秩条件(rank condition)
在线性 IV 模型里,$G=-E[Z_i X_i']$,秩条件等价于"工具变量与内生解释变量足够相关"——即第一阶段回归矩阵 $E[Z_i'X_i]$ 列满秩。这正是"工具相关性"的数学表达。
| 情形 | 阶条件 | 秩条件 | 权重矩阵 | J 检验 |
|---|---|---|---|---|
| 恰好识别 $L=K$ | 满足 | 需满秩 | 任意 $W$ 给同一估计量 | 无多余矩,无法检验 |
| 过度识别 $L>K$ | 满足 | 需满秩 | $W$ 影响效率,应选 $S^{-1}$ | 可做 Hansen J 检验 |
| 识别不足 $L<K$ | 不满足 | 不满足 | — | — |
05 GMM 估计量推导与最优权重
GMM 的目标函数是把样本矩向量 $\bar g_n(\theta)$ 用权重矩阵 $W$ 做二次型:
对线性 IV 模型 $\bar g_n(\beta)=\frac1n Z'(y-X\beta)$,一阶条件 $\partial J/\partial\beta=0$ 给出解析解:
关键问题:权重矩阵 $W$ 怎么选?Hansen (1982) 证明,最优权重矩阵是矩条件渐近方差矩阵的逆,让"方差大、噪声多的矩"权重小:
直观:方差 $S$ 大的矩信噪比低,应该少听它的话;方差小的矩精确,应该权重高。用 $W=S^{-1}$ 得到的 GMM 估计量渐近有效。麻烦在于 $S$ 本身依赖未知 $\theta_0$,无法直接算——这就是"两步法"存在的原因。
06 两步 / 迭代 / 连续更新 GMM
因为 $S(\theta)$ 依赖 $\theta$,GMM 实际是"估计权重—估计参数—更新权重—再估参数"的循环。三种主流实现:
两步 GMM 在过度识别、$n$ 不大时往往过度拒绝(过度精确)。经验做法:报告两步 GMM,同时用迭代 GMM / CUE 作稳健性;并把协方差用 Newey-West / cluster 调整。
07 Hansen J 检验
过度识别时,最优 GMM 在真实 $\theta_0$ 处的最小化目标函数 $J(\hat\theta)$ 有一个标准的渐近分布。Hansen (1982) 证明:
自由度 = 多余矩个数 $L-K$。直觉:$J$ 衡量"最优 GMM 后样本矩还有多离谱"。如果模型正确,剩下的离差只是抽样噪声,服从 $\chi^2$。若 $J$ 过大(p 值很小),说明至少有一个矩条件被模型拒绝,即过度识别约束不成立。
J 检验只检验"所有矩条件一起成立",它对弱矩、异方差、序列相关都敏感。J 不显著 ≠ 模型正确,只能说明"在现有矩条件下没找到拒绝证据"。
08 与 2SLS 的关系、弱工具变量
8.1 2SLS 是 GMM 的特例
线性 GMM 估计量 $\hat\beta_{GMM}(W)=(X'ZWZ'X)^{-1}X'ZWZ'y$。取 $W=(Z'Z)^{-1}$(即同方差下的"自然"权重)时回到 2SLS:
取 $W=\hat S^{-1}$(异方差稳健权重)则是最优 GMM(异方差稳健 GMM)。结论:2SLS 是 GMM 在"同方差"假设下的特例;当存在异方差时,最优 GMM 比 2SLS 更有效。
8.2 弱工具变量问题
当工具变量与内生变量相关性很弱(第一阶段 $F$ 统计量接近 1)时:
- GMM/2SLS 的小样本偏误很大,估计值朝 OLS 方向偏;
- 渐近正态分布严重失真,标准误不可信;
- Hansen J 检验也会失效。
诊断:第一阶段 F > 10(Stock-Yogo 经验阈值)才认为工具足够强;否则应报告 weak-IV robust 推断(如 Anderson-Rubin 置信集),而不是 GMM 点估计。需要强调的是,弱工具问题在小样本与过度识别时尤为严重:工具越多、样本越小,GMM 的偏误越大,渐近正态近似越不可靠,此时即使 Hansen J 检验不显著也不能对参数值下定论。
在实践中,若第一阶段 F 不足,常见应对有三种:一是筛选掉最弱的工具、减少过度识别个数;二是改用对弱工具更稳健的 LIML / Fuller 估计量;三是放弃点估计,直接报告 Anderson-Rubin 对参数的置信区间——后者在工具弱时仍然有效,是最稳妥的做法。
09 数据要求:工具变量的有效性
GMM 对数据的核心要求全部围绕"工具变量是否有效"展开,分两个条件:
9.1 相关性(relevance)
工具变量 $z_i$ 必须与内生解释变量 $x_i$ 有非零的偏相关。检验方法:第一阶段回归 $x_i=\pi' z_i+v_i$,检验工具系数联合显著性的 $F$ 统计量。$F>10$ 是经验阈值(Stock-Yogo),$F<10$ 说明弱工具问题。
9.2 外生性(exogeneity / exclusion restriction)
工具变量必须与结构误差 $\varepsilon_i$ 不相关,即 $E[z_i\varepsilon_i]=0$。这个条件无法直接检验——它是识别假设,必须由经济论证:工具只能通过内生变量影响被解释变量,不能有其他通道。过度识别时,Hansen J 检验可以间接检验"是否所有工具都外生",但弱工具下 J 检验本身不可靠。
9.3 样本量与矩条件个数
线性 IV 模型 $n$ 至少几百;非线性 GMM(如欧拉方程)通常需要 $n\ge 1000$。矩条件个数 $L$ 不宜过多——每多加一个弱工具,反而会放大小样本偏误。经验法则:参数 $K$ 之外,多余矩 $L-K$ 控制在 $K$ 以内。
10 代码:两步 GMM 完整实现
下面用模拟数据估计一个带内生解释变量的线性模型 $y=x_1\beta_1+x_2\beta_2+u$,其中 $x_2$ 内生、$x_1$ 外生,用 $z_1,z_2$ 作工具变量,手写两步 GMM 并算 J 统计量。
import numpy as np
from scipy.optimize import minimize
from scipy.stats import chi2
# ---------- 1. 造模拟数据 ----------
np.random.seed(2026)
n = 2000
# 外生变量 x1, 工具 z1,z2(与 x2 相关)
z1 = np.random.randn(n)
z2 = np.random.randn(n)
x1 = np.random.randn(n)
# 内生变量 x2 = 0.8*z1 + 0.5*z2 + 0.3*x1 + v(与 u 相关 -> 内生)
v = np.random.randn(n)
u = 0.7*v + np.random.randn(n) # u 与 v 相关 => x2 内生
x2 = 0.8*z1 + 0.5*z2 + 0.3*x1 + v
beta_true = np.array([1.0, 0.5, -0.3]) # [截距, b_x1, b_x2]
X = np.column_stack([np.ones(n), x1, x2])
y = X @ beta_true + u
# 工具变量矩阵 Z:[1, x1, z1, z2] (z1,z2 是额外工具,L>K -> 过度识别)
Z = np.column_stack([np.ones(n), x1, z1, z2])
L, K = Z.shape[1], X.shape[1] # L=4 个矩, K=3 个参数 -> 过度识别
# ---------- 2. 矩条件:g_i(beta) = Z_i' * u_i = Z_i'*(y_i - X_i beta) ----------
def moments(beta):
u_hat = y - X @ beta
return (Z * u_hat[:, None]) # n x L,每行是 g_i
# ---------- 3. 给定权重 W,最小化 J(beta)=n * gbar' W gbar ----------
def J(beta, W):
gbar = moments(beta).mean(axis=0) # L-vector
return n * gbar @ W @ gbar
# ---------- 4. 第一步:W1 = (Z'Z/n)^-1 -> 等价 2SLS ----------
W1 = np.linalg.inv(Z.T @ Z / n)
res1 = minimize(J, np.zeros(K), args=(W1,), method='BFGS')
b1 = res1.x
# ---------- 5. 用第一步残差估计 S = E[g_i g_i'] ----------
g1 = moments(b1) # n x L
S = (g1.T @ g1) / n # 矩条件长期方差(i.i.d. 下即此式)
W2 = np.linalg.inv(S)
# ---------- 6. 第二步:最优 GMM ----------
res2 = minimize(J, b1, args=(W2,), method='BFGS')
b2 = res2.x
# ---------- 7. 标准误:var = (G' S^-1 G)^-1 / n ----------
# 矩条件对 beta 的导数 G = E[∂g_i/∂beta'] = -E[Z_i X_i'] = -Z'X/n
G = -(Z.T @ X) / n
A = G.T @ W2 @ G
vcov = np.linalg.inv(A) / n
se = np.sqrt(np.diag(vcov))
# ---------- 8. Hansen J 统计量 ----------
gbar_b2 = moments(b2).mean(axis=0)
J_stat = n * gbar_b2 @ W2 @ gbar_b2
df = L - K
pval = 1 - chi2.cdf(J_stat, df)
# ---------- 9. 第一阶段 F 统计量(工具相关性诊断) ----------
from numpy.linalg import lstsq
Zall = np.column_stack([np.ones(n), x1, z1, z2])
b_first = lstsq(Zall, x2, rcond=None)[0]
resid_fs = x2 - Zall @ b_first
# 简化:直接报告 z1,z2 的系数(应显著为正)
print("真实 beta :", beta_true)
print("两步GMM beta:", np.round(b2, 4))
print("标准误 :", np.round(se, 4))
print(f"第一阶段系数 z1={b_first[2]:.3f}, z2={b_first[3]:.3f}(应显著为正)")
print(f"Hansen J = {J_stat:.3f}, df={df}, p = {pval:.3f}")
两步 GMM 系数应接近真值 $[1.0,0.5,-0.3]$;OLS 会因为 $x_2$ 内生而偏离。J 统计量在数据确实由模型生成时应当不显著(p 较大);若 p 很小,说明工具/模型设定被拒绝。生产代码可用 linearmodels 的 IVGMM 包。
11 应用解读:如何报告 GMM 结果
11.1 系数与标准误
报告两步 GMM 点估计(或迭代/CUE 稳健性),括号里写异方差稳健(或 cluster/Newey-West)标准误。系数解释与 OLS 相同——线性模型里就是偏效应;非线性 GMM(如欧拉方程)要解释结构参数($\sigma$ 是风险厌恶系数,$\beta$ 是贴现因子)。
11.2 第一阶段与弱工具诊断
必须报告第一阶段 $F$ 统计量(或 partial $R^2$)。$F>10$ 才能说"工具足够强";$F<10$ 时要改用 Anderson-Rubin 置信集或 LIML,不要只报 GMM 点估计。
11.3 Hansen J 检验
过度识别时必须报告 $J$ 统计量与 p 值。J 不显著(p>0.1)说明"没有证据拒绝过度识别约束";J 显著则说明至少一个工具可能不外生,需要排查。
11.4 报告模板
一张标准 GMM 结果表至少包含:GMM 系数(括号 robust se)、显著性星号、观测数 $n$、第一阶段 $F$、Hansen $J$ 与 p 值、过度识别自由度 $L-K$。
12 论文案例
13 常见错误
第一步 $W_1=I$ 只用于拿初值;标准误与 J 检验必须用第二步的 $\hat S^{-1}$。混用会高估精度。
$\hat S$ 必须用 Newey-West(时间序列)或 cluster-robust(面板)调整;否则标准误和 J 统计量都失真。
第一阶段 F 统计量低时,GMM 偏误大、推断不可靠。先报第一阶段 F,弱工具要换 Anderson-Rubin 置信集。
J 只检验过度识别约束,且对弱矩敏感。模型误设要靠额外的子样本、额外矩、诊断回归来查,不能只看 J 不显著。
外生性 $E[z_i\varepsilon_i]=0$ 在恰好识别时无法检验,只能靠经济论证。过度识别时 J 检验也只是"间接"证据,不能替代论证。
每加一个弱矩条件,小样本偏误和方差都可能上升。矩条件不是越多越好,要精选"强且外生"的工具。
欧拉方程矩条件里 $z_t$ 必须是 $t$ 期信息集内的变量(滞后变量),不能用 $t+1$ 期变量——后者与预测误差相关,矩条件失效。
14 进阶资料
- Hansen, Heaton & Yaron (1996), "Finite Sample Properties of Some Alternative GMM Estimators", JBES —— 两步 vs 迭代 vs CUE 的小样本比较。
- Hayashi, Econometrics, 2000, Ch.3/4 —— GMM 与 IV/2SLS 关系的标准教材。
- Stock, Wright & Yogo (2002), "A Survey of Weak Instruments in IV Regression", Journal of Business & Economic Statistics.
- 软件:Python
linearmodels.iv.gmm;MATLABgp_gmm包;Rgmm包。