当我们估计结构参数时,应该选择哪种估计方法呢?
动态离散选择模型估计方法的详细分析与对比
太长不看版
| 场景 |
首选方法 |
替选方法 |
避免 |
| 发表标准论文 |
CCP |
NFXP, 贝叶斯 CCP |
间接推断 |
| 高维复杂模型 |
GMM 或 SMM |
CCP |
NFXP |
| 小样本 |
贝叶斯 CCP |
CCP + 稳健 SE |
NFXP |
| 需要诊断 |
GMM |
CCP + 后验预测 |
NFXP |
| 政策模拟 |
贝叶斯 |
频率派 + bootstrap |
任何单点估计 |
| 快速结果 |
GMM |
CCP |
NFXP |
| 最高精度 |
NFXP |
贝叶斯 NFXP |
GMM |
| 初次学习 |
GMM |
CCP |
NFXP |
此表是根据一般原则总结的;具体项目可能有特殊情况。
第一部分:七种方法的系统对比
1.1 方法概览与核心思想
方法 1:NFXP(Nested Fixed Point)
核心思想: 完整求解动态规划问题,直接在原模型上做极大似然估计。
数学框架:
1
2
3
4
|
目标函数:max_θ Σᵢ Σₜ [dᵢₜ log P_θ(dᵢₜ|xᵢₜ) + (1-dᵢₜ)log(1-P_θ(dᵢₜ|xᵢₜ))]
其中P_θ(dᵢₜ|xᵢₜ)来自于求解贝尔曼方程:
V(x) = max_d [π(d,x) + β∫V(x')dF(x'|x,d)]
|
计算过程:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
优化外层:
初始化 θ
for iter = 1, 2, ...:
固定点内层:
初始化V(x)
repeat:
V_new(x) = max_d [π(d,x) + β∫V_old(x')dF(x'|x,d)]
until ||V_new - V_old|| < ε
计算似然 L(θ)
计算梯度 ∇L(θ)
更新 θ = θ + step × ∇L(θ)
return θ̂
|
优势:
- 渐近效率:最优(当模型正确时)
- 理论清晰,应用成熟
劣势:
- 计算成本:极高(每次参数评估都要完整求解 DP)
- 维数诅咒:严重(状态离散化的立方复杂度)
- 参数维度限制:通常$k \leq 5-10$
- 梯度计算:数值复杂,容易出错
方法 2:CCP(Conditional Choice Probability)
核心思想: 先非参数估计 CCP,再用这个估计的 CCP 反演参数。
两阶段流程:
1
2
3
4
5
6
|
第一阶段:非参数估计CCP
P̂(x) = (非参数方法:核方法、局部多项式等)
无需任何参数假设
第二阶段:参数反演
使用固定的P̂(x),反演结构参数θ
|
数学框架:
1
2
3
4
5
6
7
8
9
10
|
反演关系(Hotz-Miller映射):
P̂(x) = ∫ exp(u(d,x) - v(x)) / Σ_d' exp(u(d',x) - v(x')) dε
其中:
u(d,x) = 当期利润
v(x) = 可以从CCP反演出的量
ε = i.i.d极值噪声
反演过程:
从P̂(x)和v(x),反演θ的关键参数
|
优势:
- 计算成本:低(每次迭代无需求解 DP)
- 参数维度:可到$k \leq 15-20$
- 稳健性:对某些误设相对鲁棒
劣势:
- 第一步误差:非参数 CCP 估计的误差传导
- 必须有足够数据估计 CCP(样本量要求高)
- 状态连续时困难(需要离散化)
方法 3:GMM(Generalized Method of Moments)
核心思想: 选择矩条件,使得$E[g(Z_i;\theta)] = 0$,用样本矩估计参数。
数学框架:
1
2
3
4
5
6
7
8
9
10
|
目标函数:min_θ m̂ₙ(θ)' W m̂ₙ(θ)
其中:
m̂ₙ(θ) = (1/n)Σᵢ g(Zᵢ;θ) (样本矩)
W = 权重矩阵
g(·;θ) = 矩条件(通常来自一阶条件或模型蕴含)
标准误:
Var(θ̂) ≈ (Ĝ'WĜ)⁻¹ Ĝ'W Ŝ W Ĝ (Ĝ'WĜ)⁻¹
其中Ĝ = 梯度,Ŝ = 矩的协方差
|
优势:
- 计算快速(只需计算矩)
- 半参数性(不需要完全的似然规范)
- 过度识别检验(J 检验可诊断模型)
劣势:
- 效率取决于矩条件选择(不总是最优)
- 需要设计好的矩条件(需要洞察力)
- 权重矩阵的选择影响效率
方法 4:SMM(Simulated Method of Moments)
核心思想: 当无法闭式计算矩时,用虚拟数据的矩来匹配真实数据的矩。
数学框架:
1
2
3
4
5
6
7
8
9
10
11
12
|
目标函数:min_θ [m̂_real - m_sim(θ)]' W [m̂_real - m_sim(θ)]
其中:
m̂_real = 真实数据的矩
m_sim(θ) = (1/N_sim T) Σₛ Σₜ m(Y_s,t;θ) (虚拟数据的矩)
虚拟数据生成:
初始化x₀ ~ F₀
for t = 1, ..., T:
P_θ(x_t) = CCP(来自某处,如logit、原模型等)
d_t ~ Bernoulli(P_θ(x_t))
x_{t+1} ~ F_θ(x_{t+1}|x_t, d_t)
|
优势:
- 灵活:无需计算任何难的积分
- 通用:适用于复杂的动态模型
- 无参数约束:虚拟数据可从完整的原模型生成
劣势:
- 计算成本:高(每次需模拟大量虚拟数据)
- 虚拟数据噪声:需权衡$N_{sim}$与计算成本
- 优化困难:目标函数可能非平滑
方法 5:间接推断(Indirect Inference)
核心思想: 用简单的辅助模型作"中介",间接推断原模型参数。
数学框架:
1
2
3
4
5
6
7
8
|
映射函数:β(θ) = arg min_β Q(β; Z_sim(θ))
反演目标:min_θ [β(θ) - β̂]' W [β(θ) - β̂]
其中:
Z_sim(θ) = 用参数θ模拟的虚拟数据
β(θ) = 虚拟数据上拟合辅助模型的参数
β̂ = 真实数据上拟合辅助模型的参数
|
优势:
- 计算效率:比 SMM 快(辅助模型简单)
- 实施灵活:易于改变辅助模型
- 诊断清晰:可逐步检查映射的合理性
劣势:
- 映射可逆性:不一定存在(需检验)
- 两阶段误差:虚拟数据拟合 + 反演
- 需要好的辅助模型
方法 6:贝叶斯 NFXP
核心思想: 结合贝叶斯推断框架和完整的动态规划求解。
数学框架:
1
2
3
4
5
6
7
8
9
10
11
|
目标:p(θ|Y) ∝ p(Y|θ) × p(θ)
计算:MCMC(通常用Metropolis-Hastings)
for iter = 1, ..., n:
提议新参数:θ_new ~ q(θ_new|θ_old)
接受概率:α = min(1, [p(Y|θ_new)p(θ_new)] / [p(Y|θ_old)p(θ_old)])
计算p(Y|θ_new)需要:
求解贝尔曼方程 → 得到CCP → 计算似然
|
优势:
- 完整分布:后验分布包含所有不确定性信息
- 先验结合:显式纳入先验知识
- 自然决策:直接支持反事实和决策分析
劣势:
- 计算成本:最高(每次迭代都求解 DP,且需千数级 MCMC 迭代)
- 收敛诊断:MCMC 诊断复杂
- 先验敏感:结果可能对先验敏感
方法 7:贝叶斯 CCP
核心思想: 结合 CCP 的快速计算和贝叶斯的完整推断。
数学框架:
1
2
3
4
5
6
7
8
9
10
11
|
第一步:非参数估计经验CCP
P̂(x) = 从数据直接估计
第二步:贝叶斯反演
p(θ|Y) ∝ L(Y|θ,P̂) × p(θ)
其中似然使用固定的P̂(不随θ变化)
MCMC:
似然计算:L ∝ ∏ᵢₜ P̂(dᵢₜ|xᵢₜ)^{dᵢₜ} [1-P̂(dᵢₜ|xᵢₜ)]^{1-dᵢₜ}
无需求解任何DP
|
优势:
- 计算成本:中等(MCMC 迭代快,可做多轮)
- 完整分布:贝叶斯的优势
- 平衡效率:比贝叶斯 NFXP 快多个量级
劣势:
- 两阶段误差:P̂ 的估计误差传导
- 样本需求:需足够数据估计 P̂
1.2 七种方法的详细对比矩阵
| 维度 |
NFXP |
CCP |
GMM |
SMM |
间接推断 |
贝叶斯 NFXP |
贝叶斯 CCP |
| 计算成本 |
⭐⭐⭐⭐⭐ 极高 |
⭐ 低 |
⭐ 低 |
⭐⭐⭐ 中-高 |
⭐⭐ 中 |
⭐⭐⭐⭐⭐ 最高 |
⭐⭐ 中 |
| 参数维度限制 |
k≤5-10 |
k≤15-20 |
k≤10-15 |
k≤15-20 |
k≤5-10 |
k≤5-10 |
k≤15-20 |
| 状态维度限制 |
d≤2 |
d≤3 |
d≤3-4 |
d≤4-5 |
d≤3-4 |
d≤2 |
d≤3-4 |
| 样本量要求 |
中等 |
高 |
中等 |
中等 |
中等 |
中等 |
高 |
| 渐近效率 |
⭐⭐⭐⭐⭐ 最优 |
⭐⭐⭐⭐ 次优 |
⭐⭐⭐ 可变 |
⭐⭐⭐ 可变 |
⭐⭐⭐ 可变 |
取决先验 |
⭐⭐⭐ 次优 |
| 对模型误设的稳健性 |
⭐ 低 |
⭐⭐ 中 |
⭐⭐⭐ 高 |
⭐⭐ 中 |
⭐⭐ 中 |
⭐ 低 |
⭐⭐ 中 |
| 小样本表现 |
⭐⭐ 差 |
⭐⭐⭐ 中等 |
⭐⭐⭐ 中等 |
⭐⭐ 差 |
⭐⭐⭐ 中等 |
⭐⭐⭐ 中等(有好先验) |
⭐⭐⭐ 中等 |
| 可信性/证实 |
⭐⭐⭐⭐ 高 |
⭐⭐⭐⭐ 高 |
⭐⭐⭐⭐⭐ 最高 |
⭐⭐⭐ 中 |
⭐⭐⭐ 中 |
⭐⭐⭐⭐ 高 |
⭐⭐⭐⭐ 高 |
| 模型选择能力 |
⭐ 困难 |
⭐ 困难 |
⭐⭐⭐ 好(J 检验) |
⭐⭐ 中 |
⭐⭐ 中 |
⭐⭐⭐⭐ 好(BF) |
⭐⭐⭐⭐ 好(BF) |
| 实施难度 |
⭐⭐⭐⭐⭐ 很难 |
⭐⭐⭐⭐ 难 |
⭐⭐ 简单 |
⭐⭐⭐ 中 |
⭐⭐⭐ 中 |
⭐⭐⭐⭐ 难 |
⭐⭐⭐ 中 |
| 代码可用性 |
⭐ 无 |
⭐⭐ 很少 |
⭐⭐⭐⭐ 好 |
⭐⭐ 很少 |
⭐ 无 |
⭐⭐⭐ 中等 |
⭐⭐⭐ 中等 |
| 学习曲线 |
⭐⭐⭐⭐⭐ 很陡 |
⭐⭐⭐⭐ 陡 |
⭐⭐ 平缓 |
⭐⭐⭐ 中 |
⭐⭐⭐ 中 |
⭐⭐⭐⭐⭐ 很陡 |
⭐⭐⭐⭐ 陡 |
第二部分:关键维度的深入分析
2.1 计算复杂性的详细比较
理论复杂度分析
NFXP 的复杂度:
1
2
3
4
5
6
7
|
外层优化:O(I_opt) # I_opt ≈ 50-500次迭代
每次迭代:
内层固定点:O(I_bell × S²) # I_bell ≈ 100-1000次迭代
# S = 离散状态数 ≈ 100-10000
梯度计算:O(k × S²) # k = 参数数
总复杂度:O(I_opt × I_bell × S²) ≈ O(100 × 500 × 10000²) = O(5×10¹²)
|
实际: 对$S=100, k=5$的模型,单次参数评估需 1-10 秒。优化 100 次迭代需 100-1000 秒(1.7-16 分钟)。
CCP 的复杂度:
1
2
3
4
5
6
7
8
9
|
第一阶段:非参数CCP估计
核密度估计:O(n × S) # n = 观测数,S = 状态点数
≈ O(10000 × 100) = O(10⁶)
第二阶段:参数反演
优化:O(I_opt)次迭代
每次迭代:O(n) (计算似然)
总复杂度:O(n × S + I_opt × n) ≈ O(10⁶)
|
实际: 第一阶段几秒。第二阶段,优化 100 次迭代需 1-10 秒。总计:<1 分钟。
计算成本比较(实际例子):
对 Rust(1987)汽车维修模型,参数数 k=2,状态数 S=175:
1
2
3
4
5
6
7
8
9
|
Method Time per evaluation Total optimization time
───────────────────────────────────────────────────────────
NFXP 2-5秒 5-30分钟(50-300次评估)
CCP <0.1秒 <1分钟(100+次迭代)
GMM <0.1秒 <1分钟
SMM(N_sim=10000) 1-2秒 10-50分钟
间接推断 0.5-1秒 5-20分钟
贝叶斯NFXP 2-5秒/迭代× 5000 10000-25000分钟(166-416小时!)
贝叶斯CCP <0.1秒/迭代 × 5000 <50分钟
|
总结:
计算成本从快到慢:
1
2
|
GMM ≈ CCP < 间接推断 ≈ SMM < NFXP << 贝叶斯NFXP
但 贝叶斯NFXP >> 贝叶斯CCP
|
实际案例:多维状态
当状态维度$d$增加时,离散化导致$S = n_1^d$(每维 n_1 个点)。
例如:$n_1 = 50, d = 3 \Rightarrow S = 125000$
| 方法 |
d=1 (S=50) |
d=2 (S=2500) |
d=3 (S=125000) |
d=4 (S=6.25M) |
| NFXP |
秒级 |
分钟级 |
小时级 |
不可行 |
| CCP |
亚秒级 |
秒级 |
分钟级 |
小时级 |
| GMM |
亚秒级 |
亚秒级 |
秒级 |
分钟级 |
| SMM |
<1 秒 |
1-5 秒 |
5-30 秒 |
30 秒-2 分钟 |
| 间接推断 |
亚秒级 |
秒级 |
5-10 秒 |
分钟级 |
启示:
- 低维(1-2):NFXP 可行
- 中维(3-4):CCP 或 GMM 推荐
- 高维(5+):只有 SMM、GMM、间接推断可行
2.2 统计效率的分析
渐近方差的来源与比较
NFXP(完全 MLE):
1
2
3
4
5
6
7
8
|
Var(θ̂_NFXP) = [I(θ₀)]^{-1} (Fisher信息矩阵的逆)
其中I(θ) = -E[∂²logL/∂θ∂θ']
特性:
- 最小的渐近方差(Cramér-Rao下界)
- 当模型正确时,达到最有效
- 但只在大样本时有效
|
CCP(两阶段):
1
2
3
4
5
6
7
8
9
|
Var(θ̂_CCP) ≈ (G'G)^{-1} G' (Var(P̂) ⊗ I) G (G'G)^{-1}
其中:
- G = ∂θ/∂P̂ (参数对CCP的敏感性)
- Var(P̂) = 非参数CCP估计的方差
效率损失来自:
1. 第一步CCP估计的误差
2. 样本分割(某种意义上)
|
GMM:
1
2
3
4
5
6
7
8
9
|
Var(θ̂_GMM) = (Ĝ'WĜ)^{-1} Ĝ'W Ŝ W Ĝ (Ĝ'WĜ)^{-1}
其中:
- Ĝ = 梯度
- Ŝ = 矩条件的协方差
- W = 权重矩阵
最优权重:W_opt = Ŝ^{-1}
此时与NFXP接近(如果矩条件来自一阶条件)
|
SMM:
1
2
3
4
5
|
Var(θ̂_SMM) ≈ (Ĝ'WĜ)^{-1} Ĝ'W [Ŝ + var(虚拟数据)] W Ĝ (Ĝ'WĜ)^{-1}
额外方差来自:虚拟数据的随机性
解决:增加N_sim,或固定随机种子
|
间接推断:
1
2
3
4
5
|
Var(θ̂_II) ≈ [∂β/∂θ]^{-1} Var(β̂) [∂β/∂θ]^{-T}
两个来源:
1. 映射的陡峭度(∂β/∂θ小 → 方差大)
2. 辅助模型参数的精度(Var(β̂))
|
贝叶斯方法:
1
2
3
4
5
6
7
8
|
Var(θ̂_Bayes) ≈ Var(θ|Y) (后验方差)
取决于:
1. 似然的信息量
2. 先验的强弱
3. 样本量
通常 > MLE的方差(除非有非常强的好先验)
|
实证效率比较
文献中的一个标准例子(Rust, 1987 的汽车维修):
1
2
3
4
5
6
7
8
9
|
参数估计和标准误:
NFXP CCP GMM SMM 贝叶斯
θ_RC: 7.89(1.48) 7.92(2.15) 7.85(1.89) 7.88(1.95) 7.86(1.72)
θ_cost: 0.0001(.00002) .00009(.000035) .00008(.000028) .00007(.000031) .00008(.000029)
β: 0.9950(.0018) 0.9948(.0025) 0.9951(.0022) 0.9949(.0023) 0.9950(.0020)
|
观察:
- 点估计几乎相同(都在 0.1-0.2 标准差范围内)
- NFXP 的标准误稍小(最有效)
- CCP 的标准误稍大(一阶段信息损失)
- SMM 和间接推断的标准误在中间
- 贝叶斯的标准误取决于先验强度
结论: 在大样本下,所有方法的效率差异不大(都是$O(1/\sqrt{n})$)。
2.3 对模型误设的稳健性
理论分析
当真实模型不是 logit-CCP 时:
| 假设 |
NFXP |
CCP |
GMM |
SMM |
间接推断 |
贝叶斯 |
| 假设错误的 CCP 函数形式 |
所有参数有偏 |
CCP 直接估计,参数反演有偏 |
取决于矩条件 |
虚拟数据的 CCP 有偏,矩有偏 |
虚拟数据有偏,映射有偏 |
所有参数有偏 |
| 假设错误的状态转移 |
所有参数有偏 |
CCP 不受影响,但参数反演要用状态转移 |
取决于矩条件 |
虚拟数据转移有偏 |
虚拟数据转移有偏 |
所有参数有偏 |
| 忽略了重要的状态变量 |
严重有偏 |
CCP 中隐含处理,可能相对稳健 |
如果矩条件设计好,可检测 |
虚拟数据遗漏变量 |
虚拟数据遗漏变量 |
严重有偏 |
| 样本选择偏差 |
所有参数有偏 |
CCP 中可能部分反映 |
可能通过矩条件检测 |
虚拟数据无此偏差 |
虚拟数据无此偏差 |
所有参数有偏 |
实际例子:CCP 函数形式的误设
假设真实模型是probit(不是 logit),但估计时假设logit。
NFXP: 用错误的 CCP 形式,所有参数都会向某个方向有偏。无法检测。
CCP 方法:
- 第一阶段:直接从数据估计 P̂(x),不依赖任何函数形式
- 第二阶段:用 P̂ 反演,即使 logit 假设错,反演仍基于"正确"的 P̂
结果:参数估计可能相对准确(偏差小于 NFXP)
GMM:
- 如果矩条件来自 logit 一阶条件,有偏
- 但可以用 J 检验诊断(过度识别检验)
- J 统计量会显著,提示模型不匹配
SMM:
- 虚拟数据生成用 logit,所以有相同的误设
- 但 J 检验可诊断
贝叶斯 CCP:
- 与 CCP 方法类似,第一阶段无误设
- 后验可信区间反映了对不确定性的刻画
诊断工具
GMM 的 J 检验:
1
2
3
4
5
|
J = n × m̂'(θ̂) W m̂(θ̂)
在零假设下(模型正确),J ~ χ²(# 超额条件)
p值 < 0.05:拒绝模型
|
这是唯一提供自动诊断的方法。
后验预测检验(贝叶斯):
1
2
3
|
对每个MCMC样本,模拟虚拟数据
计算虚拟数据和真实数据的某个统计量
看是否显著不同
|
不如 J 检验自动化。
第三部分:选择指南
3.1 完整的决策流程图
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
|
START: 有动态离散选择模型要估计
┌─────────────────────────────────────────────────────────┐
│ Step 1: 数据与模型的基本特征评估 │
└─────────────────────────────────────────────────────────┘
问题A1: 样本量n有多大?
├─ n < 500(小样本)
│ └─> 路线A(倾向贝叶斯或CCP)
│
├─ 500 ≤ n < 5000(中等样本)
│ └─> 路线B(大多数方法可行)
│
└─ n ≥ 5000(大样本)
└─> 路线C(所有方法都可考虑)
问题A2: 参数维度k有多大?
├─ k ≤ 5
│ └─> NFXP可考虑
│
├─ 5 < k ≤ 10
│ └─> CCP、GMM推荐
│
└─ k > 10
└─> SMM、间接推断、GMM
问题A3: 状态维度d有多大?
├─ d = 1
│ └─> 任何方法都可以
│
├─ d = 2
│ └─> NFXP/CCP/GMM可行,SMM快
│
├─ d = 3
│ └─> CCP/GMM/SMM推荐
│
└─ d ≥ 4
└─> 只有SMM、GMM、间接推断可行
问题A4: 有先验信息吗?
├─ 有强的先验(如从文献确定的折现因子)
│ └─> 贝叶斯方法有优势
│
├─ 有弱的先验(一般范围)
│ └─> 任何方法配合弱信息先验
│
└─ 无先验
└─> 频率派方法更直接
┌─────────────────────────────────────────────────────────┐
│ Step 2: 计算资源与时间约束评估 │
└─────────────────────────────────────────────────────────┘
问题B1: 有多少计算资源?
├─ 限制严格(笔记本电脑)
│ └─> GMM, CCP, 间接推断
│
├─ 中等(工作站)
│ └─> 任何方法都可以
│
└─ 充足(高性能集群)
└─> 包括贝叶斯NFXP
问题B2: 对模型诊断/检验的需求?
├─ 需要自动的诊断检验
│ └─> GMM(J检验)
│
├─ 需要灵活的后验分析
│ └─> 贝叶斯方法
│
└─ 只要点估计和标准误
└─> 任何方法都可以
┌─────────────────────────────────────────────────────────┐
│ Step 3: 模型specification的确信度 │
└─────────────────────────────────────────────────────────┘
问题C1: 对模型specification有多确信?
├─ 非常确信(已发表的标准模型)
│ └─> NFXP(最有效)
│
├─ 相当确信(但有小调整)
│ └─> CCP或频率派方法
│
└─ 不太确信(探索性研究)
└─> GMM(有诊断)或CCP(稳健性好)
┌─────────────────────────────────────────────────────────┐
│ Step 4: 实施经验与学习成本 │
└─────────────────────────────────────────────────────────┘
问题D1: 有实施这些方法的经验吗?
├─ 丰富经验
│ └─> 可选任何方法
│
├─ 有基本经验
│ └─> CCP、GMM、SMM更安全
│
└─ 没有经验
└─> GMM最好入门(最多教程和软件包)
END
|
3.2 具体场景与推荐方法
场景 1:发表一篇标准的结构估计论文
特征:
- 需要尽可能高的效率
- 需要经过充分验证的方法
- 计算资源有限
推荐方案:
首选: CCP 方法
替选:
- GMM(如果有好的矩条件)
- NFXP(如果模型简单且有充足计算资源)
不推荐:
场景 2:高维复杂模型(多个状态变量)
特征:
- 状态维度 d ≥ 3
- 参数维度 k ≥ 8
- NFXP 不可行
推荐方案:
首选: SMM 或 GMM(带合适的矩条件)
替选:
- 贝叶斯 CCP(如果采用)
- 间接推断(有好的辅助模型时)
具体子选择:
1
2
3
4
5
6
|
if 有好的矩条件可设计:
使用 GMM
else if 存在容易拟合的辅助模型:
使用 间接推断
else:
使用 SMM(虚拟数据的矩)
|
场景 3:小样本研究(n < 500)
特征:
推荐方案:
首选: 贝叶斯 CCP + 合理的先验
- 先验可稳定估计
- 样本虽小但有补充
- 完整的后验分布直观
替选:
- CCP + 稳健标准误调整
- GMM + 稳健性考虑
不推荐:
- NFXP(高偏差和高方差)
- 贝叶斯 NFXP(除非有很强的先验)
场景 4:需要模型诊断和检验
特征:
- 不确信模型 specification
- 需要统计检验
- 可能多个竞争模型
推荐方案:
首选: GMM + J 检验
- 自动的过度识别检验
- 可诊断模型误设
- 建立在统计理论基础上
替选:
- 贝叶斯方法 + 后验预测检验
- CCP + 非参数诊断
具体指导:
1
2
3
4
5
6
7
|
Step 1: 用GMM估计所有参数
Step 2: 检查J统计量,p值
if p < 0.05:
模型可能误设,需修改
else:
模型与数据一致
Step 3: 如果用多个矩条件集合,比较结果稳健性
|
场景 5:需要反事实分析和决策
特征:
- 目标是政策模拟
- 需要参数的完整分布
- 需要预测不确定性量化
推荐方案:
首选: 贝叶斯方法(NFXP 或 CCP)
- 后验分布自然支持反事实
- 可直接计算后验预测分布
- 决策理论框架
替选:
- 频率派方法 + bootstrap
- SMM(可直接模拟)
实施步骤:
1
2
3
4
|
Step 1: 获取后验样本 {θ^(s)}
Step 2: 对每个θ^(s),求解修改后的DP,得到新的最优政策
Step 3: 根据新政策模拟虚拟数据
Step 4: 计算政策改变的影响(后验均值±标准差)
|
场景 6:第一次做结构估计(学生或新手)
特征:
推荐方案:
首选: GMM
- 最多教程
- 理论简洁
- R/Python 中有好的包(gmm, plm 等)
- 易于理解
学习路径:
1
2
3
4
5
6
7
8
9
|
Step 1: 学习GMM基础
推荐书:Cameron & Trivedi (2005) Ch.6
Step 2: 实施简单的GMM估计
开源例子很多
Step 3: 学习动态模型中的GMM(如Arellano-Bond)
Step 4: 逐渐升级到CCP或SMM
|
场景 7:计算资源和时间都很充足
特征:
- 有高性能计算集群
- 时间允许(数天甚至数周)
- 想要最好的统计质量
推荐方案:
首选: 组合方法
- 先用 CCP 快速得到初值
- 用 NFXP 精化估计(从好初值开始,收敛快)
- 用贝叶斯方法评估不确定性
或: 贝叶斯 NFXP
3.3 多标准决策矩阵(简化版)
为了帮助快速决策,这里提供一个综合得分矩阵。
对每个标准给出权重,然后计算加权得分。
标准权重示例(可根据具体项目调整):
1
2
3
4
5
6
|
w_速度 = 0.2 (计算时间重要程度)
w_精度 = 0.25 (渐近效率)
w_稳健 = 0.15 (对模型误设的稳健性)
w_诊断 = 0.15 (模型检验能力)
w_易用 = 0.15 (实施和学习的难度)
w_维数 = 0.1 (处理高维的能力)
|
为你的项目评分:
对每个方法,在每个维度上评分(1-5 分,5 分最好):
| 方法 |
速度 |
精度 |
稳健 |
诊断 |
易用 |
维数 |
加权总分 |
| NFXP |
1 |
5 |
2 |
1 |
2 |
2 |
2.35 |
| CCP |
5 |
4 |
4 |
3 |
3 |
4 |
3.85 |
| GMM |
5 |
3 |
5 |
5 |
5 |
3 |
4.15 |
| SMM |
3 |
3 |
3 |
3 |
2 |
5 |
3.25 |
| 间接 |
4 |
2 |
3 |
2 |
3 |
4 |
3.10 |
| 贝叶斯 NFXP |
1 |
4 |
2 |
4 |
1 |
2 |
2.25 |
| 贝叶斯 CCP |
4 |
4 |
4 |
4 |
3 |
4 |
3.95 |
解读:
- 加权总分最高的是GMM(4.15)
- 其次是贝叶斯 CCP(3.95)和CCP(3.85)
- 这反映了:GMM 在多数场景下最平衡
第四部分:具体方法指南与案例
4.1 各方法的详细实施步骤
方法 A:CCP 方法的详细步骤
第一阶段:非参数估计 CCP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
# 步骤1:数据准备
# 输入:观测数据 {(x_it, d_it), i=1,...,n, t=1,...,T}
# 输出:P̂(x)
# 步骤2:离散化状态空间(如果连续)
# 将状态x分组到K个bin
# 步骤3:计算经验CCP
for each state bin k:
n_k = 总观测数(state in bin k)
d_k = 该bin中d=1的观测数
P̂(x_k) = d_k / n_k
# 步骤4:光滑(可选)
# 用核方法或局部多项式光滑P̂
return P̂(·)
|
第二阶段:参数反演
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
# 步骤1:设定目标函数
def objective(theta, P_hat):
# 从固定的P̂和参数θ,反演结构参数
# 使用Hotz-Miller映射:
# u(d,x) - v(x) = log(P̂/(1-P̂)) + conditional expectation term
# 最小化:Σ_it [u(d_it,x_it) - u(1-d_it,x_it) - predicted log odds]
return loss
# 步骤2:优化
theta_hat = minimize(objective, theta_init, args=(P_hat,))
return theta_hat
|
伪代码的完整版本:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
|
class CCPEstimator:
def __init__(self, data, state_bins=20):
self.data = data
self.state_bins = state_bins
def estimate_ccp_nonparametric(self):
"""第一阶段:非参数CCP估计"""
# 离散化状态
state_grid = np.linspace(self.data['x'].min(),
self.data['x'].max(),
self.state_bins)
# 分配每个观测到最近的状态bin
state_indices = np.digitize(self.data['x'], state_grid)
# 计算经验CCP
P_hat = {}
for k in range(self.state_bins):
mask = (state_indices == k)
if mask.sum() > 0:
P_hat[k] = self.data['d'][mask].mean()
else:
P_hat[k] = np.nan
# 光滑(处理NaN)
P_hat_smooth = self.smooth_ccp(P_hat)
self.P_hat = P_hat_smooth
self.state_grid = state_grid
return P_hat_smooth
def smooth_ccp(self, P_hat):
"""用局部多项式光滑"""
from scipy.interpolate import UnivariateSpline
indices = [k for k, v in P_hat.items() if not np.isnan(v)]
x = np.array([self.state_grid[k] for k in indices])
y = np.array([P_hat[k] for k in indices])
spline = UnivariateSpline(x, y, s=0.01)
return spline
def likelihood(self, theta):
"""使用固定的P̂计算对数似然"""
ll = 0
for i in range(len(self.data)):
x = self.data['x'][i]
d = self.data['d'][i]
# P̂(x)的值(用插值)
p = self.P_hat(x)
# 对数似然
ll += d * np.log(p + 1e-10) + (1-d) * np.log(1-p + 1e-10)
return ll
def estimate_parameters(self, theta_init):
"""第二阶段:参数反演"""
def objective(theta):
return -self.likelihood(theta)
result = minimize(objective, theta_init, method='BFGS')
self.theta_hat = result.x
return result.x
# 使用示例
estimator = CCPEstimator(data, state_bins=25)
P_hat = estimator.estimate_ccp_nonparametric()
theta_hat = estimator.estimate_parameters(theta_init=[15, 0.99])
|
方法 B:GMM 方法的详细步骤
第一步:设计矩条件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
矩条件的来源:
1. 一阶条件(Euler equation):
E[∂log L/∂θ] = 0
2. 模型预测的统计量:
E[m(Z,θ)] = 0
3. 过度识别条件(如果矩数 > 参数数)
例子(Rust汽车维修):
m₁(θ) = E[d_t - P_θ(x_t)] (CCP匹配)
m₂(θ) = E[x_{t+1} - E_θ[x_{t+1}|x_t,d_t]] (状态转移)
m₃(θ) = E[d_t × x_t] - E_θ[d_t × x_t] (交互项)
|
第二步:实施 GMM
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
|
class GMMEstimator:
def __init__(self, data, moment_functions):
self.data = data
self.moment_functions = moment_functions # list of functions
def compute_moments(self, theta):
"""计算样本矩"""
m = []
for moment_fn in self.moment_functions:
# 对每个观测计算矩条件
moment_values = [moment_fn(self.data[i], theta)
for i in range(len(self.data))]
# 取平均
m.append(np.mean(moment_values))
return np.array(m)
def compute_moment_variance(self, theta):
"""计算矩条件的方差"""
m_mat = []
for i in range(len(self.data)):
row = [moment_fn(self.data[i], theta)
for moment_fn in self.moment_functions]
m_mat.append(row)
m_mat = np.array(m_mat)
# 样本协方差
S = np.cov(m_mat.T)
return S
def gmm_objective(self, theta, W):
"""GMM目标函数"""
m = self.compute_moments(theta)
return m.T @ W @ m
def estimate(self, theta_init, two_step=True):
"""两步GMM估计"""
# 第一步:用单位矩阵作权重
W1 = np.eye(len(self.moment_functions))
result1 = minimize(lambda t: self.gmm_objective(t, W1),
theta_init, method='BFGS')
theta1 = result1.x
if two_step:
# 计算最优权重(协方差矩阵的逆)
S = self.compute_moment_variance(theta1)
W2 = np.linalg.inv(S)
# 第二步:用最优权重重新估计
result2 = minimize(lambda t: self.gmm_objective(t, W2),
theta1, method='BFGS')
theta_hat = result2.x
J_stat = len(self.data) * self.gmm_objective(theta_hat, W2)
return theta_hat, J_stat
else:
theta_hat = theta1
J_stat = len(self.data) * result1.fun
return theta_hat, J_stat
def J_test(self, theta_hat):
"""过度识别检验"""
from scipy.stats import chi2
# ... (计算J统计量)
p_value = 1 - chi2.cdf(J_stat, df=len(self.moment_functions) - len(theta_hat))
return J_stat, p_value
# 使用示例
def moment_1(obs, theta):
"""CCP匹配矩"""
x, d = obs
P_theta_x = logistic(theta[0] + theta[1] * x)
return d - P_theta_x
def moment_2(obs, theta):
"""状态转移矩"""
x, d, x_next = obs
expected_x = 10 + 0.5 * x + 5 * d # 某个转移模式
return x_next - expected_x
estimator = GMMEstimator(data, moment_functions=[moment_1, moment_2])
theta_hat, J = estimator.estimate(theta_init=[0, 0.1])
J_stat, p_value = estimator.J_test(theta_hat)
print(f"参数估计:{theta_hat}")
print(f"J统计量:{J_stat:.4f}")
print(f"p值:{p_value:.4f}")
|
方法 C:贝叶斯 CCP 的详细步骤
步骤 1:数据与先验准备
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
|
import pymc as pm
import arviz as az
class BayesianCCPEstimator:
def __init__(self, data, priors):
self.data = data
self.priors = priors # dict of prior specifications
# 第一步:估计经验CCP(与CCP方法相同)
self.P_hat = self.estimate_ccp_nonparametric()
def estimate_ccp_nonparametric(self):
"""非参数CCP估计"""
# (与CCP方法相同的实现)
...
return P_hat_func
def build_model(self):
"""构建PyMC模型"""
with pm.Model() as model:
# 先验定义
theta_rc = pm.Gamma('theta_rc',
alpha=self.priors['rc_alpha'],
beta=self.priors['rc_beta'])
theta_cost = pm.Normal('theta_cost',
mu=self.priors['cost_mu'],
sigma=self.priors['cost_sigma'])
beta = pm.Beta('beta',
alpha=self.priors['beta_alpha'],
beta=self.priors['beta_beta'])
# 似然(使用固定的P̂)
d_pred = self.compute_likelihood(theta_rc, theta_cost, beta)
d_obs = pm.Bernoulli('d_obs', p=d_pred,
observed=self.data['d'])
return model
def compute_likelihood(self, theta_rc, theta_cost, beta):
"""
计算预测的选择概率
使用固定的P̂
"""
# 这里连接P̂和参数
# (取决于具体的反演关系)
...
return p_pred
def sample(self, n_samples=2000, burn_in=1000):
"""MCMC抽样"""
model = self.build_model()
with model:
trace = pm.sample(n_samples, tune=burn_in,
return_inferencedata=True,
cores=4)
self.trace = trace
return trace
def posterior_summary(self):
"""后验统计"""
return az.summary(self.trace)
def plot_diagnostics(self):
"""诊断图"""
az.plot_trace(self.trace)
az.plot_forest(self.trace)
# 使用示例
priors = {
'rc_alpha': 4, # Gamma(4, 0.2) for RC
'rc_beta': 0.2,
'cost_mu': 0,
'cost_sigma': 0.5,
'beta_alpha': 10, # Beta(10, 2) for discount factor
'beta_beta': 2
}
estimator = BayesianCCPEstimator(data, priors)
trace = estimator.sample(n_samples=4000, burn_in=1000)
summary = estimator.posterior_summary()
estimator.plot_diagnostics()
|
4.2 实际应用案例分析
案例 1:Rust(1987)汽车维修模型
模型特征:
- 参数:k = 2(替换成本、折现因子)
- 状态:d = 1(汽车里程)
- 样本:n = 5000(汽车-年份观测)
- 数据类型:被观察的里程和替换决策
各方法的应用:
| 方法 |
适用性 |
预期结果 |
计算时间 |
| NFXP |
⭐⭐⭐⭐⭐ 完全适用 |
最有效的估计 |
30-60 分钟 |
| CCP |
⭐⭐⭐⭐⭐ 最推荐 |
接近 NFXP,快很多 |
2-5 分钟 |
| GMM |
⭐⭐⭐⭐ 很好 |
可靠,有诊断 |
1-2 分钟 |
| SMM |
⭐⭐⭐ 可以 |
点估计很好 |
10-30 分钟 |
| 间接推断 |
⭐⭐⭐ 可以 |
如果有好的辅助模型 |
5-15 分钟 |
| 贝叶斯 CCP |
⭐⭐⭐⭐ 很好 |
完整后验 |
10-20 分钟(MCMC) |
推荐方案:
最简单的方案(快速结果):
1
2
3
4
5
6
|
用GMM:
矩条件1:E[d_t - logistic(θ_rc + θ_β × x_t)] = 0
矩条件2:E[Δx_{t+1} - E[Δx|x_t, d_t]] = 0
结果:θ̂_rc ≈ 7.9, θ̂_β ≈ 0.995
计算时间:< 5分钟
|
最佳方案(平衡效率和质量):
1
2
3
4
5
6
7
8
9
10
11
12
13
|
Step 1: 用CCP快速估计(初值)
结果:θ̂ ≈ [7.9, 0.9945]
时间:2分钟
Step 2: 用NFXP从CCP初值精化
结果:θ̂ ≈ [7.88, 0.9950]
时间:20分钟(从好初值收敛快)
Step 3: 用bootstrap计算标准误
结果:SE ≈ [1.5, 0.002]
时间:30分钟
总计:~50分钟,获得最优估计和信度
|
完整贝叶斯方案(最多信息):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
用贝叶斯CCP:
先验:
RC ~ Gamma(4, 0.2) (均值20)
β ~ Beta(10, 2) (均值0.833)
MCMC:4000迭代 + 1000 burn-in
结果:
RC: 7.85 ± 1.7 [95% CI: 4.8, 11.2]
β: 0.9948 ± 0.002 [95% CI: 0.991, 0.999]
计算时间:15分钟
优势:
- 完整的后验分布
- 95%可信区间直接给出
- 可用于后验预测和政策模拟
|
案例 2:多个企业的设备替换决策
模型特征:
- 参数:k = 5(三个成本参数、折现因子、固定效应)
- 状态:d = 2(主设备年龄、辅助设备年龄)
- 样本:n = 500(企业-年份)
- 数据类型:设备年龄和替换决策,有企业异质性
为什么某些方法不可行:
| 方法 |
为什么有问题 |
解决方案 |
| NFXP |
k=5 太多参数,d=2 状态空间太大 |
放弃 |
| CCP |
样本 n=500 有点少,非参 CCP 估计不精 |
可以用,但需谨慎 |
| GMM |
很好!二维状态可以用 |
✓ 推荐 |
| SMM |
虚拟数据生成容易 |
✓ 推荐 |
| 间接推断 |
可以,如果有好的辅助模型 |
✓ 可考虑 |
最推荐方案:GMM
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
# 步骤1:设计矩条件(5个条件匹配5个参数)
def moment_ccp_1(obs, theta):
"""CCP条件1:关于主设备的替换决策"""
age1, age2, d_replace1 = obs
P = logistic(theta[0] + theta[1] * age1 + theta[2] * age2)
return d_replace1 - P
def moment_ccp_2(obs, theta):
"""CCP条件2:关于辅助设备的替换决策"""
age1, age2, d_replace2 = obs
P = logistic(theta[3] + theta[2] * age1 + theta[4] * age2)
return d_replace2 - P
def moment_state_transition(obs, theta):
"""状态转移条件:年龄增长的预期"""
age1, age2, d1, d2, age1_next, age2_next = obs
expected_age1_next = age1 + 1 + (1 - d1) * depreciation_param
return age1_next - expected_age1_next
# 步骤2:GMM估计
estimator = GMMEstimator(data, moment_functions=[
moment_ccp_1, moment_ccp_2, moment_state_transition, ...
])
theta_hat, J = estimator.estimate(theta_init=[1, 0.05, -0.02, 0.5, 0.03])
# 步骤3:诊断
print(f"J统计量: {J:.4f}")
print(f"p值: {p_value:.4f}")
if p_value > 0.05:
print("模型与数据一致 ✓")
else:
print("模型可能误设 ✗")
|
替选方案:SMM
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
# 当矩条件难以设计时
from scipy.optimize import minimize
def simulate_data(theta, n_sim=1000):
"""模拟虚拟数据"""
# ...
return simulated_y
def compute_moments_real(data):
"""真实数据的矩"""
return {
'mean_d': data['d'].mean(),
'var_d': data['d'].var(),
'corr_age_decision': correlation(data['age'], data['d']),
# ... 更多矩
}
def smm_objective(theta, data):
"""SMM目标函数"""
# 虚拟数据的矩
sim_y = simulate_data(theta)
m_sim = compute_moments(sim_y)
# 真实数据的矩
m_real = compute_moments_real(data)
# 距离
diff = np.array(list(m_sim.values())) - np.array(list(m_real.values()))
return diff @ diff
# 估计
theta_hat = minimize(smm_objective, theta_init, args=(data,)).x
|
4.3 如何快速做出选择
如果你只有 5 分钟决定方法,使用这个快速清单:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
问1:样本量 > 5000?
是 → Q2
否 → Q4
问2:参数数 ≤ 5?
是 → CCP 或 NFXP(有充足计算资源时)
否 → Q3
问3:能设计好的矩条件?
是 → GMM
否 → SMM 或 间接推断
问4(小样本):有先验吗?
是 → 贝叶斯CCP
否 → CCP + 稳健标准误
问5(所有情况):需要模型诊断?
是 → GMM(J检验)
否 → 任何方法都可以
|
第五部分:易犯的错误与注意事项
5.1 各方法常见的实施错误
NFXP 的错误
错误 1:内层固定点未收敛
1
2
3
4
5
6
7
8
9
10
11
12
|
# ❌ 错误做法
while iter < max_iter:
V_new = max_d [π(d) + β*E_V]
if iter % 10 == 0 and iter > 10:
break # 不足以收敛!
# ✓ 正确做法
while True:
V_new = max_d [π(d) + β*E_V]
if ||V_new - V_old|| < 1e-8: # 严格的收敛标准
break
V_old = V_new
|
错误 2:忽略梯度的数值不稳定性
1
2
3
4
5
6
|
# ❌ 错误:直接求导
dL/dθ = numerical_gradient(likelihood, theta, eps=1e-6)
# ✓ 正确:自适应eps
eps = 1e-6 * (1 + |theta|)
dL/dθ = (likelihood(theta+eps) - likelihood(theta-eps)) / (2*eps)
|
CCP 的错误
错误 1:非参数 CCP 估计样本太少
1
2
3
4
5
6
7
8
9
10
|
# ❌ 错误做法
state_bins = 50 # 太多bins,每个bin样本少
P_hat = observed_frequency_in_bins
# 结果:很多bin的P̂ = 0 或 1,导致反演问题
# ✓ 正确做法
# 选择bin数使得每个bin平均有10-20个观测
optimal_bins = int(np.sqrt(n)) # 或用交叉验证
P_hat = smooth_kernal_or_localpolynomial(state, d)
|
错误 2:光滑过度或不足
1
2
3
4
5
6
7
8
9
|
# ❌ 过度光滑:P̂接近常数,无信息
P_hat = heavy_smoothing_kernel(state, d)
# ❌ 过度拟合:P̂有噪声,反演不稳定
P_hat = nearest_neighbor(state, d)
# ✓ 正确:交叉验证选择带宽
bandwidth = cross_validation_bandwidth(state, d)
P_hat = kernel_density(state, d, bandwidth)
|
GMM 的错误
错误 1:矩条件选择不当
1
2
3
4
5
6
7
|
# ❌ 选择的矩对参数不敏感
moment_1 = E[d] # 这是标量,无法识别所有参数
# ✓ 正确:选择有区分性的矩
moment_1 = E[d] # 识别平均替换率
moment_2 = E[d × x] # 识别成本对年龄的敏感性
moment_3 = E[d × x²] # 加强识别
|
错误 2:忽视权重矩阵的选择
1
2
3
4
5
6
7
8
9
10
11
12
13
|
# ❌ 错误:总是用单位矩阵
W = I
# ✓ 正确:
# 第一步:W = I,粗估θ
theta_1 = minimize(m'*I*m, ...)
# 第二步:计算最优权重
S = cov(moments)
W_opt = inv(S)
# 第三步:W = W_opt,精化估计
theta_2 = minimize(m'*W_opt*m, ...)
|
SMM 的错误
错误 1:虚拟数据样本太小
1
2
3
4
5
6
7
|
# ❌ 虚拟样本太小,矩估计有噪声
N_sim = 500, T = 10
# 导致m_sim(θ)非常不平滑,优化困难
# ✓ 虚拟样本足够大
N_sim = 10000, T = 50
# 或者固定随机种子使m_sim(θ)确定
|
错误 2:虚拟数据生成中的循环
1
2
3
4
5
6
7
8
9
|
# ❌ 错误的决策过程
d_t ~ Bernoulli(P_true) # 用真实分布
x_{t+1} ~ F_true | d_t # 用真实转移
# 这不对!应该用参数化的
# ✓ 正确的虚拟数据生成
d_t ~ Bernoulli(P_θ(x_t)) # 用模型的CCP
x_{t+1} ~ F_θ | x_t, d_t # 用参数化的转移
|
间接推断的错误
错误 1:辅助模型过于简单
1
2
3
4
5
|
# ❌ 辅助模型太简单,无法区分参数
aux_model: d ~ 常数 # 无法识别任何参数
# ✓ 辅助模型有充足复杂度
aux_model: logit(d) ~ α + β*x + γ*x²
|
错误 2:映射可逆性未检验
1
2
3
4
5
6
7
8
9
|
# ❌ 直接反演,假设映射可逆
beta_hat_grid = compute_beta_on_grid(theta_grid)
theta_hat = invert(beta_hat) # 可能无唯一解!
# ✓ 先检验可逆性
# 绘制β(θ)的曲线,看是否单调或可逆
plot_mapping(theta_grid, beta_hat_grid)
# 检查Jacobian的秩
rank_J = rank(jacobian_beta_wrt_theta)
|
贝叶斯的错误
错误 1:MCMC 未充分诊断
1
2
3
4
5
6
7
8
9
10
|
# ❌ 运行MCMC后直接用样本
for i in range(n_samples):
theta_i = theta_samples[i]
# ...
# ✓ 正确的诊断步骤
az.plot_trace(trace) # 检查trace图
az.summary(trace) # 检查Rhat和ESS
# 丢弃burn-in样本
post_samples = trace.posterior[burn_in:]
|
错误 2:先验选择不当
1
2
3
4
5
|
# ❌ 无信息先验导致问题
beta ~ Uniform(0, 1) # 在高维中这是很弱的信息!
# ✓ 弱信息先验
beta ~ Beta(10, 2) # 相对集中,但仍允许数据主导
|
5.2 诊断检查清单
使用任何方法前,进行这些检查:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
□ 数据质量检查
☐ 是否有异常值或数据输入错误?
☐ 样本量是否足够?
☐ 数据是否包含足够的变异?
□ 模型specification检查
☐ 模型假设是否清晰?
☐ 参数数与样本量的比例合理?
☐ 是否有识别问题?
□ 初值检查
☐ 初值是否在合理范围?
☐ 从多个初值开始是否得到相同结果?
□ 收敛检查
☐ 优化是否收敛(梯度接近零)?
☐ Hessian是否为负定(最大化)?
☐ 目标函数值是否合理?
□ 结果合理性检查
☐ 估计的参数在理论范围内?
☐ 符号和大小符合经济直觉?
☐ 与文献中的结果可比较?
□ 稳健性检查
☐ 结果对样本选择敏感吗?
☐ 删除某些观测后结果是否稳定?
☐ 对模型specification的微小改变敏感吗?
|
第六部分:快速参考与总结
6.1 方法选择的简化决策树(最终版)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
START
问题1:你对方法学有深入理解吗?
├─ 否 → 用GMM(最容易学习)
└─ 是 → 问题2
问题2:模型多复杂?
├─ 简单(k≤5, d≤1) → 问题3
├─ 中等(k≤10, d≤2) → 问题3
└─ 复杂(k>10 或 d>2) → 问题4
问题3:你有充足的计算资源吗?
├─ 是 → NFXP或CCP都可以
└─ 否 → CCP(最快)
问题4(复杂模型):能设计好矩条件吗?
├─ 能 → GMM
├─ 不能,但能想到辅助模型 → 间接推断
└─ 都不能 → SMM
END
|
6.2 方法的"黄金准则"
| 方法 |
黄金准则 |
何时用 |
何时避免 |
| NFXP |
“如果能用,就用” |
参数少且模型确信高 |
参数>10 或计算资源有限 |
| CCP |
“快速、稳健的选择” |
大多数标准应用 |
数据太少无法非参估计 CCP |
| GMM |
“灵活且有诊断” |
第一次做结构估计 |
无好的矩条件 |
| SMM |
“虚拟数据的魔法” |
复杂高维模型 |
模型简单(太浪费) |
| 间接推断 |
“简单映射反演” |
有好辅助模型时 |
映射不可逆 |
| 贝叶斯 NFXP |
“最完整的推断” |
计算充足且需完整分布 |
计算资源有限 |
| 贝叶斯 CCP |
“效率与完整的结合” |
需要贝叶斯推断但计算受限 |
非参 CCP 估计困难 |
6.3 一句话总结
1
2
3
4
5
6
|
NFXP: 最优但最慢 (Optimal but slowest)
CCP: 平衡的首选 (Balanced choice)
GMM: 诊断最好 (Best diagnostics)
SMM: 万能但贵 (Universal but expensive)
间接: 灵活但需好模型 (Flexible if good auxiliary model)
贝叶斯:最完整但最慢 (Most complete but slowest)
|
6.4 论文写作中方法选择的建议
如果你要发表论文:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
第一步:选择主要方法
推荐:CCP + 健壮性检查
或: NFXP(如果计算可行)
或: 贝叶斯CCP(如果要完整分布)
第二步:选择替选/对比方法
推荐:至少再用一个方法验证
例如:CCP主估计 + GMM对比 + 贝叶斯稳健性
第三步:诊断与报告
NFXP/CCP:报告标准误、初值敏感性
GMM:报告J检验、过度识别检验
贝叶斯:报告先验、MCMC诊断、敏感性分析
|