贝叶斯估计:把 DSGE 从"校准"升级为"用数据说话"
本页把贝叶斯估计从理论到实操一次讲透:为什么 DSGE 要走贝叶斯路线、贝叶斯定理四要素的经济学含义、先验分布族与 Smets-Wouters(2007) 完整先验表、中国 / 美国 / 国际数据来源与清洗流程、卡尔曼滤波构造似然、Metropolis-Hastings 后验抽样、Dynare estimation 命令逐项解释、收敛诊断、结果解读、完整可运行 .mod 示例与常见错误调试。
01 为什么用贝叶斯估计 DSGE
要理解贝叶斯估计在 DSGE 里的地位,必须先把它与另外两条参数确定路线放在一起比较:校准(calibration)与极大似然估计(MLE)。校准由 Kydland-Prescott 开创,做法是凭微观证据、稳态矩和已有文献把参数"拍"成一组常数,再去比较模型矩与数据矩。它的优点是透明、可复现、计算便宜;缺点也很致命——参数没有任何不确定性度量,你不知道某个参数究竟是 0.7 还是 0.9,也无法系统地回答"数据到底支持哪个模型"。一旦审稿人问"这个 beta 为什么取 0.99",校准只能诉诸文献惯例。
极大似然则走到另一个极端:把参数当成未知常数,在整个参数空间里最大化似然 $p(Y\mid\theta)$,取最优点。理论上无懈可击,但 DSGE 的现实是小样本、大模型、弱识别——中尺度 SW 模型有约 20 个结构参数加 7 个冲击标准差,而美国战后季度数据不过 200 多个观测。似然面往往非常平坦、布满局部最优,MLE 极易收敛到一个"技术上最优、经济上荒谬"的角落解;而且点估计丢弃了大量信息,无法直接给出置信区间,更做不了模型比较。
贝叶斯估计恰好弥补了两者的缺陷,它的核心优势可以概括为四点。第一,结合先验信息。研究者在看数据之前,凭微观估计、稳态恒等式和已有文献,对参数已有大量结构化知识(比如主观贴现因子 $\beta$ 必然接近 1,Calvo 重新定价概率 $\theta\in(0.5,0.9)$)。贝叶斯把这些知识编码成先验分布,当作"软约束",再让数据去更新它,而不是像校准那样把参数钉死。第二,处理小样本。当先验把参数合理地约束在经济上有意义的区间内时,即使似然面平坦,后验仍然是良态的,避免 MLE 在无边无际的参数空间里乱跑。第三,输出完整的参数不确定性。贝叶斯估计的产出不是一个点,而是后验分布 $p(\theta\mid Y)$,你可以直接读出后验均值、中位数、90%/95% 可信区间,以及任何函数(如脉冲响应、福利损失)的后验分布。第四,天然支持模型比较。边际似然 $p(Y)$ 把"拟合好"与"参数简约"统一成一个标量,Bayes factor 可以在嵌套或非嵌套模型之间做正式比较,这是 MLE 的 AIC/BIC 难以完全替代的。
正是因为这些优势,自 Smets-Wouters (2007) 之后,贝叶斯估计已经成为中大型 DSGE 的事实标准估计方法,各国央行(Fed、ECB、PBOC)的核心模型几乎全部采用这一框架。
02 贝叶斯定理与推断框架
设待估参数向量为 $\theta$(包含结构性参数与冲击标准差),观测数据为 $Y=\{y_t\}_{t=1}^{T}$。贝叶斯推断的全部内容,就是用观测到的数据 $Y$ 来修正我们对 $\theta$ 的事前信念。这一修正由贝叶斯定理完成:
假设。这里有三个前提:其一,参数被视为随机变量而非常数,我们对它的"知道程度"用概率分布刻画;其二,似然 $p(Y\mid\theta)$ 由模型完全决定——给定参数,DSGE 的一阶解给出线性状态空间,再由卡尔曼滤波把数据的条件密度算出来;其三,先验 $p(\theta)$ 与数据 $Y$ 的分布形式相互独立,即先验不依赖于这组数据本身。
公式四个量各有明确的经济学含义,下面逐一解读:
- 先验 $p(\theta)$:估计"之前"研究者对参数的信念。它把经济理论与外部证据压缩成一个分布——例如 $\beta$ 接近 1、Calvo 概率落在 0.5–0.9、风险厌恶系数约在 1–2。先验不是"拍脑袋",而是微观估计、稳态恒等式和前人文献的结构化汇总。
- 似然 $p(Y\mid\theta)$:在给定参数 $\theta$ 下,模型生成我们观测到这组数据的"可能性"。它是数据进入推断的唯一通道,由卡尔曼滤波在线性高斯状态空间上递归构造。似然越大,说明这组参数下模型越能复现数据的动态。
- 后验 $p(\theta\mid Y)$:用数据更新之后的信念,是贝叶斯估计最终要的全部结论。它同时受先验与似然影响——数据信息强时后验被似然主导,数据信息弱时后验向先验收拢。
- 边际似然 / 证据 $p(Y)$:把 $\theta$ 积掉后数据自身的边缘概率。它与 $\theta$ 无关,纯粹是个归一化常数,但它衡量"在整个先验空间上,模型平均而言有多能解释数据",因此是模型比较(Bayes factor)的核心。
由于 $p(Y)$ 与 $\theta$ 无关,抽样时根本不需要算它。我们只关心后验核(posterior kernel):
解读:后验 ∝ 先验 × 似然。MCMC(第 06 节)做的全部事情,就是从这个正比于"先验×似然"的未知分布里抽取大量样本,用这些样本的经验分布去逼近真实后验。注意这与频率学派的本质区别——频率学派把 $\theta$ 当固定常数、$Y$ 当随机;贝叶斯把 $Y$ 固定(已经发生)、把 $\theta$ 当随机。这一哲学差异直接决定了我们报告的是"参数落在某区间的概率",而非"在重复抽样中区间覆盖真值的频率"。
03 先验分布设定(重点)
先验设定是贝叶斯 DSGE 最能体现研究者功力的环节。它有两条铁律:取值域必须匹配(概率型参数不能放 Gamma,正参数不能放 Normal),先验必须合理地"软"(太硬等于校准,太软等于放任似然乱跑)。下面先讲分布族的选择逻辑,再讲超参数怎么定,最后给出 Smets-Wouters(2007) 的完整先验表与 Dynare 写法。
3.1 常用分布族与适用参数
| 分布 | 取值域 | 形状特点 | 典型用于哪些参数 |
|---|---|---|---|
| Beta $\mathcal{B}(\alpha,\beta)$ | $(0,1)$ | 双峰可调成近似钟形 | Calvo 概率 $\theta$、习惯形成 $h$、Taylor 平滑 $\rho_r$、AR(1) 持续性系数 $\rho$、投资调整成本相关比例 |
| Gamma | $(0,\infty)$ | 右偏、严格正 | 相对风险厌恶 $\sigma_c$、Frisch 劳动供给弹性 $\varphi$、Taylor 通胀系数 $\phi_\pi$、产出系数 $\phi_y$、投资调整成本 $\varphi$、稳态价格加成 |
| Inverse Gamma | $(0,\infty)$(重尾) | 右尾厚、在 0 附近截断 | 所有结构冲击的标准差 $\sigma$(技术、货币政策、风险、投资加成、价格加成、工资加成、消费偏好) |
| Normal | $(-\infty,\infty)$ | 对称无界 | 无符号约束的参数,如稳态通胀 $\bar\pi$、政策反应中的长期系数 |
| Uniform | $(a,b)$ | 平坦、无信息 | 不希望施加任何主观信念时,对某参数做无信息先验 |
为什么冲击标准差要用 Inverse Gamma 而不是 Gamma?因为 Inverse Gamma 分布有厚尾且在 0 附近自动截断,对应"我们对冲击波动率的信念是右偏的、允许偶尔很大但不允许为负"这一先验直觉;同时它是高斯似然的共轭先验,数学性质友好。而 Beta 之所以用于 (0,1) 区间的概率参数,是因为它天然把质量压在 (0,1) 内,且通过超参数可以调成近似正态的钟形($\alpha,\beta$ 都较大时)。
3.2 超参数(均值、标准差)怎么选
先验均值与标准差不是随意取的,有三个来源可依。第一,微观估计证据。例如 Frisch 弹性在微观劳动经济学文献里常见估计为 1 左右,习惯形成参数 $h$ 的微观证据约在 0.5–0.8。第二,已有文献。Smets-Wouters(2007)、Altig 等 (2011)、Justiniano 等 (2010) 的先验设定已成为国际标准,做中国 DSGE 时可在其基础上按中国数据的矩做小幅平移。第三,稳态矩。比如资本折旧率 $\delta$ 由稳态投资/资本比锁定,主观贴现因子 $\beta$ 由稳态实际利率 $1/\beta-1$ 锁定,这些参数几乎不需要估计,通常直接校准或给极窄先验。
先验标准差太小(如 0.01),等于强行校准,数据无法更新——后验几乎等于先验;太大(如 1.0),则先验几乎无信息约束,等价于在无边参数空间里搜似然,容易跑出经济上荒谬的值。SW 的经验是:持续性系数先验 std 约 0.1,Taylor 系数 std 约 0.25–0.5,冲击标准差先验 std 约 0.05–0.1。
3.3 Smets-Wouters (2007) 先验设定表(节选事实标准)
| 参数 | 含义 | 分布 | 先验均值 | 先验 std |
|---|---|---|---|---|
| $\varphi$ | 投资调整成本 | Normal | 4.00 | 1.50 |
| $\sigma_c$ | 相对风险厌恶 | Normal | 1.50 | 0.37 |
| $h$ | 习惯形成 | Beta | 0.70 | 0.10 |
| $\sigma_l$ | Frisch 劳动弹性 | Normal | 2.00 | 0.75 |
| $\xi_w$ | 工资 Calvo | Beta | 0.50 | 0.10 |
| $\xi_p$ | 价格 Calvo | Beta | 0.50 | 0.10 |
| $\iota_w$ | 工资指数化 | Beta | 0.50 | 0.15 |
| $\iota_p$ | 价格指数化 | Beta | 0.50 | 0.15 |
| $\psi$ | 资本利用调整 | Beta | 0.50 | 0.15 |
| $\Phi$ | 稳态价格加成 | Normal | 1.25 | 0.12 |
| $r_\pi$ | Taylor 通胀反应 | Normal | 1.70 | 0.10 |
| $r_y$ | Taylor 产出反应 | Normal | 0.125 | 0.05 |
| $\rho$ | 政策利率平滑 | Beta | 0.75 | 0.10 |
| $\pi^*$ | 稳态通胀 | Gamma | 0.62 | 0.10 |
| $100(\beta^{-1}-1)$ | 稳态贴现率 | Gamma | 0.25 | 0.10 |
| $\rho_a,\rho_b,\rho_g,\rho_I,\rho_p,\rho_w,\rho_r$ | 各冲击 AR(1) | Beta | 0.50–0.90 | 0.10 |
| $\sigma_{a},\dots$(7 个) | 各冲击标准差 | Inv. Gamma | 0.1–0.5(季度百分数) | 2(宽松先验) |
注意 SW 对冲击标准差用的是非常宽松的 Inverse Gamma 先验(先验 std 设大),因为他们希望数据自己告诉各冲击的相对重要性,而不是用先验把某个冲击"预设得很大"。这是一个值得借鉴的设计原则:结构性参数给紧先验(受微观证据约束),冲击波动率给松先验(让数据说话)。
3.4 先验敏感性分析(prior sensitivity)
审稿人最常问的问题是:"你的后验到底是数据说了算,还是先验说了算?"标准做法是做先验敏感性分析:把先验标准差放大或缩小一倍(如把某个参数的先验 std 从 0.10 改成 0.20 或 0.05),重新跑一次 MCMC,比较后验均值与区间。如果结论对先验设定稳健,说明是数据在更新;如果后验几乎随先验平移,说明该参数被先验主导,数据信息量不足,需要在论文中如实报告。
3.5 Dynare 中 prior 块的写法
Dynare 用 estimated_params 块声明每个待估参数,语法为:参数名, 分布名, 先验均值, 先验标准差, 下界, 上界;。冲击标准差用 stderr 冲击名 开头,冲击 AR(1) 系数用 corr 冲击名, 另一冲击名 或在模型方程里写 rho_*。
estimated_params;
% --- 结构性参数: 分布, 均值, std, [下界], [上界] ---
kappa, gamma_pdf, 0.125, 0.05, 0, 1; % NKPC 斜率
sigma_c, normal_pdf, 1.50, 0.37, 0.2, 4; % 风险厌恶
h, beta_pdf, 0.70, 0.10, 0, 0.95;% 习惯形成
phi_pi, gamma_pdf, 1.70, 0.10, 1.0, 4; % Taylor 通胀
phi_y, gamma_pdf, 0.125, 0.05, 0, 1; % Taylor 产出
rho_r, beta_pdf, 0.75, 0.10, 0, 0.97;% 利率平滑
rho_a, beta_pdf, 0.90, 0.05, 0, 0.999;% 技术 AR(1)
% --- 冲击标准差: 一律 inv_gamma_pdf ---
stderr ea, inv_gamma_pdf, 0.01, 0.005;
stderr em, inv_gamma_pdf, 0.0025, 0.001;
% --- 可选: 两个冲击的相关系数 ---
% corr ea, em, beta_pdf, 0.0, 0.2;
end;
04 数据选择与处理(重点)
DSGE 估计的成败,一半在模型,一半在数据。宏观时间序列样本短、噪声大、口径混杂,观测变量与模型变量对不上是新手最常见的失败原因。本节分"变量选择—数据来源—处理步骤—对应关系"四步讲清楚。
4.1 观测变量与模型变量的对应原则
模型里的变量都是对稳态的偏离(百分比偏离或百分点偏离),而现实数据是含趋势、含水平的序列。观测方程要做的,就是把"数据 $y_t$"翻译成"模型变量 $\hat x_t$"。对应原则是:模型里有几个内生可观测变量,就用几个数据序列;且观测变量个数不能超过结构冲击个数,否则卡尔曼滤波出现随机奇异性(stochastic singularity)。一个标准中尺度模型用 7 个冲击,就观测 7 个序列:产出、消费、投资、工资、通胀、利率、就业(或小时)。
4.2 中国数据来源与具体指标
| 模型变量 | 中国常用指标 | 来源 | 备注 |
|---|---|---|---|
| 产出 $Y$ | GDP 不变价当季值(累计当季折算) | 国家统计局 NBS / Wind | 用不变价或名义/GDP平减指数折算,季调 |
| 消费 $C$ | 社会消费品零售总额 / 居民消费支出(季度) | NBS / Wind / CSMAR | 社零偏月度,需加总为季度并折算实际值 |
| 投资 $I$ | 固定资产投资完成额(不含农户)/ 资本形成总额 | NBS / Wind | 固定资产投资为名义值,需用 PPI 折算 |
| 通胀 $\pi$ | CPI 同比(季度均值或环比折年) | NBS / CEIC | 也可用 GDP 平减指数,需自行计算 |
| 政策利率 $R$ | 7 天银行间质押式回购利率(DR007)/ 7 天逆回购利率 / Shibor | 中国人民银行 / Wind | 中国"政策利率"不唯一,主流用 7 天逆回购或 DR007 |
| 工资 $W$ | 城镇单位就业人员平均工资 / 城镇私营单位工资 | NBS | 季度频率不完整,常用 CPI 折算后取增速 |
| 就业 / 小时 $L$ | 城镇单位就业人数 / 就业总人数 | NBS / CSMAR | 无小时数据时用就业人数替代,质量一般 |
数据平台上,Wind 与 CEIC 是做中国 DSGE 最顺手的两个库,指标口径全、历史长;CSMAR 适合做行业/微观补充;国家统计局官网免费但导出与季调需自己处理。中国数据有几个特殊坑:① 2003 年起 GDP 核算口径调整;② 2014 起固定资产投资改为财务支出口径;③ 春节导致 1–2 月数据合并发布;④ 社零与居民消费支出口径差异较大。这些都要在样本区间选择时规避。
4.3 美国与国际数据来源
| 地区 | 数据平台 | 典型指标 |
|---|---|---|
| 美国 | FRED(圣路易斯联储 FRED II) | Real GDP (GDPC1)、GDP Deflator (GDPDEF)、Real Personal Consumption、Real Gross Private Domestic Investment、Average Hourly Earnings (AHETPI)、Civilian Employment (CE16OV)、Federal Funds Rate (FEDFUNDS) |
| 美国官方 | BLS(劳工部)、BEA(经济分析局) | BLS 负责 CPI、就业、平均时薪;BEA 负责 NIPA 账户(GDP、消费、投资)。FRED 实际就是把 BLS/BEA/财政部的数据统一编号 |
| 国际 | Penn World Table (PWT) | 跨国可比的资本存量、全要素生产率、就业、汇率,适合做开放经济或跨国估计 |
| 国际 | IMF IFS(International Financial Statistics) | 各国名义 GDP、CPI、利率、汇率、国际收支 |
| 国际 | OECD.Stat | OECD 成员国高频宏观、小时就业、工资 |
FRED 的优势是每个序列有固定代号、提供 ALFRED 实时 vintage、可直接下载 csv;做美国 DSGE 几乎全部指标都能在 FRED 找到,这也是 Smets-Wouters 模型易于复现的原因之一。
4.4 数据处理五步流程
4.5 观测变量与模型变量对应表(含观测方程)
统一的状态空间框架下,观测方程写作 $Y_t = H X_t + \eta_t$,其中 $Y_t$ 是数据向量,$X_t$ 是模型状态向量,$\eta_t$ 是测量误差(可选)。下表给出一个标准 SW 风格模型的对应关系:
| 数据列名 | 对应模型变量 | 观测方程写法(Dynare) | 量纲处理 |
|---|---|---|---|
| obs_y | 产出偏离 $\hat y_t$ | obs_y = y; | 对数后 HP 循环或一阶差分 |
| obs_c | 消费偏离 $\hat c_t$ | obs_c = c; | 同上 |
| obs_i | 投资偏离 $\hat i_t$ | obs_i = i; | 同上 |
| obs_w | 实际工资 $\hat w_t$ | obs_w = w; | 对数后去趋势 |
| obs_pi | 通胀 $\pi_t$ | obs_pi = 400*pi; | 年化百分数 |
| obs_r | 名义利率 $r_t$ | obs_r = 400*r; | 年化百分数 |
| obs_l | 就业/小时 $\hat l_t$ | obs_l = l; | 对数后偏离均值 |
Dynare 里这一对应关系由两个声明完成:varobs obs_y obs_c obs_i obs_w obs_pi obs_r obs_l; 列出要观测的变量名(顺序与数据文件列序一致),再在 model 块里把这些 obs_* 写成方程(即观测方程),数据文件名用 datafile='data.csv' 指定。注意 Dynare 默认数据文件无表头、列顺序与 varobs 完全一致、行顺序按时间。
05 卡尔曼滤波(Kalman Filter)与似然构造
Dynare 求解器把 DSGE 在稳态附近一阶展开,得到线性 rational expectations 解。这个解天然是一个线性高斯状态空间模型,卡尔曼滤波就是在这种模型上高效计算似然的递归算法。
5.1 状态空间表示
其中 $X_t$ 是模型状态(含前定变量与期望变量),$Y_t$ 是观测数据向量,$A$、$B$、$H$ 由 DSGE 解出、是 $\theta$ 的函数,$Q$ 是结构冲击协方差,$R$ 是测量误差协方差(可设为 0)。假设:$\varepsilon_t$ 与 $\eta_t$ 独立、同分布、高斯。正是这两条假设让似然有解析形式。
5.2 预测步与更新步
记 $\hat X_{t|t-1}=E[X_t|Y_{1:t-1}]$ 为用前 $t-1$ 期数据对 $X_t$ 的预测,$P_{t|t-1}$ 为其均方误差。滤波分两步递归:
解读:$v_t$ 是新息(innovation)——当期数据与模型预测的差;$F_t$ 是新息的条件方差;卡尔曼增益 $K_t$ 决定用新息修正预测的力度——当观测噪声大($R$ 大)时 $K_t$ 小,模型更相信自己;当状态不确定大($P$ 大)时 $K_t$ 大,模型更相信数据。
5.3 似然如何由滤波构造
在高斯假设下,新息 $v_t|Y_{1:t-1}\sim N(0,F_t)$,所以每期的条件密度就是一个高斯密度。把它们连乘再取对数,就是完整似然:
这就是 DSGE 似然的全部:一个 $T$ 期的高斯预测误差分解。Dynare 在每次评估后验核时,内部都跑一遍这个滤波,把 $\log p(Y|\theta)$ 算出来,再乘上先验密度。卡尔曼滤波在 DSGE 估计中的作用,就是把"给定参数下模型解释数据的能力"压缩成一个可微的标量,供 MCMC 与优化器调用。注意:当观测变量数大于结构冲击数时,$F_t$ 会奇异(不可逆),滤波报错——这就是"随机奇异性",第 09 节会讲。
06 MCMC 后验模拟:Metropolis-Hastings
6.1 为什么需要 MCMC
后验核 $p(\theta\mid Y)\propto p(\theta)p(Y\mid\theta)$ 是一个高维、非标准分布,没有解析形式,也无法直接积分出后验矩。MCMC(Markov Chain Monte Carlo)的思路是:构造一条马尔可夫链,让它的平稳分布恰好是后验 $p(\theta\mid Y)$;跑足够多步后,链上的样本就近似从后验抽取,用这些样本的经验均值、分位数去估计后验矩。
6.2 Metropolis-Hastings 算法步骤
Dynare 默认用随机游走 Metropolis-Hastings (Random-Walk MH):
mh_jscale。接受率的目标区间是 20%–40%(随机游走 MH 的最优渐近接受率在高维约 23%)。接受率过高(>60%)说明跳跃太小、链在原地磨蹭、混合慢;过低(<10%)说明跳跃太大、几乎全被拒绝、探索不足。调 mh_jscale 就是调提议方差:接受率太高就调大,太低就调小。
6.3 Dynare estimation 命令完整写法与逐项解释
estimation(datafile='data_cn.csv', % 数据文件: 无表头, 列序同 varobs
directory='./bayes_out', % 输出目录
% ----- 模式搜索 (找后验众数) -----
mode_compute=4, % 4=Newton-like Chris Sims 优化; 1=fmincon; 6=veacnel; 8=CMR
mode_check, % 在众数处打印梯度/Hessian, 检查识别
% ----- MCMC 抽样 -----
mh_replic=200000, % 每条链抽样数 (建议 10万-50万; 太少不收敛)
mh_nblocks=2, % 并行链数 (>=2 才能做 BGR 诊断)
mh_jscale=0.3, % 提议分布跳跃尺度: 调接受率, 目标 20-40%
mh_drop=0.2, % 丢弃前 20% 作为 burn-in
prior_trunc=0, % 先验截断 (0=不截断, 与分布默认支持一致)
% ----- 输出量 -----
bayesian_irf, % 计算贝叶斯 IRF (带后验置信带)
irf=40, % IRF 长度 40 期
moments_endo, % 输出后验二阶矩
forecast=8, % 样本外预测 8 期
smoothed_state, % 平滑状态 (用于历史分解)
filtered_state,
load_mh_file, % 续跑: 已有 mh 文件时追加
nograph, % 不自动出图 (无显示环境用)
nodisplay,
graph_format='pdf');
每个选项的含义:mode_compute 决定用哪个优化器找后验众数,=4(Chris Sims 的 csminwel)是最稳健的默认值,若失败可换 =6(fmincon 类)或 =8;mh_replic 是每条链的抽样数,中尺度模型至少 10 万起,正式论文常跑到 50 万;mh_jscale 是最需要手动调的参数,跑一次后看 Dynare 输出的 "acceptance rate",不在 20–40% 就按比例缩放重跑;mh_nblocks=2 跑两条独立链,是 Brooks-Gelman-Rubin 诊断的前提;bayesian_irf 让 Dynare 对每个后验抽样点都算一遍 IRF,最终给出 IRF 的后验分布;forecast=8 给出样本外 8 期预测的后验分布;load_mh_file 允许在已有 MCMC 文件基础上续跑,避免每次从头算。
6.4 收敛诊断
MCMC 不收敛是估计类论文被拒的头号原因。必须做三层检查:
- Brooks-Gelman-Rubin (BGR) 统计量:对每条链算组内方差 $W$ 与跨链方差 $B$,收缩因子 $\hat R=\sqrt{\frac{\widehat{\text{Var}}(\theta|Y)}{W}}$,其中 $\widehat{\text{Var}}=\frac{n-1}{n}W+\frac{1}{n}B$。收敛要求 $\hat R$ 在整个抽样后期稳定地接近 1(经验阈值 < 1.02 或 1.1)。Dynare 自动输出 BGR 图。
- trace 图(轨迹图):画出每个参数随抽样序号的轨迹。两条链应"纠缠"在一起、没有明显的趋势或漂移、没有长期停在某点。如果链在某个值上粘住不动,说明提议方差太小或有边界陷阱。
- 后验直方图与自相关图:后验分布应光滑、单峰;自相关应快速衰减(lag 10 以内接近 0)。自相关衰减慢意味着有效样本量 (ESS) 远小于名义 mh_replic,需要加大抽样数或优化提议方差。
07 结果解读
Dynare 跑完后会输出大量数字和图,本节讲哪些是真正要读的。
7.1 后验矩与可信区间
报告每个参数的后验均值(posterior mean)、后验中位数(posterior median)、后验众数(posterior mode),以及 90% 或 95% 最高后验密度区间(HPD interval)。注意贝叶斯的区间不是"频率学派的置信区间",它直接是"参数落在该区间的后验概率"。区间是否跨过 0(对系数类参数)或是否显著偏离先验均值,是判断"数据是否识别出该参数"的关键。
7.2 先验—后验对比图
Dynare 默认画 prior vs posterior 图:先验密度(浅色)与后验密度(深色)叠在一张图上。解读规则:若后验明显比先验窄、且中心偏移,说明数据对该参数有信息;若后验几乎与先验重合,说明数据没怎么更新——该参数实际上被先验钉住了,论文里应谨慎讨论,或改用更宽先验重新估计。这是审稿人最爱的"数据 vs 先验"检查。
7.3 边际似然与模型比较(Bayes factor)
Dynare 在输出末尾给出 log data density(边际似然的对数,用 Geweke 修正调和均值或 Laplace 近似计算)。比较两个模型 $M_1$ 与 $M_2$ 时:
Jeffreys 准则:$2\ln BF > 10$ 为极强证据,2–6 为正向证据,<2 则无显著差异。注意边际似然对先验很敏感(先验越宽,惩罚越大),所以比较模型时必须用相同的先验,否则比较无意义。
7.4 贝叶斯 IRF、历史分解与方差分解
- 贝叶斯 IRF:对每个后验抽样点都算一组脉冲响应,画中位数带 90% 置信带。与校准 IRF 相比,它告诉你"冲击如何传导"这一结论本身有多不确定。
- 历史分解(historical decomposition):把样本期内观测变量偏离稳态的每一部分,归因到每个结构冲击。例如"2008Q4 产出下滑主要由风险冲击解释"。这是政策叙事的核心图表。
- 方差分解(variance decomposition):报告各冲击在 4 期、10 期、∞ 期对产出/通胀/利率预测方差的贡献份额,回答"周期主要由什么驱动"。
08 完整 Dynare .mod 示例
下面给出一个可直接套用的小型 NK 模型贝叶斯估计 .mod 文件,覆盖 varobs、先验块、model 块中的观测方程、estimation 命令。把你已有的 model 块替换进去即可。
% ======================================================================
% nk_bayes_cn.mod 小型 NK 模型贝叶斯估计 (中国数据示范)
% 数据: data_cn.csv, 三列无表头, 顺序 = varobs 顺序:
% 列1 obs_y : 实际产出 HP 循环 (百分数)
% 列2 obs_pi : CPI 同比年化 (百分数)
% 列3 obs_r : 7天逆回购利率年化 (百分数)
% ======================================================================
% ---------- 1. 变量声明 ----------
var y c pi r mc a; % 内生变量
varobs obs_y obs_pi obs_r; % 被观测变量 (顺序=数据列序)
varexo ea em; % 结构冲击: 技术 ea, 货币政策 em
% ---------- 2. 被估计参数的先验 ----------
estimated_params;
kappa, gamma_pdf, 0.125, 0.05; % NKPC 斜率
sigma_c, normal_pdf, 1.50, 0.37; % 风险厌恶 (固定或估计)
phi_pi, gamma_pdf, 1.50, 0.25; % Taylor 通胀反应
phi_y, gamma_pdf, 0.125, 0.05; % Taylor 产出反应
rho_r, beta_pdf, 0.75, 0.10; % 利率平滑
rho_a, beta_pdf, 0.90, 0.05; % 技术 AR(1)
stderr ea, inv_gamma_pdf, 0.01, 0.005; % 技术冲击 std
stderr em, inv_gamma_pdf, 0.0025,0.001; % 货币冲击 std
end;
% ---------- 3. 固定参数 (不估计) ----------
params beta;
beta = 0.99; % 主观贴现因子, 由稳态利率锁定
% ---------- 4. 模型方程 (对数线性化, 已是平稳形式) ----------
model(linear);
% IS 曲线
c = c(1) - (1/sigma_c)*(r - pi(1));
% NK 菲利普斯曲线
pi = beta*pi(1) + kappa*mc;
% 资源约束与边际成本
y = c;
mc = (sigma_c + 1.0)*y;
% Taylor 规则 (含利率平滑)
r = rho_r*r(-1) + (1-rho_r)*(phi_pi*pi + phi_y*y) + em;
% 技术过程
a = rho_a*a(-1) + ea;
% ===== 观测方程: 模型变量 -> 数据 =====
obs_y = y; % 产出循环 (已是百分数)
obs_pi = 400*pi; % 季度通胀 -> 年化百分数
obs_r = 400*r; % 季度利率 -> 年化百分数
end;
% ---------- 5. 稳态与求解 ----------
steady;
check; % 检查鞍点路径
% ---------- 6. 贝叶斯估计 ----------
estimation(datafile='data_cn.csv',
mode_compute=4, % Chris Sims 优化器找众数
mode_check,
mh_replic=200000, % 每链 20 万步
mh_nblocks=2, % 两条链
mh_jscale=0.3, % 跳跃尺度, 看接受率调整
prior_trunc=0,
bayesian_irf, % 贝叶斯 IRF
irf=40,
moments_endo,
forecast=8,
nograph, nodisplay);
% ---------- 7. 后处理 ----------
% Dynare 输出到 oo_ 结构:
% oo_.PosteriorTheoreticalMoments -> 后验均值/中位数/HPD
% oo_.MeanBvsPrior -> 先验后验对比
% oo_.PosteriorIRF -> 贝叶斯 IRF
% oo_.MarginalDensity -> log 边际似然
% oo_.SmoothedShocks -> 历史分解所需平滑冲击
% Shocks decomposition (历史分解):
% shocks_decomposition(plot);
% conditional_forecast paths(1);
% ======================================================================
% 中文注释要点:
% (1) varobs 必须与 model 块里 obs_* 方程一一对应, 顺序与数据列序一致;
% (2) estimated_params 里每个参数写: 名字, 分布, 均值, std, [下界], [上界];
% (3) model(linear) 表示方程已是对数线性化形式, 不要再写 model() 默认;
% (4) 利率/通胀乘 400 是为了把季度小数年化, 与数据口径对齐;
% (5) 先跑一次 mh_replic=5000 看 acceptance rate, 调 mh_jscale 后再跑长链.
% ======================================================================
09 常见错误与调试
现象:Dynare 输出 "MH acceptance rate = 80%" 或 "= 5%"。接受率太高说明提议太小,链混合极慢;太低说明提议太大,几乎全被拒绝。调试:目标 20–40%,按线性比例调整 mh_jscale(接受率太高则调大约 sqrt(1/0.3) 倍,太低则调小)。每次改完重跑短链验证。
现象:Optimization 不收敛、后验众数落在边界、mode_check 报梯度非零。调试:先把先验均值设得接近文献值,避免从离谱点出发;mode_compute=4 失败就换 =6 或 =8;用 mode_file= 把上一次找到的众数读入续跑;确认参数不撞先验边界。
现象:后验标准差巨大、log 似然极差、参数全部贴边。调试:检查量纲——数据是百分数而模型是季度小数(漏乘 400);检查 varobs 顺序与 csv 列序;检查数据是否已去趋势(把含趋势的水平序列喂给平稳模型,似然面会被趋势主导)。
两种相反的失败:① 先验过窄,后验≈先验,数据完全没更新("用贝叶斯方法做了一次校准");② 先验过宽且不支持似然,后验被先验尾部拉到经济上荒谬的值。调试:看 prior-posterior 对比图;做先验敏感性分析(std 翻倍/减半重跑);对 (0,1) 参数严格用 Beta,正参数用 Gamma/InvGamma。
现象:报错 "Matrix is singular" 或 "Stochastic singularity"。原因:观测变量个数 > 结构冲击个数,或某观测变量被模型精确决定、无任何冲击能解释。调试:增加一个结构冲击,或给某个观测加测量误差(varobs ... ; 配合 stderr obs_*, inv_gamma_pdf, ...;)。
现象:BGR 统计量远离 1、trace 图两条链不重合、后验直方图多峰。调试:加大 mh_replic 到 50 万;检查是否 burn-in 不够;确认 mode_compute 找到的众数确实是全局众数(多起点测试);对识别弱的参数收紧先验;必要时换自适应 Metropolis(Dynare 的 adapt= 选项)。
⑦ 数据里含疫情极端观测(2020),似然会被 outliers 主导,建议样本截止或加虚拟变量;⑧ 中国数据样本短(季度通常 80–100 个),先验要比 SW 稍紧,否则后验识别不出来;⑨ 不要把"后验均值"直接当"真实参数"解读,务必连同 HPD 区间一起报告。
10 经典论文案例
① Herbst & Schorfheide (2015) Bayesian Estimation of DSGE Models — Sequential Monte Carlo 进阶;② Dynare Reference Manual "Bayesian Estimation" 章;③ 学完本页后接 第 16 站:脉冲响应与模拟,把后验估计结果用到政策反事实分析。