贝叶斯实证推断:先验、似然、后验与 MCMC
频率派把参数 $\theta$ 当作未知常数,把数据当作随机样本;贝叶斯派把参数本身也当作随机变量,用先验分布 $p(\theta)$ 表达你在看到数据之前的信念,用似然 $p(Y|\theta)$ 更新成后验 $p(\theta|Y)$。当样本小、模型复杂(DSGE、随机效应、高维)时,贝叶斯推断比频率派更自然;后验概率 $P(\theta>0|Y)$ 也比 p 值更贴近"政策讨论"的语言。本页讲清 Bayes 定理、共轭先验下的解析解、MCMC 三大算法(MH/Gibbs/NUTS)、收敛诊断(R-hat、trace plot),以及 Stata bayesmh 与 Python PyMC 的完整实现。
bayesmh、bayes);Python(pymc、arviz)。GPU 非必需。01 是什么:贝叶斯推断 vs 频率派
频率派的世界观:参数 $\theta$ 是固定未知常数;数据 $Y$ 是随机的;我们用 $\hat\theta$(MLE 或 OLS)估计它,用置信区间表达"重复抽样 100 次、有 95 次会覆盖真实 $\theta$"。贝叶斯派的世界观:参数 $\theta$ 也是随机变量;在看到数据之前,你对它有先验信念 $p(\theta)$;看到数据后,用 Bayes 定理把先验更新成后验 $p(\theta|Y)$。后验是一个完整分布,你可以读它的均值、中位数、95% 可信区间(credible interval)、以及"$\theta>0$ 的概率"。对政策讨论而言,"参数大于零的后验概率"比"p 值等于 0.03"更贴近决策者真正想问的问题。
在实证经济学里,贝叶斯推断最常见的三种用途:
- DSGE / 结构模型估计:样本短、参数多、似然面崎岖。先验把经济理论锚进来,后验用 MCMC 采样。本知识库 DSGE 贝叶斯估计页有完整讲解。
- 贝叶斯 VAR / BVAR:宏观变量维度高,VAR 容易过拟合;明尼苏达先验收缩系数,后验更稳。
- 小样本 / 随机效应 / 因果推断:Imbens & Rubin (2015) 把潜在结果框架贝叶斯化,对处理效应做后验推断。
贝叶斯 vs 频率派速查表
| 维度 | 频率派(MLE/OLS) | 贝叶斯 |
|---|---|---|
| 参数性质 | 未知常数 | 随机变量,有分布 |
| 不确定性来源 | 数据重复抽样 | 参数本身不确定 |
| 输出 | 点估计 + 置信区间 | 完整后验分布 |
| 小样本 | 依赖渐近近似 | 后验精确(有限样本) |
| 先验信息 | 不能正式纳入 | 先验分布显式表达 |
| 概率语言 | "95% 重复抽样覆盖" | "$\theta$ 有 95% 概率在区间内" |
| 大样本 | 无信息先验下两者趋同(Bernstein–von Mises 定理) | |
关键直觉:大样本下贝叶斯与频率派渐近等价(Bernstein–von Mises 定理);贝叶斯的真正优势在小样本、高维、结构模型——此时频率派的渐近近似本身就不可靠。
02 假设与原理:Bayes 定理与 MCMC
核心公式只有一行:
分子 = 似然 × 先验;分母 = 证据 marginal likelihood,归一化用。实务中我们只关心分子的形状(后验正比于似然×先验),因为归一化常数往往没有解析解。用文字复述:后验 ∝ 似然 × 先验——数据告诉你的似然形状,与你事前的信念先验,按精度加权融合成后验。
先验的选择
- 无信息先验(Jeffreys / flat prior):让数据自己说话,先验在参数空间上近似均匀。小样本下不稳定。
- 共轭先验(conjugate prior):先验与似然同分布族,后验有解析解。例如正态似然 + 正态先验 ⇒ 后验仍是正态。
- 层次先验(hierarchical prior):随机效应 $\alpha_i \sim N(\mu, \sigma_\alpha^2)$,$\mu,\sigma_\alpha$ 再有超先验。多层数据标配。
MCMC 三大算法
当后验没有解析解时,用 MCMC(Markov Chain Monte Carlo)从 $p(\theta|Y)$ 采样:
- Metropolis–Hastings (MH):提议 $\theta' \sim q(\theta'|\theta)$,按接受率 $\alpha = \min\big(1, \frac{p(\theta'|Y)q(\theta|\theta')}{p(\theta|Y)q(\theta'|\theta)}\big)$ 接受。最通用,但高维效率低。
- Gibbs 采样:每次只更新一个参数,条件后验 $p(\theta_j|\theta_{-j}, Y)$。当条件后验是共轭族时极快。
- NUTS (No-U-Turn Sampler):HMC 的自动版本,PyMC 与 Stan 默认。能自适应步长,高维收敛快。
实际选择:PyMC / Stan 默认 NUTS 即可,不要自己写 MH。Stata bayesmh 内部也是 MH/Gibbs 混合,但对用户屏蔽。判断采样质量的核心指标:
- R-hat(Gelman–Rubin 统计量):比较四条链的组间方差与组内方差。$R-hat < 1.01$ 才算收敛。
- Trace plot:四条链应混在一起、无明显趋势或周期性。
- Effective Sample Size (ESS):扣除自相关后的有效样本量。$ESS > 400$ 才能算后验均值的标准误。
- Monte Carlo standard error (MCSE):采样本身带来的误差,应远小于后验标准差。
03 完整推导:线性模型共轭先验与 Probit 数据增广
正态线性模型:共轭后验解析解
模型:$Y_i = x_i^\top\beta + \varepsilon_i$,$\varepsilon_i \sim N(0, \sigma^2)$。给定 $\sigma^2$,对 $\beta$ 取正态先验 $\beta \sim N(\beta_0, \Sigma_0)$,则后验:
注意 $m_n$ 是先验均值与 OLS 估计的精度加权平均。当先验方差 $\Sigma_0 \to \infty$(无信息),$m_n \to \hat\beta_{OLS}$,后验方差 $V_n \to \sigma^2(X^\top X)^{-1}$——贝叶斯退化为频率派。
Probit 模型:Albert–Chib (1993) 数据增广
Probit:$Y_i^* = x_i^\top\beta + \varepsilon_i$,$\varepsilon_i \sim N(0,1)$,观测到 $Y_i = 1(Y_i^*>0)$。Probit 的似然是 $\Phi(x_i^\top\beta)^{y_i}(1-\Phi(x_i^\top\beta))^{1-y_i}$,没有共轭先验。数据增广(data augmentation)技巧:把潜变量 $Y_i^*$ 也当作待估参数,Gibbs 交替采样:
把一个没有解析解的 Probit 估计,变成两步交替采样——每一步都是共轭/截断正态,极快。这是贝叶斯离散选择模型的基石。
层次模型(随机效应)
$y_{ij} = \alpha_j + x_{ij}^\top\beta + \varepsilon_{ij}$,$\alpha_j \sim N(\mu_\alpha, \sigma_\alpha^2)$。$\alpha_j$ 是"组级随机效应",$\mu_\alpha, \sigma_\alpha$ 是超参数。Gibbs 交替更新:$\alpha_j|\cdot$、$\beta|\cdot$、$\mu_\alpha|\cdot$、$\sigma_\alpha|\cdot$。比频率派 REML 更灵活,因为后验完整分布可用于预测。
04 逐步操作流程
后验预测检验(Posterior Predictive Check, PPC)
后验推断做完后,标准动作是后验预测检验:从 $p(\theta|Y)$ 抽 $\theta^{(s)}$,再从似然 $p(Y^{rep}|\theta^{(s)})$ 生成复制数据 $Y^{rep}$。把 $Y^{rep}$ 的分布与真实 $Y$ 画在一起——如果模型对,$Y^{rep}$ 应该能"覆盖" $Y$;如果模型系统性偏(例如尾部太轻),PPC 图一眼可见。这是贝叶斯模型诊断的核心工具,比频率派的残差分析更直接。
模型比较:DIC / WAIC / LOO
贝叶斯模型比较不靠 p 值,而靠信息准则:DIC(Deviance Information Criterion)、WAIC(Widely Applicable IC)、LOO(留一交叉验证)。数值越小模型越好。ArviZ 的 az.loo()、az.waic() 直接出结果。报告时与"只用先验"的空模型对比,看模型是否真的提供了增量信息。
05 完整代码(Stata + Python,含收敛诊断)
*==============================================================*
* 贝叶斯 OLS + 贝叶斯 Probit:bayesmh 完整流程 + 收敛诊断
*==============================================================*
clear all
set more off
set seed 20260911
* --- 1. 模拟数据:Y = 1 + 0.5*X + eps ---
set obs 500
gen X = rnormal()
gen eps = rnormal()
gen Y = 1 + 0.5*X + eps
gen D = (1 + 0.5*X + eps > 0) // Probit 的二值结果
* --- 2. 贝叶斯 OLS:bayesmh ---
* 语法:bayesmh 似然, likelihood(...) prior(...)
* 无信息正态先验 beta ~ N(0, 100);sigma ~ Half-Normal
bayesmh Y, likelihood(regress({y} {beta:X _cons}, var({var}))) ///
prior({beta:X _cons}:, flat) /// 无信息先验
prior({var}:, igamma(1e-3,1e-3)) /// 方差逆伽马
chains(4) /// 4 条链
montecarlo(saving("bayes_ols.ster", replace) seed(20260911)) ///
nchains(4) burnin(1000) mcmcsize(2000)
* 收敛诊断:bayesstats 内置
bayesstats summary {beta:X _cons}
bayesstats ic // DIC / WAIC 模型比较
* trace plot
bayesgraph diagnostics {beta:X}
* --- 3. 贝叶斯 Probit:Albert-Chib 数据增广 ---
* bayesmh 自动处理 probit 似然
bayesmh D, likelihood(probit({y} {b:X _cons})) ///
prior({b:X _cons}:, flat) ///
chains(4) burnin(1000) mcmcsize(2000)
bayesstats summary {b:X}
* 解释:后验 P(b_X > 0 | data) 直接可读,无需 p 值
* --- 4. 收敛诊断(必做) ---
* R-hat < 1.01;ESS > 400;trace plot 平稳
* bayesstats ess 输出 effective sample size
* bayesstats grubin Gelman-Rubin R-hat
bayesstats ess {beta:X _cons}
bayesstats grubin, estimates("bayes_ols.ster")
# ==============================================================
# 贝叶斯 Probit:PyMC + NUTS + ArviZ 收敛诊断
# ==============================================================
import numpy as np
import pymc as pm
import arviz as az
import matplotlib.pyplot as plt
rng = np.random.default_rng(20260911)
# --- 1. 模拟数据:与 Stata 一致 ---
n = 500
X = rng.normal(size=n)
eps = rng.normal(size=n)
Y_latent = 1 + 0.5*X + eps
D = (Y_latent > 0).astype(int)
# --- 2. 定义贝叶斯 Probit 模型 ---
with pm.Model() as probit_model:
# 先验:无信息正态
beta_0 = pm.Normal('beta_0', mu=0, sigma=10)
beta_X = pm.Normal('beta_X', mu=0, sigma=10)
# 潜变量与观测(PyMC 内置 Bernoulli + probit link)
p = pm.math.invprobit(beta_0 + beta_X*X)
Y_obs = pm.Bernoulli('Y_obs', p=p, observed=D)
# --- 3. NUTS 采样:4 链,2000 迭代,1000 warmup ---
with probit_model:
trace = pm.sample(draws=2000, tune=1000, chains=4,
random_seed=20260911, target_accept=0.9)
# --- 4. 收敛诊断 ---
print(az.summary(trace, var_names=['beta_0', 'beta_X']))
# 关键指标:
# r_hat < 1.01 ✓
# ess_bulk > 400 ✓
# ess_tail > 400 ✓
az.plot_trace(trace, var_names=['beta_0', 'beta_X']); plt.tight_layout()
az.plot_posterior(trace, var_names=['beta_X'], ref_val=0); plt.show()
# --- 5. 后验推断:P(beta_X > 0 | data) ---
post_beta_X = trace.posterior['beta_X'].values.flatten()
p_positive = (post_beta_X > 0).mean()
print(f"P(beta_X > 0 | data) = {p_positive:.3f} (true = 0.5)")
print(f"95% 可信区间: {np.percentile(post_beta_X, [2.5, 97.5])}")
# ==============================================================
# 贝叶斯层次模型:组级随机效应
# ==============================================================
import numpy as np, pymc as pm, arviz as az
rng = np.random.default_rng(20260911)
J, n_j = 8, 50
alpha_true = rng.normal(0, 1.5, J) # 组级截距
X = rng.normal(size=J*n_j)
group = np.repeat(np.arange(J), n_j)
Y = alpha_true[group] + 0.5*X + rng.normal(scale=0.5, size=J*n_j)
with pm.Model() as hier:
mu_a = pm.Normal('mu_a', 0, 5)
sigma_a = pm.HalfNormal('sigma_a', 1)
alpha_j = pm.Normal('alpha_j', mu=mu_a, sigma=sigma_a, shape=J)
beta = pm.Normal('beta', 0, 5)
sigma = pm.HalfNormal('sigma', 1)
pm.Normal('Y_obs', mu=alpha_j[group] + beta*X, sigma=sigma, observed=Y)
with hier:
trace_h = pm.sample(draws=2000, tune=1000, chains=4,
random_seed=20260911, target_accept=0.9)
print(az.summary(trace_h, var_names=['mu_a','sigma_a','beta']))
06 论文案例
07 常见错误
贝叶斯结论对先验可能高度敏感。必须报告"无信息先验 vs 有信息先验"两组后验;如果两组后验天差地别,说明数据信息量不足,结论不可信。
R-hat > 1.01、trace plot 有趋势、ESS < 400,都说明采样没收敛。此时后验均值/区间毫无意义。必须延长 warmup、增加链长、或换 NUTS。
95% 可信区间的意思是"参数落在这个区间的后验概率是 95%"——这是频率派置信区间给不了的解释。但反过来,也不要把它等同于"参数以 95% 概率在区间内"的频率派语言——两者的概率对象不同。写论文时用"后验概率"语言。
贝叶斯做几百个后验检验,"P(θ_j > 0 | data) > 0.95"的个数会膨胀。应使用层次收缩先验(partial pooling)或明确报告探索性分析。
如果后验均值与先验均值几乎相同,说明数据没有更新信念——结论不是来自数据,是来自你自己的先验。要画 prior vs posterior 对比图。
NUTS 前 1000 步是自适应调参,不是平稳分布。报告时只用 tune 之后的样本;trace plot 也要看完整链,不要截短。
08 交叉链接
- 与 DSGE 贝叶斯估计(05):DSGE 是贝叶斯推断在宏观结构模型中的主战场。本页讲一般原理,DSGE 页讲具体模型实现(Dynare 的先验、MCMC、IRF)。
- 与 11 显著性诊断实务:贝叶斯后验概率 $P(\theta>0|Y)$ 是 p 值的贝叶斯替代。读那一页的 p 值批判部分,再回到本页看贝叶斯如何解决同一问题。
- 与 04 基准回归、05 IV:贝叶斯 OLS 在无信息先验下退化为频率 OLS,是贝叶斯与频率派的"桥梁"。
- 与 15 潜在结果与因果图:Imbens–Rubin (2015) 把因果推断贝叶斯化,与潜在结果框架天然衔接。
实务建议:如果你的研究样本量超过 1000、模型是标准 OLS/IV/DID,不必上贝叶斯——频率派方法已经足够,贝叶斯只会增加审稿人对"先验选择"的质询。贝叶斯真正适合三类场景:① 小样本结构模型(DSGE、RBC 用 100–200 个季度数据估 30+ 参数);② 层次/多层数据(跨学校、跨地区随机效应,频率派 REML 不报告分布);③ 需要完整不确定性表达的政策分析(后验分布直接喂给福利计算)。中文顶刊里,贝叶斯推断目前主要出现在宏观(BVAR、DSGE)与金融(随机波动率、信用风险)领域;微观实证论文用得少。如果你是微观实证方向,把本页当作"理解 BVAR/DSGE 论文"的工具即可。