R语言有放回自助抽样(bootstrapping)均值方差计算与可视化实现问题
问题1解答
R基础包没有直接计算bootstrap统计量的内置函数,CRAN官方推荐的boot包是该场景的标准实现。你提到的3.94是穷尽所有4^4=256种可能的有放回抽样得到的理想bootstrap方差,和随机抽样估计的结果会有微小误差,以下是验证和使用示例:
首先是全量bootstrap验证理论值的代码:
s <- c(2,4,9,12) n <- length(s) # 生成所有可能的4元素有放回抽样组合 all_boot <- expand.grid(rep(list(s), n)) # 计算每个bootstrap样本的均值 all_boot_mean <- apply(all_boot, 1, mean) # 计算bootstrap方差 print(var(all_boot_mean)) # 输出结果约为3.94,和参考值一致
boot包的标准使用示例:
# 未安装可先执行 install.packages("boot") library(boot) # 定义统计量计算函数,第一个参数为原始样本,第二个为bootstrap抽样的索引 boot_fun <- function(data, idx) { return(mean(data[idx])) } # 执行bootstrap,R参数设置为256时即为全量抽样,和上述手动计算结果一致 boot_res <- boot(data = s, statistic = boot_fun, R = 256) # 输出结果:原始样本均值、bootstrap方差 print(boot_res$t0) # 原始样本均值6.75 print(var(boot_res$t)) # 输出结果约为3.94
问题2解答
你之前的sample调用错误出在size参数,每次bootstrap抽样的样本量需要和原始样本量一致(即4),重复10000次该抽样即可得到你需要的样本集,完整实现代码如下(含CLT效果可视化):
s <- c(2,4,9,12) n_sim <- 10000 n <- length(s) # 批量生成10000个长度为4的有放回抽样样本 boot_samples <- replicate(n_sim, sample(s, size = n, replace = TRUE)) # 计算每个样本的均值、方差 boot_means <- apply(boot_samples, 2, mean) boot_vars <- apply(boot_samples, 2, var) # 绘制分布图观测CLT效果 par(mfrow = c(1,2)) hist(boot_means, breaks = 30, col = "lightblue", main = "Bootstrap均值分布", xlab = "均值") abline(v = mean(s), col = "red", lwd = 2) # 原始样本均值参考线 hist(boot_vars, breaks = 30, col = "lightgreen", main = "Bootstrap方差分布", xlab = "方差") abline(v = var(s), col = "red", lwd = 2) # 原始样本方差参考线
运行代码后你会看到bootstrap均值分布近似正态,符合中心极限定理的预期,且var(boot_means)的计算结果会非常接近3.94的理论值。
bootstrap概念巩固建议
- 核心逻辑是用样本本身作为总体做抽样推断,不需要预先假设总体分布,这是bootstrap最核心的优势
- 每次bootstrap抽样的样本量必须和原始样本量一致,这是新手最常踩的坑
- 你提到的分母为
n^n-1是穷尽所有可能bootstrap样本的理想方差计算方式,实际使用中不需要穷尽所有组合,只要做足够多次(通常1000次以上)随机抽样,得到的方差估计值就足够准确 - 注意区分两个方差的概念:你计算的
var(s)=20.9167是原始样本的单观测方差,而bootstrap方差是你关心的统计量(本次为均值)的抽样方差,二者属于完全不同的统计量,不要混淆。
内容的提问来源于stack exchange,提问作者LoveMYMAth
相关产品推荐
相关产品推荐

