欢迎光临寒舍

结构方程估计方法选择全攻略

4238 字

当我们估计结构参数时,应该选择哪种估计方法呢?

动态离散选择模型估计方法的详细分析与对比


太长不看版

场景 首选方法 替选方法 避免
发表标准论文 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)

观察:

  1. 点估计几乎相同(都在 0.1-0.2 标准差范围内)
  2. NFXP 的标准误稍小(最有效)
  3. CCP 的标准误稍大(一阶段信息损失)
  4. SMM 和间接推断的标准误在中间
  5. 贝叶斯的标准误取决于先验强度

结论: 在大样本下,所有方法的效率差异不大(都是$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 方法

  • 计算快
  • 稳健性好
  • 易于诊断
  • 已有成熟软件

替选:

  1. GMM(如果有好的矩条件)
  2. NFXP(如果模型简单且有充足计算资源)

不推荐:

  • 贝叶斯 NFXP(太慢)
  • 间接推断(可信性较低)

场景 2:高维复杂模型(多个状态变量)

特征:

  • 状态维度 d ≥ 3
  • 参数维度 k ≥ 8
  • NFXP 不可行

推荐方案:

首选: SMM 或 GMM(带合适的矩条件)

  • 能处理高维
  • 相对快速
  • GMM 有诊断能力

替选:

  1. 贝叶斯 CCP(如果采用)
  2. 间接推断(有好的辅助模型时)

具体子选择:

1
2
3
4
5
6
if 有好的矩条件可设计:
    使用 GMM
else if 存在容易拟合的辅助模型:
    使用 间接推断
else:
    使用 SMM(虚拟数据的矩)

场景 3:小样本研究(n < 500)

特征:

  • 样本小
  • 需要稳健估计
  • 标准误偏大

推荐方案:

首选: 贝叶斯 CCP + 合理的先验

  • 先验可稳定估计
  • 样本虽小但有补充
  • 完整的后验分布直观

替选:

  1. CCP + 稳健标准误调整
  2. GMM + 稳健性考虑

不推荐:

  • NFXP(高偏差和高方差)
  • 贝叶斯 NFXP(除非有很强的先验)

场景 4:需要模型诊断和检验

特征:

  • 不确信模型 specification
  • 需要统计检验
  • 可能多个竞争模型

推荐方案:

首选: GMM + J 检验

  • 自动的过度识别检验
  • 可诊断模型误设
  • 建立在统计理论基础上

替选:

  1. 贝叶斯方法 + 后验预测检验
  2. 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)

  • 后验分布自然支持反事实
  • 可直接计算后验预测分布
  • 决策理论框架

替选:

  1. 频率派方法 + bootstrap
  2. 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:计算资源和时间都很充足

特征:

  • 有高性能计算集群
  • 时间允许(数天甚至数周)
  • 想要最好的统计质量

推荐方案:

首选: 组合方法

  1. 先用 CCP 快速得到初值
  2. 用 NFXP 精化估计(从好初值开始,收敛快)
  3. 用贝叶斯方法评估不确定性

或: 贝叶斯 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/ = numerical_gradient(likelihood, theta, eps=1e-6)

# ✓ 正确:自适应eps
eps = 1e-6 * (1 + |theta|)
dL/ = (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 × ]  # 加强识别

错误 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 + γ*

错误 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诊断、敏感性分析

使用 Hugo 构建
主题 StackJimmy 设计