📚 基础知识库 · KNOWLEDGE BASE / MLE

本页属于结构估计「基础知识库」。定位:先单独学会这个工具,再到模型分支里看它怎么用。本页把 MLE 从具体应用中抽出来,按「是什么 → 为什么学 → 数学定义 → 直觉 → 逐步操作 → 完整代码 → 常见错误」讲透;掌握后再回到下面的模型分支,看 MLE 如何嵌进具体的结构模型。

🔗 本工具在哪些模型分支中使用:
  • 离散选择模型 —— Logit/Probit/Mixed Logit 的核心估计量,由 McFadden 奠基。
  • 拍卖模型 —— 私有价值、观测到 bids 且似然可解析写出时,直接最大化似然。
  • 动态结构模型 —— 似然函数可解析写出时(如 NFXP 对 CCP 的似然)使用 MLE;似然不可得时改用 SMM
📚 前置条件与学习依赖 / Prerequisites
① 数学/统计基础:概率论:条件概率、密度/似然函数构造、Bayes 法则;数理统计:大数定律/中心极限定理、Cramér–Rao 下界、Fisher 信息矩阵、得分函数;数值优化:Newton–Raphson、BHHH、BFGS 拟牛顿法。
② 经济学理论前置:Wooldridge《计量经济学导论》水平;理解线性回归、假设检验、异方差/序列相关的直觉即可。
③ 软件/计算前置:Stata(mllogitprobit)或 Python(scipy.optimize.minimizestatsmodels)。
④ 站内前置页面:无(结构估计模块的第一个技术页);建议先看 结构估计总览
⑤ 难度分级:入门

01 经济环境与假设

极大似然估计(Maximum Likelihood Estimation, MLE)是参数模型下的主力估计方法。在动手推导之前,必须先把"什么经济环境能用 MLE"说清楚,否则后面的效率性质都没有落脚点。MLE 适用的环境由四层假设构成:

1.1 参数模型族假设

我们假设观测数据 $(y_i, X_i)$ 的条件分布属于一个已知形式、仅依赖有限维参数 $\theta$ 的分布族 $\{f(\cdot\mid X_i,\theta):\theta\in\Theta\}$。这意味着:研究者不仅知道"条件均值是 $X_i'\beta$"这种一阶矩信息,还必须完整写出整条条件密度——例如误差服从正态、对数正态,或离散结果服从伯努利/泊松。这是 MLE 与 GMM 最根本的区别:GMM 只需要"几个矩条件为零",MLE 需要"整条分布长什么样"。

1.2 分布设定假设

对连续被解释变量,最常见的设定是误差 $\varepsilon_i\mid X_i\sim N(0,\sigma^2)$;对二值结果,则假设潜变量误差服从标准正态(Probit)或逻辑斯蒂(Logit)。选择哪一种分布,不是数学上的自由发挥,而要由经济模型 justify:

  • 为什么用正态? 经济残差通常可看作"众多小而独立的扰动因素之和"(measurement error、未观测的偏好/能力波动),由中心极限定理,正态是自然的一阶近似;此外正态在共轭性、闭式推导上最方便。
  • 为什么同方差? 同方差 $Var(\varepsilon_i\mid X_i)=\sigma^2$ 是基准简化。它不是真实——微观数据几乎一定有异方差——而是"让 MLE 回到 OLS、让似然有漂亮一阶条件"的基准。一旦怀疑异方差,应改用 sandwich 标准误,而不是假装它不存在。

1.3 依赖结构假设

横截面数据默认观测独立同分布(i.i.d.),即 $(y_i,X_i)$ 与 $(y_j,X_j)$ 相互独立。面板数据则放宽为"个体内序列相关、个体间独立",此时似然要写成条件似然,标准误要做 cluster 调整。时间序列数据要求平稳性与遍历性,否则 $\frac1n\sum_i$ 不会依概率收敛。

1.4 正则条件(regularity conditions)

要让 MLE 有一致性、渐近正态、有效性,还需一组技术条件:参数空间 $\Theta$ 紧、密度对 $\theta$ 三阶连续可微、密度的支撑集与 $\theta$ 无关(不能因为参数变了,数据可能取值的范围就变了)、三阶矩有界。这些条件在标准线性/Probit 模型里自动满足,在混合模型、结构模型里则需要逐一验证。

MLE 环境一句话总结

当你能写出"在给定 $X$ 下 $y$ 的完整条件密度,且参数只有限维、观测大致独立"时,MLE 就是首选估计量;当你只能写出几个矩条件、写不出完整分布时,才轮到 GMM。

02 完整模型一:正态线性回归

我们用最经典的案例把 MLE 全流程走一遍。

2.1 模型设定与假设逐条陈述

正态线性回归模型
$$y_i = x_i'\beta + \varepsilon_i,\qquad \varepsilon_i\mid X_i \sim N(0,\sigma^2),\quad i=1,\dots,n$$

逐条解释每个假设:

  • 线性于参数:$y_i$ 是 $x_i'\beta$ 的线性函数($x_i$ 里可以放平方、交互项),误差 $\varepsilon_i$ 概括所有未被观测因素。
  • 条件正态:$\varepsilon_i\mid X_i$ 服从 $N(0,\sigma^2)$。这比"$\varepsilon_i$ 与 $X_i$ 独立"更强——不仅均值为零,整条分布形状都不随 $X$ 变。理由:残差是大量微小扰动之和,CLT 近似正态。
  • 条件同方差:$Var(\varepsilon_i\mid X_i)=\sigma^2$ 与 $X_i$ 无关。这是为了让 $\sigma^2$ 只有一个参数;异方差情形见后面 sandwich 标准误。
  • 独立:不同 $i$ 的 $\varepsilon_i$ 相互独立(横截面)。

2.2 写出条件密度

由 $y_i\mid X_i \sim N(x_i'\beta,\sigma^2)$,单观测条件密度为:

单观测条件密度
$$f(y_i\mid X_i,\beta,\sigma^2)=\frac{1}{\sqrt{2\pi\sigma^2}}\exp\!\left[-\frac{(y_i-x_i'\beta)^2}{2\sigma^2}\right]$$

读作:"给定 $X_i$,$y_i$ 落在观测值处的相对可能性"。指数上的 $(y_i-x_i'\beta)^2/(2\sigma^2)$ 是标准化残差平方,决定了曲线宽窄。

2.3 似然函数与对数似然

独立观测的联合密度是单观测密度的连乘,把它看作参数的函数就是似然函数:

似然函数(连乘 → 取对数)
$$\mathcal{L}(\beta,\sigma^2)=\prod_{i=1}^n \frac{1}{\sqrt{2\pi\sigma^2}}\exp\!\left[-\frac{(y_i-x_i'\beta)^2}{2\sigma^2}\right]$$ $$\ell(\beta,\sigma^2)=\sum_{i=1}^n\log f = -\frac n2\log(2\pi)-\frac n2\log\sigma^2-\frac{1}{2\sigma^2}\sum_{i=1}^n(y_i-x_i'\beta)^2$$

对数似然的最后一项 $-\frac{1}{2\sigma^2}\sum(y_i-x_i'\beta)^2$ 就是"残差平方和"。它揭示了一个关键事实:在正态同方差假设下,最大化对数似然等价于最小化残差平方和——MLE 的一阶条件正是 OLS 的正规方程。

2.4 一阶条件与解析解

对 $\beta$ 求导令其为零:

MLE = OLS(正态线性模型的经典结论)
$$\frac{\partial\ell}{\partial\beta}=\frac{1}{\sigma^2}\sum_{i=1}^n X_i'(y_i-X_i'\beta)=0\;\Longrightarrow\;\hat\beta_{MLE}=(X'X)^{-1}X'y=\hat\beta_{OLS}$$

再对 $\sigma^2$ 求导,得 $\hat\sigma^2=\frac{1}{n}\sum(y_i-X_i'\hat\beta)^2$(注意是除以 $n$ 而非 $n-K$,这是 MLE 的小样本轻微向下偏倚,OLS 用 $n-K$ 修正)。

03 完整模型二:Probit 离散选择

线性回归是 MLE 的"热身"。真正体现 MLE 威力的是没有闭式解的模型,二值选择 Probit 是入门典范。

3.1 潜变量模型设定

假设个体 $i$ 有一个不可观测的"净效用"或"倾向分" $y_i^*$:

Probit 潜变量模型
$$y_i^* = x_i'\beta + \varepsilon_i,\qquad y_i=\mathbf{1}\{y_i^*>0\},\qquad \varepsilon_i\mid X_i\sim N(0,1)$$

经济解释:$y_i^*$ 是"购买/求职/通过考试"等行为的净效用,研究者只能观测到它是否跨过零阈值——买了 ($y_i=1$) 还是没买 ($y_i=0$)。

3.2 为什么误差用标准正态而不是 Logistic?

这是初学者最常问的问题。回答分三层:

  • 尺度归一化:潜变量 $y_i^*$ 的尺度不可识别——如果把 $\beta$ 和 $\varepsilon$ 同时乘以任意正数,观测到的 $y_i$ 不变。因此必须人为固定 $Var(\varepsilon_i)=1$(Probit)或 $Var(\varepsilon_i)=\pi^2/3$(Logit),这叫 scale normalization
  • 为什么正态? 与线性模型同理:未观测偏好/能力是大量小因素之和,CLT 给正态一个理论依据;正态假设下 $\Phi(\cdot)$ 有标准化闭式,便于解释"边际效应"。
  • 与 Logistic 的差别:Logistic 尾部更厚,对极端 $x'\beta$ 处的概率预测更敏感;Probit 在中间区域(概率 0.2–0.8)与 Logit 几乎重合,只在两端有别。经济理论通常不指定尾部形状,所以 Probit 与 Logit 是"近似等价"的设定选择,不是对错问题。

3.3 选择概率与似然函数

由潜变量设定,观测概率为:

Probit 选择概率
$$P(y_i=1\mid x_i)=P(x_i'\beta+\varepsilon_i>0)=P(\varepsilon_i>-x_i'\beta)=\Phi(x_i'\beta)$$ $$P(y_i=0\mid x_i)=1-\Phi(x_i'\beta)$$

这里 $\Phi(\cdot)$ 是标准正态 CDF。单个观测对似然的贡献是"$y_i$ 取到观测值的概率":

Probit 对数似然
$$\ell(\beta)=\sum_{i=1}^n\Big[y_i\log\Phi(x_i'\beta)+(1-y_i)\log\big(1-\Phi(x_i'\beta)\big)\Big]$$

这个对数似然对 $\beta$ 求导后,一阶条件是 $\sum_i X_i'\dfrac{\phi(x_i'\beta)}{\Phi(x_i'\beta)}(y_i-\Phi(x_i'\beta))=0$——没有解析解,必须数值迭代。这正是 MLE 数值优化章节存在的原因。

04 似然、得分函数与信息矩阵

上一节两个案例都写出了对数似然。本节抽象出 MLE 的三个核心对象,它们是理解标准误、检验、优化算法的共同语言。

4.1 得分函数

得分函数(score function) $s_i(\theta)$ 是单个观测对数密度对 $\theta$ 的一阶导,它衡量"第 $i$ 个观测对 $\theta$ 应该往哪调"的边际信号:

得分函数 score
$$s_i(\theta)=\frac{\partial \log f(y_i\mid X_i,\theta)}{\partial \theta},\qquad \bar{s}(\theta)=\frac{1}{n}\sum_{i=1}^n s_i(\theta)$$

MLE 的一阶条件就是"样本平均得分为 0":$\bar{s}(\hat\theta)=0$。关键恒等式(正则条件下):真实参数处得分的期望为 0,即 $E[s_i(\theta_0)]=0$。这把 MLE 和 GMM 联系了起来——MLE 本质上是"用得分作矩条件"的 GMM。

4.2 Fisher 信息矩阵

信息矩阵刻画得分的波动,有两种等价写法:

Fisher 信息矩阵(信息矩阵恒等式)
$$I(\theta_0)=E\!\left[s_i(\theta_0)s_i(\theta_0)'\right]=-E\!\left[\frac{\partial^2 \log f(y_i\mid X_i,\theta_0)}{\partial\theta\,\partial\theta'}\right]$$

等式两边相等是信息矩阵恒等式:得分的方差 = 对数似然二阶导期望的负号。它成立的前提是模型正确设定。这个恒等式是后面三种标准误"在正确设定下渐近等价"的根源。

05 MLE 的三大渐近性质

在标准正则条件下,MLE 有三大渐近性质:

① 一致性 Consistency
$\hat\theta_{MLE}\xrightarrow{p}\theta_0$。样本量越大,估计越靠近真值。
② 渐近正态 Asymptotic Normality
中心化并乘以 $\sqrt n$ 后趋于正态,协方差恰为信息矩阵的逆:
MLE 渐近分布(Cramér–Rao 效率的来源)
$$\sqrt{n}\big(\hat\theta_{MLE}-\theta_0\big)\xrightarrow{d} N\!\big(0,\;I(\theta_0)^{-1}\big)$$
③ 渐近有效性 Asymptotic Efficiency
在所有一致渐近正态估计量里,MLE 的渐近方差达到 Cramér–Rao 下界 $I(\theta_0)^{-1}$——没有别的估计量能在大样本下更精确。这是 MLE 最吸引人的性质,也是它对分布误设最敏感的根源。
效率的代价

MLE 的"效率"是在模型正确设定时才成立的。一旦分布假设错了(比如真实误差厚尾,你却用了正态),MLE 不再是有效估计,甚至不再一致,渐近方差也不再是 $I^{-1}$。这正是 robust sandwich 标准误要解决的问题。

06 数值优化:Newton / BHHH / BFGS

解析解只在线性回归、简单指数族里存在;Probit 及绝大多数结构模型要数值优化 $\ell(\theta)$。三种主流算法都是"迭代更新",差别在于用什么近似 Hessian。记当前迭代值 $\theta^{(t)}$,梯度 $g^{(t)}=\nabla\ell(\theta^{(t)})$。

6.1 Newton–Raphson

直接用真实 Hessian $H^{(t)}=\nabla^2\ell(\theta^{(t)})$:

Newton 更新
$$\theta^{(t+1)}=\theta^{(t)}-H^{(t)-1}g^{(t)}$$

优点:二次收敛,靠近最优解时极快。缺点:每次都要算(数值差分或解析)二阶导,维度高时代价大;且当 $\ell$ 非凹时 Hessian 可能不正定,需要做修正。

6.2 BHHH(Berndt–Hall–Hall–Hausman)

利用信息矩阵恒等式,用"得分外积之和"代替真实 Hessian。因为单个观测的得分 $s_i$ 容易算,外积近似 $H\approx-\sum_i s_i s_i'$ 几乎免费:

BHHH 更新(外积近似 Hessian)
$$\theta^{(t+1)}=\theta^{(t)}+\Big(\sum_{i=1}^n s_i(\theta^{(t)})s_i(\theta^{(t)})'\Big)^{-1}\sum_{i=1}^n s_i(\theta^{(t)})$$

这正是为什么 MLE 代码里"只写得分、不写 Hessian"也能跑——BHHH 自动用外积构造方向。产业组织的经典 MLE 代码多采用此法。

6.3 DFP / BFGS(拟牛顿)

用梯度信息递归地累积出 Hessian 逆的近似 $B^{(t)}$,不需要算二阶导,也不需要存整个得分矩阵:

拟牛顿(DFP/BFGS)更新思想
$$B^{(t+1)}=B^{(t)}+\text{rank-2 修正},\qquad \theta^{(t+1)}=\theta^{(t)}-B^{(t)}g^{(t)}$$

BFGS 是 DFP 的改进,是 scipy.optimizemethod='BFGS'L-BFGS-B 背后的算法,也是现代结构估计最常用的默认优化器。L-BFGS-B 进一步用"有限内存"近似 $B$,适合参数维度很高的模型。

实践建议

日常用 L-BFGS-B(支持参数上下界、内存友好)。要对照标准误时,再用解析/数值 Hessian 重算一次。优化收敛判据同时看:$\|\Delta\theta\|$、$\|\nabla\ell\|$、$\Delta\ell$ 三者都很小。

07 三种标准误:Hessian / OPG / Sandwich

MLE 的渐近方差估计有三个"等价"的来源(正确设定下渐近相等),但小样本与模型误设时差别很大:

标准误估计量何时可信
Hessian$[-n^{-1}\nabla^2\ell(\hat\theta)]^{-1}$模型正确设定;需二阶导
OPG(外积)$[n^{-1}\sum_i s_i(\hat\theta)s_i(\hat\theta)']^{-1}$模型正确设定;只需一阶导
Sandwich(robust)$\hat V=A^{-1}BA^{-1}$模型误设时仍一致;现代惯例

Sandwich 估计量的"面包"$A$ 是负 Hessian,"菜心"$B$ 是得分外积:

三明治稳健标准误
$$\hat V_{sandwich}=\underbrace{\Big(-\frac{1}{n}\nabla^2\ell(\hat\theta)\Big)^{-1}}_{A^{-1}}\;\underbrace{\Big(\frac{1}{n}\sum_i s_i s_i'\Big)}_{B}\;\underbrace{\Big(-\frac{1}{n}\nabla^2\ell(\hat\theta)\Big)^{-1}}_{A^{-1}}$$

若模型正确设定,由信息矩阵恒等式 $A=B$,三明治就退化成 $A^{-1}$,即 Hessian 标准误。但模型一旦误设,只有三明治仍然一致。面板/聚类数据还要把 $B$ 换成 cluster 级别的得分外积之和(cluster-robust sandwich)。

08 假设检验:Wald / LR / LM

MLE 框架下有三大渐近等价的检验方法,分别对应"用不用无约束估计量"和"用不用得分"两个维度。设原假设为 $H_0:h(\theta)=0$($q$ 个约束)。

8.1 Wald 检验

只用无约束 MLE $\hat\theta_U$,衡量"约束条件被违反了多少":

Wald 统计量
$$W=n\,h(\hat\theta_U)'\Big[\nabla h(\hat\theta_U)\hat V\nabla h(\hat\theta_U)'\Big]^{-1}h(\hat\theta_U)\;\xrightarrow{d}\;\chi^2(q)$$

适用:只跑了无约束模型,想事后检验几个系数是否为零。优点是只估一次模型;缺点是对参数化不不变(同样的原假设,换个等价写法可能给出不同 W)。

8.2 似然比检验 LR

同时估计无约束模型与受约束模型,比较两个对数似然的差距:

LR 统计量
$$LR=2\big[\ell(\hat\theta_U)-\ell(\hat\theta_R)\big]\;\xrightarrow{d}\;\chi^2(q)$$

适用:嵌套模型比较(如 Probit 加一组变量前后)。$LR$ 的直觉是"加上这组约束后,似然下降得多不多"。它对参数化不变,是三大检验里最对称的。

8.3 拉格朗日乘子检验 LM(得分检验)

只估计受约束模型 $\hat\theta_R$,看在受约束估计处得分是否仍显著非零:

LM 统计量
$$LM=n\,\bar s(\hat\theta_R)'\hat V_R^{-1}\bar s(\hat\theta_R)\;\xrightarrow{d}\;\chi^2(q)$$

适用:受约束模型便宜、无约束模型贵(如想检验 Probit 是否该加一个交互项,但加完要重跑优化)。LM 只跑受约束模型就能检验"是否需要更多参数"。

检验需要估计的模型信息来源典型用途
Wald无约束$\hat\theta_U$ 的方差系数显著性、线性约束
LR无约束 + 受约束两个对数似然之差嵌套模型比较、变量联合显著性
LM仅受约束受约束处的得分增加变量/函数形式诊断

三者在 $n\to\infty$ 时渐近等价,小样本下 LR 通常最可靠。

09 识别条件与数据要求

9.1 识别条件

"识别"回答的是:原则上能不能从无限大数据里唯一反推出 $\theta_0$?MLE 可识别要求:

  • 全局可识别:若 $\theta_1\neq\theta_2$,则 $f(\cdot\mid X,\theta_1)$ 与 $f(\cdot\mid X,\theta_2)$ 不能几乎处处相等——否则两组参数生成完全相同的数据分布,统计上无法区分。
  • 信息矩阵正定:$I(\theta_0)$ 必须满秩。线性回归里这对应 $X'X$ 可逆($X$ 列满秩,不存在完全多重共线性);Probit 里还要求协变量有足够变异,且 $y=0$ 和 $y=1$ 两类都有足够观测。
  • 正则条件:参数空间紧、密度对 $\theta$ 三阶可微、支撑集与 $\theta$ 无关。
Probit 的"完全分离"问题

若某个协变量可以完美区分 $y=0$ 与 $y=1$(例如 $X_i=1$ 时所有 $y_i=1$),则该变量的系数估计会趋向 $\pm\infty$,似然没有有限最大值。这是数据问题,不是算法问题。解决办法:剔除该变量、合并类别,或报告分离诊断。

9.2 数据要求

  • 横截面/面板:观测独立(或个体内聚类独立)。
  • 协变量变异:$X_i$ 不能在某些维度上几乎不变,否则对应系数无法识别。
  • 样本量:MLE 的性质是渐近的。线性模型 $n$ 几十就够;Probit 建议 $n\ge 500$,且每类结果至少有 100 个观测;结构模型常需 $n\ge 2000$ 才能让渐近近似可靠。
  • 分布设定与数据特征匹配:被解释变量有大量零值时不宜用正态线性模型(改用 Tobit/Poisson);尾部很重时正态 MLE 会被极端值绑架。

10 代码:线性模型与 Probit MLE

下面用 numpy + scipy.optimize 完整实现两个 MLE。第一段:正态误差线性模型的 MLE(结果应与 OLS 一致);第二段:Probit MLE,并比较三种标准误。

10.1 线性回归的 MLE(应回到 OLS)

python
import numpy as np
from scipy.optimize import minimize

# ---------- 1. 造模拟数据(已知真值,用于验证) ----------
np.random.seed(2026)
n, k = 500, 3
beta_true = np.array([1.0, 2.0, -0.5])   # 真实系数
sigma_true = 1.5                          # 真实扰动标准差

X = np.random.randn(n, k)                 # 设计矩阵
X[:, 0] = 1.0                             # 第 0 列设为 1 -> 截距
u = sigma_true * np.random.randn(n)       # 正态误差
y = X @ beta_true + u

# ---------- 2. 构造对数似然(正态线性模型) ----------
# 待估参数 theta = [beta_0,...,beta_{k-1}, log_sigma]
def neg_loglike(theta, X, y):
    b = theta[:-1]
    log_s = theta[-1]
    resid = y - X @ b
    n_obs = len(y)
    # 单观测对数密度:-log(s) - 0.5 log(2pi) - resid^2/(2 s^2)
    ll = -0.5 * n_obs * np.log(2*np.pi) - n_obs * log_s \
         - np.sum(resid**2) / (2 * np.exp(2*log_s))
    return -ll        # minimize 负对数似然 = 最大化对数似然

# ---------- 3. 数值优化 ----------
theta0 = np.zeros(k + 1)      # 初始值
res = minimize(neg_loglike, theta0, args=(X, y),
               method='L-BFGS-B',
               options={'disp': True, 'maxiter': 200})

b_hat = res.x[:-1]
sigma_hat = np.exp(res.x[-1])

# 对照 OLS
b_ols = np.linalg.lstsq(X, y, rcond=None)[0]

print("MLE beta :", np.round(b_hat, 4))
print("OLS  beta:", np.round(b_ols, 4))
print("MLE sigma:", round(sigma_hat, 4), "| 真值:", sigma_true)

输出应显示 MLE betaOLS beta 几乎完全一致——这验证了"正态误差线性模型的 MLE 等于 OLS"这一经典结论。

10.2 Probit MLE(含三种标准误)

python
import numpy as np
from scipy.optimize import minimize
from scipy.stats import norm, chi2

# ---------- 造模拟数据:潜变量 y* = Xb + u, u~N(0,1),观测 y=1{y*>0} ----------
np.random.seed(7)
n, k = 1000, 3
beta_true = np.array([0.0, 0.8, -0.6])   # 截距=0, 真实斜率
X = np.column_stack([np.ones(n), np.random.randn(n, k-1)])
y_star = X @ beta_true + np.random.randn(n)
y = (y_star > 0).astype(float)

# ---------- Probit 对数似然 ----------
def neg_ll_probit(beta, X, y):
    xb = X @ beta
    Phi = norm.cdf(xb)
    # 用 np.clip 防止 log(0)
    ll = y * np.log(np.clip(Phi, 1e-12, 1.0)) \
       + (1-y) * np.log(np.clip(1-Phi, 1e-12, 1.0))
    return -ll.sum()

# ---------- 数值优化 ----------
res = minimize(neg_ll_probit, np.zeros(k), args=(X, y),
               method='L-BFGS-B', options={'disp': True})
b_hat = res.x
print("Probit beta_hat:", np.round(b_hat, 4))
print("Probit beta_true:", beta_true)

# ---------- 单个观测得分 s_i = X_i' * [ (y-Phi)/(Phi(1-Phi)) * phi ] ----------
xb = X @ b_hat
phi = norm.pdf(xb)
Phi = np.clip(norm.cdf(xb), 1e-12, 1-1e-12)
w = (y - Phi) / (Phi * (1 - Phi)) * phi
S = X * w[:, None]                       # n x k 得分矩阵

# ---------- (1) OPG 标准误:(Σ s_i s_i')^-1 / n ----------
B = S.T @ S / n
vcov_opg = np.linalg.inv(B) / n
se_opg = np.sqrt(np.diag(vcov_opg))

# ---------- (2) 数值 Hessian(中心差分) ----------
def neg_ll(b):
    return neg_ll_probit(b, X, y)

def numerical_hessian(f, x, h=1e-5):
    K = len(x); H = np.zeros((K, K))
    for i in range(K):
        for j in range(i, K):
            xpp = x.copy(); xpp[i]+=h; xpp[j]+=h
            xpm = x.copy(); xpm[i]+=h; xpm[j]-=h
            xmp = x.copy(); xmp[i]-=h; xmp[j]+=h
            xmm = x.copy(); xmm[i]-=h; xmm[j]-=h
            H[i,j] = (f(xpp)-f(xpm)-f(xmp)+f(xmm))/(4*h*h)
            H[j,i] = H[i,j]
    return H

Hess = numerical_hessian(neg_ll, b_hat)   # -loglik 的 Hessian
vcov_h = np.linalg.inv(-Hess) / n         # 信息矩阵逆
se_h = np.sqrt(np.diag(vcov_h))

# ---------- (3) Sandwich = A^-1 B A^-1 ----------
A = -Hess / n
Ainv = np.linalg.inv(A)
Bmat = S.T @ S / n
vcov_sw = Ainv @ Bmat @ Ainv
se_sw = np.sqrt(np.diag(vcov_sw))

print("\n参数      OPG se     Hessian se   Sandwich se")
for i in range(k):
    print(f"b{i:<3d}   {se_opg[i]:.4f}     {se_h[i]:.4f}      {se_sw[i]:.4f}")

# ---------- 伪 R^2(McFadden):1 - ll(model)/ll(null) ----------
ll_full = -neg_ll(b_hat)
b_null = np.array([np.log(y.mean()/(1-y.mean())), 0, 0])  # 仅截距 Probit
ll_null = -neg_ll_probit(b_null, X, y)
pseudo_r2 = 1 - ll_full / ll_null
print(f"\nMcFadden pseudo R^2 = {pseudo_r2:.4f}")
怎么读这三种标准误

若模型正确,三者应当很接近;若 Sandwich 明显大于前两者,说明存在异方差或分布误设,应相信 Sandwich 报告。生产代码建议用 statsmodelsProbit(它自动给 MLE 与 robust 标准误),上面手写版用于理解原理。

11 应用解读:如何报告 MLE 结果

估计出 $\hat\theta$ 只是开始,论文里 MLE 结果的报告有一套行业惯例。

11.1 系数与边际效应

线性回归的系数直接就是偏效应。但 Probit/Logit 的系数不能直接读——系数 $\beta_k$ 只决定潜变量尺度,对 $P(y=1)$ 的影响是非线性的:

Probit 平均边际效应(AME)
$$\frac{\partial P(y=1\mid x)}{\partial x_k}=\phi(x'\beta)\,\beta_k,\qquad \text{AME}=\frac{1}{n}\sum_i \phi(x_i'\hat\beta)\hat\beta_k$$

论文应报告 AME(在样本均值处或平均),而不是原始系数;系数与 AME 的关系类似"潜变量尺度"与"概率尺度"。

11.2 标准误与显著性

现代顶刊惯例报告 cluster-robust sandwich 标准误,而不是 Hessian/OPG。括号里写标准误,星号标显著性(* p<0.1, ** p<0.05, *** p<0.01)。

11.3 模型整体拟合

  • 对数似然值 $\ell(\hat\theta)$:用于嵌套模型的 LR 检验;绝对值大小本身没意义(依赖 $n$)。
  • McFadden 伪 $R^2$:$1-\ell_{full}/\ell_{null}$,0.2–0.4 对应"不错的拟合"。
  • AIC / BIC:$AIC=-2\ell+2K$,$BIC=-2\ell+K\log n$,用于非嵌套模型比较。
  • LR 检验:加一组变量后,$2(\ell_{full}-\ell_{restricted})\sim\chi^2(q)$,报 p 值。

11.4 报告模板

一张标准 MLE 结果表至少包含:系数(括号 robust se)、显著性星号、观测数 $n$、对数似然、伪 $R^2$ 或 $R^2$、LR/Wald 联合检验统计量。

12 论文案例

英文 · 理论奠基
Conditional Logit Analysis of Qualitative Choice Behavior
D. McFadden, in Zarembka (ed.), Frontiers in Econometrics, 1974.
Probit/Logit MLE 的奠基性推导,展示如何从潜变量正态设定出发写出选择密度,再用 MLE 估计,后获 2000 年诺贝尔经济学奖。
英文 · 教材
Econometric Analysis of Cross Section and Panel Data (2nd ed.)
J. M. Wooldridge, MIT Press, 2010. — Ch.13–14 是 MLE 的标准参考。
系统给出 MLE 一致性、渐近正态、有效性的假设链,以及 MLE 标准误的三种形式与 robust 化,写法严谨、可读性高。
中文 · 结构估计应用
中国工业企业全要素生产率估计:1999—2007
鲁晓东、连玉君,《经济学(季刊)》,2012,11(2): 541–558.
以生产函数估计为核心,比较 OLS、固定效应、OP、LP 等(半)结构估计方法。其 OLS/FE 估计量本质上是高斯误差下的 MLE/组内 MLE,是理解 MLE 设定敏感性的好案例。
中文 · 结构估计应用
中国制造业企业全要素生产率研究
杨汝岱,《经济研究》,2015,50(2): 61–74.
用 OP/LP/ACF 等结构估计方法估计生产函数与 TFP,讨论了估计中同时性偏误、选择偏误的 MLE 修正思路,是中文顶刊里 MLE 思想的典型应用。

13 常见错误

错误 1:对数似然溢出 / underflow

直接算 $\prod f$ 会瞬间变成 0;概率取对数前又对 0 取 log 会 NaN。务必先取对数再连加,概率处用 np.clip(p, 1e-12, 1)

错误 2:只报 Hessian 标准误

当模型可能误设(几乎总是),Hessian 标准误会低估真实方差。顶刊惯例是 cluster-robust sandwich;把 Hessian 当作"诊断"而非"报告"。

错误 3:没收敛就报结果

优化器返回 success=False、或梯度范数仍很大,说明 $\hat\theta$ 不是真正的 MLE。务必检查 res.success、最终梯度、多次随机初始值是否收敛到同一点。

错误 4:把"似然最大"当成"模型最好"

加参数总会提高似然。模型比较要靠 BIC/AIC、out-of-sample fit 或嵌套模型的似然比检验,而不是比较 $\ell$ 的绝对值。

错误 5:Probit 系数当偏效应读

Probit/Logit 的 $\hat\beta_k$ 是潜变量尺度上的斜率,不是 $P(y=1)$ 的变化。必须算 $\partial P/\partial x_k=\phi(x'\beta)\beta_k$(或 AME)再解释。

错误 6:忽略完全分离/准完全分离

二值结果被某个协变量完美预测时,Probit 系数发散、似然无最大值。若优化结果有异常大的系数或标准误,先检查是否存在完全分离。

错误 7:小样本下直接信渐近正态

MLE 的 $t$ 统计量在小样本下偏离 $t$ 分布,Probit 尤其敏感。样本量小时应报告 bootstrap 标准误或置信区间,而不是仅靠正态近似。

14 进阶资料

  • Cameron & Trivedi, Microeconometrics Using Stata / Methods and Applications —— MLE 实操与诊断。
  • Newey & McFadden (1994), Large Sample Estimation and Hypothesis Testing, Handbook of Econometrics Vol.4 —— 渐近理论的权威综述。
  • Gourieroux & Monfort, Statistics and Econometric Models —— 得分、信息矩阵、准 MLE(QMLE)。
  • 软件:Python statsmodels(Probit/Logit/GLM 自带 MLE 与 robust 标准误);Julia Optim.jl + ForwardDiff.jl(自动求导)。