如何在R语言boot函数中指定Bootstrap抽样的样本量
问题描述
我有一个包含20000条观测的数据集,希望每次从中抽取700条观测进行Bootstrap抽样、计算均值,重复执行1000次。我可自行编码实现该逻辑,但想使用boot库以利用其出色的绘图和置信区间(CI)功能。目前不清楚如何在boot函数中指定抽样的样本量(即ind向量的长度),以下是我尝试的boot库代码和手动实现代码,请问如何通过boot函数实现需求?
尝试的boot库代码
df <- seq(1, 20000, 1) meanfun <- function(data, ind) { return(mean(data[ind])) } library(boot) results <- boot(df, statistic=meanfun, R=10000)
手动实现代码
df <- seq(1, 20000, 1) # 含20000条观测的数据集 meanfun <- function(data) { return(mean(data)) } # 计算均值的函数 S <- numeric(1000) # 存储1000次抽样结果的向量 for (i in 1:1000) { one_sample <- sample(df, 700) # 抽取700条随机观测 print(one_sample) one_result <- meanfun(one_sample) # 计算该样本的均值 S[i] <- one_result # 存储结果 } S meanfun(S) # 计算1000次结果的平均值
解决方案
默认情况下,boot包的boot()函数会进行有放回的同规模抽样(即每次抽样样本量和原数据集一致),要实现固定抽取700条的Bootstrap,需要修改统计量函数,在函数内部手动完成抽样逻辑,而非直接使用传入的ind参数。
修改后的代码如下:
df <- seq(1, 20000, 1) # 重写统计量函数:内部完成700条的随机抽样 meanfun <- function(data, dummy) { # 从原数据中随机抽取700条(有放回,符合Bootstrap要求) sample_data <- sample(data, size = 700, replace = TRUE) return(mean(sample_data)) } library(boot) # R指定为1000次重复,dummy为占位参数,满足boot函数的参数要求 results <- boot(df, statistic = meanfun, R = 1000)
关键说明
- 原
boot()函数的ind参数是用于同规模抽样的索引,我们不需要它,因此用占位参数(如dummy)替代 - 在统计量函数内部用
sample(data, size=700, replace=TRUE)实现每次抽取700条的有放回抽样,符合Bootstrap核心逻辑 - 执行完成后,
results对象可直接使用boot包的配套工具:plot(results):绘制Bootstrap结果诊断图boot.ci(results):计算不同类型的置信区间
内容的提问来源于stack exchange,提问作者Jenna Grimshaw
相关产品推荐
相关产品推荐

