1. 课程导入与Bootstrap思想

在统计推断中,我们经常遇到一个尴尬的局面:手里只有一份样本,却想回答“如果我再抽一次样本,估计值会波动多大”这样的问题。传统参数方法依赖正态性、方差齐性等假设,一旦样本量小、分布偏斜或统计量复杂(如中位数、相关系数、R²),公式推导就变得困难甚至不可靠。Bootstrap(自助法)正是为解决这类问题而生的一种计算密集型重采样方法:它不要求我们假设总体分布的具体形式,而是把已有样本当作总体的“替身”,通过有放回地反复抽样,模拟出估计量的抽样分布,进而构造置信区间。

理解Bootstrap,关键要抓住一个反直觉但极其重要的思想:样本是总体的经验分布。当我们只有一份容量为 n 的样本时,最合理的做法是认为总体中每个观测值出现的概率约为 1/n。于是,从这份样本中有放回地抽取 n 个新观测,就相当于“从经验总体中再抽样”。每一次重采样得到的样本,其统计量(均值、中位数等)都会略有不同;重复 B 次(常见 B=1000 或 10000),我们就得到 B 个统计量,构成一个经验分布。这个分布的标准差就是标准误的Bootstrap估计,其分位数则可以直接用来构造百分位置信区间。

核心逻辑一句话:用“样本内重采样”替代“从总体重复抽样”,用“计算”替代“公式推导”,从而在弱假设下估计统计量的抽样波动。

为了把这一思想与后续章节的工具链对应起来,我们先看一张整体路线图。下图展示了从原始样本出发,经过重采样、统计量计算、分布汇总,最终落到置信区间的完整信号链,同时也标出了本课程后续要展开的关键环节。

原始样本 x₁, x₂, …, xₙ 经验分布 F̂ₙ 有放回抽样 B 次重采样 每次抽 n 个(可重复) 样本*₁, 样本*₂, …, 样本*_B B = 1000 ~ 10000 计算统计量 Bootstrap 分布 θ̂*₁, θ̂*₂, …, θ̂*_B 均值 / 中位数 / 回归系数 经验标准误 SE* 取分位数 置信区间 [θ̂*α/2, θ̂*1-α/2] 95% CI 本课程后续展开的关键环节 重采样机制:有放回、等概率、样本容量保持 n,理解“经验分布替代总体”的合理性 统计量选择:均值、中位数、比例、相关系数、回归系数等,不同统计量的Bootstrap表现差异 区间构造:百分位法、基本Bootstrap法、BCa校正,以及偏差与偏斜的修正逻辑 工具实现:R(boot包)、Python(numpy随机抽样)、Stata等,参数 B 与随机种子的设置

从图中可以看到,Bootstrap并不是一个孤立的技巧,而是一条从“样本”到“区间”的完整数据流。它的输入是原始样本和统计量函数,中间经过 B 次重采样与计算,输出是经验分布和置信区间。理解这条链路,后续学习百分位法、BCa法时就不会迷失在公式里,而是始终清楚每一步在做什么。

为什么Bootstrap能工作:一个直观的类比

设想你想知道“全国成年男性平均身高”的抽样误差,但只测量了 100 人。传统做法是假设身高服从正态分布,用 s/√n 估计标准误。Bootstrap 的做法则是:把这 100 人的身高写在小纸条上放进箱子,每次摸出一个记录后放回,摸 100 次得到一个“新样本”,算一次均值;重复 1000 次,得到 1000 个均值。这 1000 个均值的标准差,就近似于“如果真正重复抽样 1000 次”的标准差。其合理性来自大数定律与经验过程理论:当 n 足够大时,经验分布 F̂ₙ 依概率收敛于真实分布 F,因此从 F̂ₙ 重采样得到的统计量分布也收敛于真实抽样分布。这一结论对均值成立,对中位数、分位数等许多统计量也在温和条件下成立,这正是Bootstrap适用范围广的理论根基。

需要提醒的是,Bootstrap并非万能。对于极端值敏感的重尾分布、样本量过小(如 n<20)、统计量本身不光滑(如最大值、最小值),或者存在强序列相关的时间序列数据,朴素Bootstrap可能给出有偏甚至错误的区间。这些边界条件我们会在后续章节结合诊断方法逐一讨论,但一开始就建立“有假设、有适用边界”的意识,比盲目套用更重要。

课程任务路线与工具准备

本课程共 30 章,整体遵循“思想—机制—区间—诊断—实战”的递进路线。第 1 部分建立重采样直觉与抽样分布概念;第 2 部分深入百分位法、基本Bootstrap法与BCa法的构造细节,并比较其覆盖率的差异;第 3 部分处理偏差校正、样本量选择、B 的取值与随机种子等工程问题;第 4 部分通过均值、中位数、回归系数、AUC 等真实统计量案例完成端到端演练。每章都会给出可复现的代码片段与结果判读依据,而不是停留在概念层面。

工具方面,建议提前准备以下环境,后续示例将主要基于 R 与 Python 双语言呈现,读者可任选其一跟做:

  • R 环境:安装 R ≥ 4.2 与 RStudio,核心包为 boot(提供 boot()、boot.ci()),辅助包 ggplot2 用于绘制Bootstrap分布直方图。
  • Python 环境:Python ≥ 3.9,安装 numpy、pandas、scipy、matplotlib;重采样核心是 np.random.choice(data, size=n, replace=True)。
  • 数据与脚本:每章配套一份小规模示例数据(如 50~200 行的身高、收入或二分类结局数据),以及可独立运行的脚本,便于修改参数观察结果变化。

下面给出一个最小可运行示例,帮助你在进入后续章节前先“跑通一次”Bootstrap,建立手感。示例使用一组人为设定的 30 个观测值,计算均值的 95% 百分位置信区间,参数 B=2000,随机种子固定以保证可复现。注意:以下数值为教学示例,并非真实调查数据。

import numpy as np

# 教学示例数据:30 个观测值(非真实调查数据)
data = np.array([12.1, 11.8, 13.4, 12.9, 12.5, 11.2, 13.8, 12.0, 12.7, 13.1,
                 11.5, 12.3, 13.6, 12.2, 11.9, 12.8, 13.0, 11.7, 12.4, 13.3,
                 12.6, 11.4, 13.2, 12.1, 12.9, 11.6, 13.5, 12.0, 12.8, 13.1])

rng = np.random.default_rng(20240501)   # 固定随机种子
B = 2000
boot_means = np.empty(B)

for b in range(B):
    sample = rng.choice(data, size=len(data), replace=True)
    boot_means[b] = sample.mean()

se_boot = boot_means.std(ddof=1)
ci_low, ci_high = np.percentile(boot_means, [2.5, 97.5])

print(f"原始样本均值: {data.mean():.3f}")
print(f"Bootstrap 标准误: {se_boot:.3f}")
print(f"95% 百分位置信区间: [{ci_low:.3f}, {ci_high:.3f}]")

运行后你会得到三个关键输出:原始样本均值、Bootstrap 标准误、以及 95% 置信区间。判断结果是否合理,可以从两个角度观察:其一,Bootstrap 标准误应与传统公式 s/√n 的结果量级接近(在分布不太偏斜时);其二,置信区间应大致以样本均值居中,若明显偏移,往往提示分布偏斜或统计量本身有偏,这正是后续引入 BCa 校正的动机。建议你亲手修改 B 为 200、500、5000,观察区间端点与标准误的波动,体会“B 越大,结果越稳定,但计算成本越高”的权衡。

学习建议:本章不要求记住任何公式,重点是建立“样本即经验总体、重采样即模拟抽样”的直觉。后续每学一种区间构造方法,都回到本节的路线图,问自己三个问题:重采样怎么抽?统计量怎么算?区间端点取哪个分位数?这三个问题答清楚了,Bootstrap 就不会用错。