第 11 章 Bootstrap、Jackknife 与置换检验

10 章用模型生成随机样本来近似统计量的分布。本章讨论另一类常用方法:从已经观测到的数据中重采样。Bootstrap、Jackknife 和置换检验都属于重采样思想,它们特别适合用于解析标准误难以推导、统计量形式复杂或小样本检验不方便的情形。

经济统计中常见的收入中位数、贫困率、消费收入比、基尼系数和分组均值差等指标,往往不是简单线性统计量。重采样方法可以帮助我们用计算方式评估这些指标的不确定性。

11.1 非参数 Bootstrap

设观测样本为

\[ y_1,\ldots,y_n, \]

我们关心统计量

\[ \hat\theta=T(y_1,\ldots,y_n). \]

非参数 Bootstrap 把经验分布作为总体分布的近似:每次从原始样本中有放回抽取 \(n\) 个观测,得到一个Bootstrap 样本,再计算统计量。重复 \(B\) 次后,统计量的变动就近似反映了抽样误差。

非参数 Bootstrap

  1. 给定原始样本 \(y_1,\ldots,y_n\) 和统计量函数 \(T(\cdot)\)
  2. \(b=1,\ldots,B\):从原始样本中有放回抽取 \(n\) 个观测,得到 \(y_1^{\ast b},\ldots,y_n^{\ast b}\);计算 \(\hat\theta^{\ast b}=T(y_1^{\ast b},\ldots,y_n^{\ast b})\)
  3. \(\hat\theta^{\ast 1},\ldots,\hat\theta^{\ast B}\) 的标准差估计标准误,用分位数构造置信区间。

下面用模拟的家庭调查数据估计平均消费收入比:

\[ \theta=\frac{\bar C}{\bar Y}, \]

其中 \(\bar C\) 是平均消费,\(\bar Y\) 是平均收入。

set.seed(2026)
n <- 300
income <- rlnorm(n, meanlog = log(8), sdlog = 0.55)
consumption <- 1.2 + 0.62 * income + rnorm(n, sd = 1.5)
consumption <- pmax(consumption, 0.2)
dat <- data.frame(income = income, consumption = consumption)

ratio_stat <- function(d) mean(d$consumption) / mean(d$income)
theta_hat <- ratio_stat(dat)

B <- 1000
boot_theta <- numeric(B)
for (b in seq_len(B)) {
  id <- sample(seq_len(n), size = n, replace = TRUE)
  boot_theta[b] <- ratio_stat(dat[id, ])
}

c(estimate = theta_hat,
  boot_se = sd(boot_theta),
  quantile(boot_theta, c(0.025, 0.975)))
#> estimate  boot_se     2.5%    97.5% 
#> 0.759613 0.009878 0.741976 0.780993

这个例子中的置信区间是百分位数区间,直接使用 Bootstrap 统计量的 2.5% 和 97.5% 分位数。它不要求我们推导比率统计量的复杂方差公式。

11.2 参数 Bootstrap

非参数 Bootstrap 直接从经验分布抽样。参数 Bootstrap 则先拟合一个参数模型,再从拟合模型中生成新样本。例如,若假设计数变量服从 Poisson 分布,可以先估计 \(\lambda\),再从\(\operatorname{Poisson}(\hat\lambda)\) 中模拟新样本。

\(\hat\theta\) 是由原始数据估计出的参数,参数 Bootstrap 的基本过程为:

  1. 用原始数据拟合模型,得到 \(\hat\theta\)
  2. 从模型 \(p(y\mid\hat\theta)\) 中模拟新样本;
  3. 对每个模拟样本重新估计统计量;
  4. 用重复结果评估标准误或置信区间。

参数 Bootstrap 依赖模型假设。如果模型设定合理,它可能比非参数 Bootstrap 更有效;如果模型明显错误,则会把错误假设带入不确定性评估。

set.seed(1)
y <- rpois(200, lambda = 3.2)
lambda_hat <- mean(y)

B <- 1000
lambda_boot <- numeric(B)
for (b in seq_len(B)) {
  y_star <- rpois(length(y), lambda = lambda_hat)
  lambda_boot[b] <- mean(y_star)
}

c(lambda_hat = lambda_hat,
  param_boot_se = sd(lambda_boot),
  formula_se = sqrt(lambda_hat / length(y)))
#>    lambda_hat param_boot_se    formula_se 
#>        3.2950        0.1265        0.1284

11.3 Jackknife

Jackknife 是一种更早的重采样方法。它每次删除一个观测,计算统计量的留一估计:

\[ \hat\theta_{(-i)}=T(y_1,\ldots,y_{i-1},y_{i+1},\ldots,y_n). \]

Jackknife 偏差估计为

\[ \widehat{\operatorname{bias}}_{\text{jack}} =(n-1)(\bar\theta_{(\cdot)}-\hat\theta), \]

其中

\[ \bar\theta_{(\cdot)}=\frac{1}{n}\sum_{i=1}^n \hat\theta_{(-i)}. \]

Jackknife 标准误估计为

\[ \widehat{\operatorname{se}}_{\text{jack}} = \sqrt{ \frac{n-1}{n} \sum_{i=1}^n(\hat\theta_{(-i)}-\bar\theta_{(\cdot)})^2 }. \]

下面对平均收入计算 Jackknife 标准误。

y <- dat$income
n <- length(y)
theta_hat <- mean(y)

theta_leave_one <- numeric(n)
for (i in seq_len(n)) {
  theta_leave_one[i] <- mean(y[-i])
}

theta_bar <- mean(theta_leave_one)
jack_bias <- (n - 1) * (theta_bar - theta_hat)
jack_se <- sqrt((n - 1) / n * sum((theta_leave_one - theta_bar)^2))

c(mean = theta_hat,
  jack_bias = jack_bias,
  jack_se = jack_se,
  formula_se = sd(y) / sqrt(n))
#>       mean  jack_bias    jack_se formula_se 
#>     9.3877     0.0000     0.3029     0.3029

对于样本均值,Jackknife 标准误与通常公式一致。对于中位数、分位数等不够光滑的统计量,Jackknife可能不如 Bootstrap 稳定。

11.4 置换检验

置换检验常用于检验两组是否存在差异。其基本思想是:在原假设下,组别标签与结果变量没有关系,因此可以随机打乱组别标签,观察原始统计量在“无差异世界”中是否显得极端。

设两组均值差统计量为

\[ D=\bar Y_1-\bar Y_0. \]

置换检验重复打乱组别标签,得到 \(D^{\ast 1},\ldots,D^{\ast B}\),再计算

\[ p=\frac{1+\sum_{b=1}^B I(|D^{\ast b}|\geq |D|)}{B+1}. \]

这里加 1 是为了避免有限模拟下得到 0 的 p 值。

下面构造一个模拟政策评估例子。treated 表示是否处于政策试点地区,employment 表示就业状态。数据是模拟的,用于说明置换检验。

set.seed(2)
n0 <- 120
n1 <- 100
treated <- c(rep(0, n0), rep(1, n1))
employment <- c(rbinom(n0, 1, 0.66),
                rbinom(n1, 1, 0.74))

obs_diff <- mean(employment[treated == 1]) -
  mean(employment[treated == 0])

B <- 2000
perm_diff <- numeric(B)
for (b in seq_len(B)) {
  treated_perm <- sample(treated)
  perm_diff[b] <- mean(employment[treated_perm == 1]) -
    mean(employment[treated_perm == 0])
}

p_value <- (1 + sum(abs(perm_diff) >= abs(obs_diff))) / (B + 1)
c(observed_difference = obs_diff, p_value = p_value)
#> observed_difference             p_value 
#>             0.07833             0.23638

置换检验的优势是直观、少分布假设;限制是需要明确在原假设下哪些对象可以交换。若样本来自复杂抽样、分层设计或时间序列,不能简单打乱全部标签。

11.5 本章小结

Bootstrap 用有放回重采样近似统计量的抽样分布,适合标准误和置信区间计算;参数 Bootstrap 从拟合模型中模拟样本,效率和可靠性取决于模型设定;Jackknife 通过留一法评估偏差和标准误;置换检验通过打乱标签构造原假设下的参考分布。重采样方法的共同优点是把复杂推导转化为可执行计算,但它们仍然依赖独立性、代表性和交换性等统计假设。

11.6 练习

  1. 对模拟数据中的收入中位数构造 Bootstrap 置信区间,并与均值的区间宽度比较。
  2. 将 Bootstrap 重复次数从 200 增加到 5000,观察标准误估计是否更稳定。
  3. 对消费收入比使用 Jackknife,比较其标准误与 Bootstrap 标准误。
  4. 修改置换检验例子,使两组真实就业概率相同,观察 p 值分布。