第 7 章 数值积分与近似方法

上一章讨论了如何通过优化寻找目标函数的最大值或最小值。本章转向另一类同样常见的计算问题:积分。在统计学中,积分并不只是数学分析里的练习题,而是期望、概率、边际似然、后验均值和预测分布的共同语言。

例如,在收入分布研究中,若 \(Y\) 表示家庭年收入,\(f(y)\) 是其概率密度函数,我们可能关心低收入比例

\[ P(Y<c)=\int_0^c f(y)\,dy, \]

也可能关心某个税收或补贴规则 \(g(Y)\) 的平均财政影响

\[ E\{g(Y)\}=\int_0^\infty g(y) f(y)\,dy. \]

这里 \(c\) 是低收入线,\(g(y)\) 是收入为 \(y\) 时对应的税额、补贴额或福利指标。只要分布稍微复杂,这些积分就未必有解析解。计算统计要回答的是:当积分不能手工算出时,怎样用可控误差的数值方法近似它?

7.1 积分在统计推断中的作用

\(X\) 是随机变量,概率密度为 \(f(x)\)。函数 \(g(X)\) 的期望为

\[ \mathbb{E}\{g(X)\}=\int g(x)f(x)\,dx. \]

其中,\(x\) 表示随机变量可能取到的值,\(f(x)\) 表示这些取值的相对可能性,\(g(x)\) 表示我们真正关心的统计量或经济指标。许多统计问题都可以写成这种形式:

  1. 分布函数 \(F(c)=P(X\leq c)=\int_{-\infty}^c f(x)\,dx\)
  2. 后验均值 \(E(\theta\mid y)=\int \theta p(\theta\mid y)\,d\theta\)
  3. 预测分布 \(p(\tilde y\mid y)=\int p(\tilde y\mid\theta)p(\theta\mid y)\,d\theta\)
  4. 边际似然 \(p(y)=\int p(y\mid\theta)p(\theta)\,d\theta\)

这些式子中的积分有时可以解析求解。例如正态分布、Beta–Binomial 模型、Normal–Normal 模型等有漂亮的闭式结果。但在多数实际模型中,积分需要借助数值方法、Monte Carlo 方法或近似方法完成。本章先介绍确定性的数值积分和 Laplace 近似,后面第 10 章会介绍 Monte Carlo 积分。

7.2 一维数值积分

一维积分最直观的想法是把积分区间切成许多小段,在每一段上用简单图形近似曲线下面积。以区间\([a,b]\) 上的积分为例:

\[ I=\int_a^b h(x)\,dx. \]

若把区间分成 \(m\) 个等长小区间,步长为 \(\Delta=(b-a)/m\),网格点为\(x_j=a+j\Delta\),梯形公式为

\[ I \approx \Delta\left\{ \frac{h(x_0)}{2}+\sum_{j=1}^{m-1}h(x_j)+\frac{h(x_m)}{2} \right\}. \]

这里 \(h(x)\) 是被积函数,\(m\) 是区间划分数量。\(m\) 越大,近似通常越精细,但计算量也越大。

下面用一个模拟的收入分布例子说明。假设家庭收入 \(Y\) 服从对数正态分布,即 \(\log Y\sim N(\mu,\sigma^2)\)。这不是某个真实数据来源,而是一个用于教学的模拟设定。

mu <- log(8)
sigma <- 0.6
poverty_line <- 4

d_income <- function(y) dlnorm(y, meanlog = mu, sdlog = sigma)

# 低收入比例:解析分布函数
p_exact <- plnorm(poverty_line, meanlog = mu, sdlog = sigma)

# 数值积分
p_integrate <- integrate(d_income, lower = 0, upper = poverty_line)$value

c(exact = p_exact, numerical = p_integrate)
#>     exact numerical 
#>     0.124     0.124

R 中的 integrate() 会自动调整积分网格,比手写固定网格更稳健。对本科阶段的计算统计而言,需要掌握两点:第一,积分在统计推断中经常出现;第二,当有可靠的标准函数时,应优先使用它,而不是盲目从零实现复杂数值积分。

如果要计算一个非线性政策函数的期望,也可以直接把函数写进被积函数中。下面假设收入低于4 万元的家庭获得补贴,补贴金额随收入线性递减:

\[ g(y)= \begin{cases} 2(1-y/4), & 0<y<4,\\ 0, & y\geq 4. \end{cases} \]

其中 \(g(y)\) 的单位可以理解为万元。

subsidy <- function(y) ifelse(y < poverty_line, 2 * (1 - y / poverty_line), 0)
cost <- integrate(function(y) subsidy(y) * d_income(y),
                  lower = 0, upper = Inf)$value
cost
#> [1] 0.05831

这个数值就是每户平均补贴支出的理论近似。实际调查中,\(f(y)\) 未必已知,后面我们会用 Monte Carlo和 Bootstrap 处理类似问题。

7.3 Laplace 近似的基本思想

许多统计积分具有如下形式:

\[ I=\int g(x)\,dx, \]

其中 \(g(x)>0\),并且大部分面积集中在某个峰值附近。Laplace 近似的思想是:如果 \(g(x)\) 在最大点\(x_0\) 附近最重要,那么可以只用 \(x_0\) 附近的二次近似来估计整个积分。

\[ h(x)=\log g(x). \]

如果 \(g(x)\)\(x_0\) 处取得最大值,那么 \(h(x)\) 也在 \(x_0\) 处取得最大值,并且\(h'(x_0)=0\)。在 \(x_0\) 附近做二阶泰勒展开:

\[ h(x)\approx h(x_0)+\frac{1}{2}h''(x_0)(x-x_0)^2. \]

由于 \(x_0\) 是局部最大点,通常有 \(h''(x_0)<0\)。于是

\[ \begin{aligned} \int g(x)\,dx &=\int \exp\{h(x)\}\,dx\\ &\approx \exp\{h(x_0)\} \int \exp\left\{\frac{1}{2}h''(x_0)(x-x_0)^2\right\}\,dx\\ &= \exp\{h(x_0)\}\sqrt{\frac{2\pi}{-h''(x_0)}}. \end{aligned} \]

这说明 Laplace 近似本质上是在峰值附近用一个正态形状近似 \(g(x)\)。其中 \(x_0\) 决定位置,\(-1/h''(x_0)\) 决定局部宽度。

一维 Laplace 近似

\(g(x)>0\)\(h(x)=\log g(x)\)。若 \(h(x)\) 在内部点 \(x_0\) 处达到最大值,并且\(h''(x_0)<0\),则

\[ \int g(x)\,dx \approx \exp\{h(x_0)\}\sqrt{\frac{2\pi}{-h''(x_0)}}. \]

计算步骤为:

  1. 写出 \(h(x)=\log g(x)\)
  2. 用优化算法求最大点 \(x_0\)
  3. 计算二阶导数 \(h''(x_0)\)
  4. 代入近似公式。

7.4 例:调查比例的后验积分

假设在一个模拟的消费意愿调查中,\(n=400\) 名受访者中有 \(x=126\) 人表示未来一年可能购买某类耐用品。令 \(\theta\) 表示总体购买意愿比例,采用 Beta 先验

\[ \theta\sim \operatorname{Beta}(a,b). \]

这里 \(a\)\(b\) 可以理解为先验中的“成功”和“失败”信息量。若观测到 \(x\) 个成功、\(n-x\) 个失败,则未归一化的后验密度为

\[ g(\theta)=\theta^{a+x-1}(1-\theta)^{b+n-x-1}, \quad 0<\theta<1. \]

归一化常数是积分

\[ \int_0^1 \theta^{a+x-1}(1-\theta)^{b+n-x-1}\,d\theta. \]

这个例子有解析解,因此适合用来检查 Laplace 近似。

n <- 400
x <- 126
a <- 2
b <- 8

a_post <- a + x
b_post <- b + n - x

h <- function(theta) {
  (a_post - 1) * log(theta) + (b_post - 1) * log(1 - theta)
}

h2 <- function(theta) {
  -(a_post - 1) / theta^2 - (b_post - 1) / (1 - theta)^2
}

theta_mode <- (a_post - 1) / (a_post + b_post - 2)
log_int_laplace <- h(theta_mode) + 0.5 * log(2 * pi) -
  0.5 * log(-h2(theta_mode))
log_int_exact <- lbeta(a_post, b_post)

c(mode = theta_mode,
  exact_mean = a_post / (a_post + b_post),
  laplace_log_integral = log_int_laplace,
  exact_log_integral = log_int_exact)
#>                 mode           exact_mean laplace_log_integral 
#>               0.3113               0.3122            -255.8643 
#>   exact_log_integral 
#>            -255.8660

在这个样本量下,Laplace 近似给出的归一化常数已经比较接近解析结果。需要注意的是,Laplace 近似使用的是峰值附近的信息,因此它对单峰、近似对称、样本量较大的后验分布更可靠。如果后验分布偏斜很强、峰值靠近边界,或者存在多个峰,近似误差可能较大。

7.5 多维情形与维数困难

如果参数是 \(d\) 维向量 \(\boldsymbol{\theta}\),Laplace 近似可以写成

\[ \int \exp\{h(\boldsymbol{\theta})\}\,d\boldsymbol{\theta} \approx \exp\{h(\hat{\boldsymbol{\theta}})\} (2\pi)^{d/2} |\mathbf{H}|^{-1/2}, \]

其中 \(\hat{\boldsymbol{\theta}}\)\(h(\boldsymbol{\theta})\) 的最大点,\(\mathbf{H}\)\(-h(\boldsymbol{\theta})\) 在最大点处的 Hessian 矩阵,也就是

\[ \mathbf{H} = -\left. \frac{\partial^2 h(\boldsymbol{\theta})} {\partial\boldsymbol{\theta}\partial\boldsymbol{\theta}^\top} \right|_{\boldsymbol{\theta}=\hat{\boldsymbol{\theta}}}. \]

矩阵 \(\mathbf{H}\) 描述最大点附近后验曲面的弯曲程度。若某个方向曲率大,说明该方向的不确定性小;若曲率小,说明该方向的不确定性大。这与第 6 章中 Hessian 在优化中的作用是一致的。

但多维积分也带来“维数困难”。如果每个维度使用 \(m\) 个网格点,\(d\) 维网格就需要 \(m^d\) 个点。例如,\(m=100\)\(d=5\) 时已经需要 \(10^{10}\) 个点,普通计算机难以承受。因此,高维积分通常不依赖朴素网格,而是使用 Laplace 近似、Monte Carlo、重要性抽样或 MCMC。

7.6 本章小结

本章介绍了统计计算中的积分问题。一维数值积分可以用网格、梯形公式或 R 中的 integrate() 近似;Laplace 近似则把积分主要贡献集中在峰值附近,用二次展开和正态形状近似积分。它在极大似然近似、贝叶斯后验近似和边际似然计算中都很有用。与此同时,本章也提醒我们:积分维度升高后,普通网格法很快不可行,这正是后续 Monte Carlo 和 MCMC 方法的重要动机。

7.7 练习

  1. \(Y\) 服从对数正态分布,改变 \(\mu\)\(\sigma\),用 integrate() 计算 \(P(Y<c)\),并解释参数变化对低收入比例的影响。
  2. 对函数 \(h(x)=-x^4/4+x^2/2\),画出 \(\exp\{h(x)\}\) 的图形,并讨论 Laplace 近似是否合适。
  3. 在 Beta–Binomial 例子中,把样本量从 40 增加到 4000,比较 Laplace 近似误差的变化。
  4. 思考为什么二维网格积分比一维积分困难得多。设每个维度取 1000 个点,二维和五维分别需要多少个函数值?