离散选择模型:从 RUM 到 Nested Logit
随机效用模型(random utility model)框架、Logit 的 IIA 性质、Probit 与 Multinomial Logit、放松 IIA 的 Nested Logit(inclusive value),以及 MLE 估计、边际效应计算与完整代码。
logit、asclogit)或 Python(statsmodels.discrete)。01 随机效用模型 RUM 框架
离散选择模型研究的是:个体 $i$ 从 $J$ 个互斥选项 $j=1,\dots,J$ 中选一个。McFadden 的随机效用模型(random utility model, RUM)假设每个选项给个体带来一个效用,个体选效用最大的那个:
其中 $V_{ij}=X_{ij}'\beta$ 是研究者可观测的"代表性效用"(systematic utility),$X_{ij}$ 是选项 $j$ 对个体 $i$ 的属性(如价格、时间、品牌);$\varepsilon_{ij}$ 是研究者观测不到的偏好扰动。个体选 $j$ 当且仅当 $U_{ij}\ge U_{ik}\;\forall k$。
研究者看不到 $\varepsilon$,只能预测"个体 $i$ 选 $j$ 的概率":
这是一个积分:只要对 $\varepsilon=(\varepsilon_{i1},\dots,\varepsilon_{iJ})$ 的联合分布做假设,就能"算出" $P_{ij}$。不同的分布假设 → 不同的模型:$\varepsilon_{ij}$ i.i.d. 极值型(Gumbel)→ Logit;$\varepsilon_{ij}$ 多元正态 → Probit;同类选项误差相关 → Nested Logit。
02 Logit 推导与 IIA 性质
假设每个 $\varepsilon_{ij}$ 独立同分布服从标准 Gumbel(极值 I 型)分布,累积分布 $F(\varepsilon)=e^{-e^{-\varepsilon}}$。McFadden 证明:在这个假设下,最大效用差的积分可以解析地算出来,得到 Logit 选择概率:
推导关键一步:Gumbel 分布的"可加性"——若 $\varepsilon_{ij}$ i.i.d. Gumbel,则 $\max_k(V_{ik}+\varepsilon_{ik})$ 减去 $\varepsilon_{ij}$ 的累积分布恰好是标准 Logistic。这把本来高维的积分化简为指数比。
2.1 Logit 选择概率的逐步推导(不跳步)
设定:$J$ 个选项,$\varepsilon_{ij}\overset{iid}{\sim}\text{Gumbel}(0,1)$,CDF 与密度分别为 $F_\varepsilon(\varepsilon)=e^{-e^{-\varepsilon}}$、$f_\varepsilon(\varepsilon)=e^{-\varepsilon}e^{-e^{-\varepsilon}}$。代表性效用 $V_{ij}=X_{ij}'\beta$。
第 1 步(写出选 $j$ 的事件):$i$ 选 $j$ 当且仅当 $U_{ij}\ge U_{ik}\;\forall k\ne j$,即 $\varepsilon_{ij}\ge (V_{ik}-V_{ij})+\varepsilon_{ik}$ 对所有 $k\ne j$。
第 2 步(对 $\varepsilon_{ij}$ 积分):把 $P_{ij}$ 写成对 $\varepsilon_{ij}$ 取值 $e$ 的积分,条件化后其余 $\varepsilon_{ik}$ 须落在 $(-\infty,\,e+V_{ij}-V_{ik}]$:
变量定义:$f_\varepsilon(\cdot)$ 为 Gumbel 密度;$F_\varepsilon(\cdot)$ 为 Gumbel CDF。这一步把高维联合积分"降维"为对单个 $\varepsilon_{ij}$ 的一维积分——条件化后各 $\varepsilon_{ik}$ 相互独立,故乘积可拆。
第 3 步(代入 Gumbel CDF):令 $y=e^{-(e+V_{ij})}$,则 $e=-V_{ij}-\ln y$,$de=-dy/y$。代入 $F_\varepsilon(e+V_{ij}-V_{ik})=\exp[-e^{-(e+V_{ij}-V_{ik})}]=\exp[-e^{V_{ik}-V_{ij}}\,y]$,连乘得 $\prod_{k\ne j}e^{-e^{V_{ik}-V_{ij}}y}=\exp\!\big[-y\sum_{k\ne j}e^{V_{ik}-V_{ij}}\big]$。
第 4 步(补入 $k=j$ 项):注意 $e^{V_{j}-V_{j}}=1$,故 $\sum_{k\ne j}e^{V_{ik}-V_{ij}}+1=\sum_{k=1}^{J}e^{V_{ik}-V_{ij}}$。积分化为标准 Gamma 积分:
用到 $\int_0^\infty e^{-ay}dy=1/a$($a>0$)。分子分母同乘 $e^{V_{ij}}$ 即得 Logit 比。经济直觉:Gumbel 的"独立最大值仍为 Gumbel"性质使高维积分可解析,这是 Logit 可估计的数学根源。
IIA 性质(Independence of Irrelevant Alternatives)
把任意两个选项 $j$ 和 $l$ 的概率比取出来:
比值只依赖 $j$ 和 $l$ 的代表性效用,跟第三个选项 $k$ 是否存在、属性如何都无关。这就是 IIA(无关选项独立性)。它是 Logit 最有用、也最常被诟病的性质。
经典反例:人在"开车"和"坐红巴士"之间各 50% 概率。IIA 说加入一个"蓝巴士"(与红巴士几乎完全替代)后,开车:红巴士:蓝巴士应保持 1:1 的相对比例——变成 1/3, 1/3, 1/3。但常识是:蓝巴士只是分走红巴士的份额,开车概率应仍为 50%。IIA 在"近似替代品"之间失效,这正是 Nested Logit 要修复的。
03 Probit 与 Multinomial Logit
二元 Probit
把 $\varepsilon_{ij}$ 改成标准正态,潜变量设定为 $y_i^*=X_i'\beta+u_i,\;u_i\sim N(0,1)$,观测 $y_i=1\{y_i^*>0\}$,则:
Probit 没有封闭形式的"Logit 式"闭式解,但可以数值积分/用 $\Phi(\cdot)$ 直接算,是 01-mle 页的标准应用。
Multinomial Logit(MNL)
当选项之间的属性因人而异、随选项变(alternative-specific),就用上面的 conditional/multinomial logit:$P_{ij}=e^{X_{ij}'\beta}/\sum_k e^{X_{ik}'\beta}$。若协变量只随人变(不随选项变),则需引入 alternative-specific 常数 $\alpha_j$:
注意 $\beta_j$ 现在随选项变,这正是 MNL 与 conditional logit 的区别:人层变量对"选哪一个"的影响可以不同。
04 Nested Logit:放松 IIA
Nested Logit 把选项按"相似性"分成若干巢(nest)$B_m$,让同一巢内选项的误差相关、跨巢误差仍独立。它通过一个"巢内相关参数" $\lambda_m\in(0,1]$ 放松 IIA。
代表性效用仍写为 $V_{ij}=X_{ij}'\beta$。对巢 $B_m$,定义包含值(inclusive value,又叫 log-sum):
选择概率分解为"选巢 $m$ 的概率"乘以"巢 $m$ 内选 $j$ 的条件概率":
当所有 $\lambda_m=1$,Nested Logit 退化成普通 MNL(IIA 恢复);$\lambda_m<1$ 表示巢内选项误差正相关("红巴士/蓝巴士"被放进同一巢,IIA 在巢内被放松)。
$I_{im}$ 可理解为"巢 $m$ 整体的'吸引力'对数总和"——巢里选项越多、效用越高,$I_{im}$ 越大,选这个巢的概率就越大。估计出 $\hat\lambda_m$ 后,若它显著小于 1,说明"巢内误差相关"被数据支持,MNL 是错的。
05 MLE 估计与边际效应
离散选择模型的核心估计量就是极大似然。不熟悉似然构造、得分函数、三种标准误与边际效应?先学 基础知识库·MLE →
给定选择数据 $\{i,j_i^*\}$($j_i^*$ 为个体 $i$ 实际选的选项),似然就是每个观测概率的乘积:
对 MNL,得分函数可由对数似然逐一对 $\beta$ 求导写出。定义指示变量 $d_{ij}=\mathbf{1}\{i\text{ 实际选 }j\}$($\sum_j d_{ij}=1$),则对数似然 $\ell(\beta)=\sum_i\sum_j d_{ij}\log P_{ij}$。
变量定义:$d_{ij}$ 为选择指示;$P_{ij}$ 为模型预测概率;$X_{ij}$ 为选项属性矩阵。一阶条件 $s(\hat\beta)=0$ 是 $J$ 个一阶条件。设定理由:MLE 的渐近性质由得分决定,$E[s(\beta_0)]=0$ 是正交性条件。
BHHH 近似用外积得分 $I=\sum_i s_i s_i'$ 替代 Hessian(信息矩阵等式 $-E[H]=E[ss']$),数值更稳。渐近分布:$\sqrt{n}(\hat\beta-\beta_0)\xrightarrow{d}N(0,I(\beta_0)^{-1})$,标准误由 $[-H(\hat\beta)]^{-1}$ 对角元平方根给出。
优化用 Newton/BHHH/L-BFGS 即可,海森负定(对数似然全局凹)保证唯一极大。
边际效应(marginal effect)
系数 $\beta$ 不是"概率的变化",要转换成边际效应。对连续变量 $x_{ij}^{(r)}$:
实务中通常报告在样本平均(或代表性个体)处的边际效应,而非 $\beta$ 本身,因为 $\beta$ 的符号虽直观,量级却难解释。
06 代码:MNL / Nested Logit 完整实现
下面用模拟数据演示交通方式选择:个体在"汽车 / 巴士 / 轻轨"三种方式中选一种。属性含"成本"与"时间",二者系数相同(alternative-invariant),故用 conditional logit;再演示如何估计 $\lambda$。
import numpy as np
from scipy.optimize import minimize
from scipy.stats import norm
# ---------- 1. 造模拟数据:n=1000 个出行者, J=3 种交通方式 ----------
np.random.seed(42)
n, J = 1000, 3
beta_true = np.array([-0.05, -0.10]) # [成本系数, 时间系数](应为负)
# X[i, j, 0]=成本, X[i, j, 1]=时间
cost = np.random.uniform(5, 30, size=(n, J))
time = np.random.uniform(10, 60, size=(n, J))
X = np.stack([cost, time], axis=2) # shape (n, J, 2)
# 真实代表性效用 V[i,j] = X[i,j] @ beta + Gumbel 扰动
V = X @ beta_true
eps = np.random.gumbel(size=(n, J)) # i.i.d. Gumbel -> MNL
U = V + eps
choice = U.argmax(axis=1) # 实际选择
# ---------- 2. MNL 对数似然 ----------
def mnl_probs(beta, X):
V = X @ beta # (n, J)
V = V - V.max(axis=1, keepdims=True) # 数值稳定
ev = np.exp(V)
return ev / ev.sum(axis=1, keepdims=True)
def neg_ll_mnl(beta, X, choice):
P = mnl_probs(beta, X)
p_choice = P[np.arange(len(choice)), choice]
return -np.sum(np.log(np.clip(p_choice, 1e-12, 1.0)))
# ---------- 3. MLE 估计 ----------
res = minimize(neg_ll_mnl, np.zeros(2), args=(X, choice),
method='BFGS', options={'disp': True})
beta_hat = res.x
print("MNL beta_hat :", np.round(beta_hat, 4))
print("MNL beta_true:", beta_true)
# ---------- 4. 边际效应(样本平均处) ----------
P = mnl_probs(beta_hat, X)
# dP_j/dx_r = P_j(1-P_j) beta_r (对 alternative-specific x)
me_cost = (P * (1 - P) * beta_hat[0]).mean(axis=0)
me_time = (P * (1 - P) * beta_hat[1]).mean(axis=0)
print("平均边际效应(成本,三种方式):", np.round(me_cost, 5))
print("平均边际效应(时间,三种方式):", np.round(me_time, 5))
# ---------- 5. Nested Logit 估计(演示:巴士+轻轨同巢,汽车独立巢) ----------
# 巢结构:{巴士=1, 轻轨=2} 在同一巢; {汽车=0} 独立巢
nest_of = {0: 0, 1: 1, 2: 1} # 选项 -> 巢编号
# 待估参数:beta(2) + lambda_1(1), lambda_0 固定=1
def neg_ll_nested(theta, X, choice):
b = theta[:2]
lam1 = np.clip(theta[2], 1e-3, 1.0)
lam = {0: 1.0, 1: lam1}
V = X @ b # (n, J)
# 巢内条件概率
P_in = np.zeros((n, J))
I = {m: np.zeros(n) for m in [0, 1]}
for m in [0, 1]:
members = [j for j in range(J) if nest_of[j] == m]
Vm = V[:, members] / lam[m]
Vm = Vm - Vm.max(axis=1, keepdims=True)
evm = np.exp(Vm)
P_in[:, members] = evm / evm.sum(axis=1, keepdims=True)
I[m] = lam[m] * np.log(evm.sum(axis=1))
# 选巢概率
Iarr = np.column_stack([I[0], I[1]])
Iarr = Iarr - Iarr.max(axis=1, keepdims=True)
P_nest = np.exp(Iarr) / np.exp(Iarr).sum(axis=1, keepdims=True)
# 边缘概率 P_ij = P_nest(i,m)*P_in(i,j)
P = np.zeros((n, J))
for m in [0, 1]:
members = [j for j in range(J) if nest_of[j] == m]
P[:, members] = P_in[:, members] * P_nest[:, m:m+1]
p_choice = P[np.arange(n), choice]
return -np.sum(np.log(np.clip(p_choice, 1e-12, 1.0)))
resN = minimize(neg_ll_nested, np.append(beta_hat, 0.7), args=(X, choice),
method='BFGS', options={'disp': True})
print("Nested beta:", np.round(resN.x[:2], 4),
" lambda_hat =", round(resN.x[2], 3))
MNL beta_hat 应接近 $[-0.05,-0.10]$,成本/时间系数显著为负。Nested Logit 的 $\hat\lambda_1$ 接近 1(因为数据是用 MNL 生成的),说明没有强证据拒绝 IIA;若用真实数据 $\hat\lambda$ 显著小于 1,则 Nested Logit 优于 MNL。
06+ 数据来源对照表(离散选择常用数据集)
离散选择模型需要"个体 i 在备选 j 之间做选择"的数据——要么是个体级 micro 数据(每人一行,记录选了哪个),要么是市场级 aggregate 份额(每市场×产品一行,记录份额)。下表把英文经典与中国常用数据集对照列出,写作时直接取用:
| 数据集 | 国家/地区 | 典型因变量(选择) | 典型自变量 | 获取 |
|---|---|---|---|---|
| NLS / NLSY | 美国 | 工会参与、职业、教育、就业 | 工资、年龄、教育、经验 | NLSY79 公网免费下载 |
| PSID | 美国 | 劳动参与、迁移、婚姻 | 家庭收入、健康、孩子数 | PSID 官网注册免费 |
| CPS | 美国 | 行业/职业选择、就业状态 | 工资、教育、人口统计 | FRED/IPUMS CPS 免费 |
| SCF | 美国 | 风险资产持有、信用卡选择 | 财富、收入、风险态度 | 美联储 SCF 免费 |
| CHIP | 中国 | 就业选择、行业进入 | 工资、教育、地区、户口 | 中国家庭收入调查(北大方毅夫团队) |
| CHFS | 中国 | 股市参与、风险资产选择 | 家庭财富、收入、金融素养 | 中国家庭金融调查(西南财大) |
| CFPS | 中国 | 教育、职业、养老选择 | 家庭背景、收入、健康 | 中国家庭追踪调查(北大数据中心) |
| CHARLS | 中国 | 退休、健康险选择 | 年龄、财富、健康、养老金 | 中国健康与养老追踪调查(北大) |
做"二值选择"用 NLS/PSID/CHFS;做"多项选择"(职业、交通方式、品牌)用 NLSY/CFPS;做"有序选择"(教育档次、健康自评)用 CHARLS/CFPS。美国数据用 NLSY/CPS 起步最容易复现;中国选题用 CFPS/CHFS 最对口。
07 论文案例
08 常见错误与进阶资料
加入/移除选项时 MNL 会按 IIA 重新分配份额,常给出荒谬的替代矩阵。做政策预测前必须做 IIA 检验(如 Small-Hsman 检验),必要时换 Nested/Mixed Logit。
MNL 的 $\beta$ 是"代表性效用"的系数,不是概率变化。报告样本平均边际效应 $\partial P_j/\partial x$,或在代表性个体处计算。
Nested Logit 的 $\lambda_m$ 必须在 $(0,1]$ 内才有意义;若估计出 $\hat\lambda>1$,说明巢结构设定错了,重新分组或换 Mixed Logit。
当 $J$ 很大(如选学校、选医院),MNL 的 IIA 几乎必然被违反。用 Mixed Logit(随机参数 logit)或 Nested Logit,并在估计中加入面板固定效应。
进阶资料
- McFadden & Train (2000), "Mixed MNL Models for Discrete Response", JBES —— Mixed Logit 把 IIA 完全放松,是现代 IO/营销的主力模型。
- Ben-Akiva & Lerman, Discrete Choice Analysis, 1985 —— Nested Logit 与包容值的经典教材。
- Berry, Levinsohn & Pakes (1995), "Automobile Prices in Market Equilibrium", Econometrica —— 把离散选择推广到产品市场数据,是下一页 BLP 的内容。
- 软件:Python
logit/xlogit;Rmlogit;Stataclogit/nlogit。
方程总清单 / Equation Summary
本页全部方程按出现顺序汇总如下,共 14 个。每个方程均可在正文中找到对应的变量定义、设定理由与经济直觉。
| 编号 | 方程名称 | 核心公式 | 所在节 |
|---|---|---|---|
| Eq.03-01 | 随机效用设定 | $U_{ij}=X_{ij}'\beta+\varepsilon_{ij}$ | 01 |
| Eq.03-02 | 选择概率(一般积分) | $P_{ij}=\int \prod_{k\ne j}F_{\varepsilon_k}(\cdot)f_\varepsilon(\varepsilon)d\varepsilon$ | 01 |
| Eq.03-03 | Logit 选择概率 | $P_{ij}=e^{V_{ij}}/\sum_k e^{V_{ik}}$ | 02 |
| Eq.03-04 | IIA 相对概率 | $P_{ij}/P_{il}=e^{V_{ij}}/e^{V_{il}}$ | 02 |
| Eq.03-05 | 选 $j$ 概率(条件积分) | $P_{ij}=\int f_\varepsilon(e)\prod_{k\ne j}F_\varepsilon(e+V_{ij}-V_{ik})de$ | 02.1(补全) |
| Eq.03-06 | Gamma 积分化简 | $P_{ij}=1/\sum_k e^{V_{ik}-V_{ij}}$ | 02.1(补全) |
| Eq.03-07 | 二元 Probit 概率 | $P(y_i=1\mid X_i)=\Phi(X_i'\beta)$ | 03 |
| Eq.03-08 | MNL(含 alternative 常数) | $P_{ij}=e^{\alpha_j+Z_i'\beta_j}/\sum_k e^{\alpha_k+Z_i'\beta_k}$ | 03 |
| Eq.03-09 | 包含值 inclusive value | $I_{im}=\lambda_m\ln\sum_{j\in B_m}e^{V_{ij}/\lambda_m}$ | 04 |
| Eq.03-10 | Nested Logit 选择概率 | $P_{ij}=P(\text{选巢 }m)\times P(\text{巢内选 }j)$ | 04 |
| Eq.03-11 | 对数似然 | $\ell(\beta)=\sum_i\log P_{i,j_i^*}(\beta)$ | 05 |
| Eq.03-12 | MNL 得分函数 | $s(\beta)=\sum_i(X_{i,j_i^*}-\sum_j P_{ij}X_{ij})$ | 05(补全) |
| Eq.03-13 | Hessian / BHHH 信息矩阵 | $H=-\sum_i\sum_j P_{ij}X_{ij}X_{ij}'+\cdots$ | 05(补全) |
| Eq.03-14 | MNL 边际效应 | $\partial P_{ij}/\partial x_{ij}^{(r)}=P_{ij}(1-P_{ij})\beta_r$ | 05 |