如何用boot包实现基于聚类的自助抽样以计算中位数置信区间
基于聚类的自助抽样计算中位数95%置信区间
我有一个包含聚类来源观测值的data.frame,目标是获取某测量值中位数的95%置信区间。示例里有50个聚类,每个聚类提供2条观测值,共100条。现有代码把所有观测值当作独立个体做自助抽样,但我的数据中聚类内观测值并非独立,需要保留聚类内的相关性,因此适合用基于聚类的抽样,但不确定怎么用boot包实现。其中value是观测值,cluster_id是聚类标识,希望生成基于自助抽样的value中位数95%CI。
初始代码:
library("boot") val <- rnorm(n = 100, mean = 10, sd = 2) id <- rep(1:50, 2) dat <- data.frame("cluster_id" = id, "value" = val) stat_fun<- function(data, indices){ b <- data[indices, ] return(median(b$value)) } boot.ci(boot(data = dat, stat_fun, R = 1000), type = "bca")
更新
我考虑让boot函数对cluster_id而非整个data.frame dat进行抽样,再通过统计函数返回自助样本的中位数,请问这个方法是否正确?
更新后的代码:
library("boot") val <- rnorm(n = 100, mean = 10, sd = 2) id <- rep(1:50, 2) dat <- data.frame("cluster_id" = id, "value" = val) statistic_function <- function(cluster_id, indices) { cluster_sample <- dat[dat$cluster_id %in% cluster_id[indices],] median_value <- median(cluster_sample$value) return(median_value) bootstrap_results <- boot(data = dat$cluster_id, statistic_function, R = 1000) boot.ci(bootstrap_results, type = "bca", index = 1)
你的思路完全正确,基于聚类的自助抽样核心就是对聚类ID进行有放回抽样,而非对单个观测值抽样,这样能完整保留聚类内观测值的相关性。不过你的代码有两个细节需要修正:
- 直接用
dat$cluster_id作为抽样对象会包含重复的聚类ID(每个聚类出现2次),这会导致抽样概率偏差,应该先提取唯一的聚类ID集合作为抽样总体 - 统计函数的参数逻辑需要对应调整,确保抽样的是唯一聚类ID的子集
修正后的可运行代码如下:
library("boot") set.seed(123) # 设置随机种子,保证结果可重复 val <- rnorm(n = 100, mean = 10, sd = 2) id <- rep(1:50, 2) dat <- data.frame("cluster_id" = id, "value" = val) # 定义统计函数:输入唯一聚类ID和抽样索引,返回对应样本的中位数 statistic_function <- function(unique_clusters, indices) { # 获取抽样后的聚类ID sampled_clusters <- unique_clusters[indices] # 提取对应聚类的所有观测值 cluster_sample <- dat[dat$cluster_id %in% sampled_clusters, ] # 返回中位数 return(median(cluster_sample$value)) } # 对唯一聚类ID进行自助抽样,R为抽样次数 bootstrap_results <- boot( data = unique(dat$cluster_id), statistic = statistic_function, R = 1000 ) # 计算BCA类型的95%置信区间(适合中位数这类非正态统计量) boot.ci(bootstrap_results, type = "bca")
关键逻辑说明
- 抽样对象调整:用
unique(dat$cluster_id)获取50个不重复的聚类ID,作为自助抽样的总体,确保每个聚类被抽取的概率一致 - 抽样方式:
boot函数会对这50个ID进行有放回抽样,每次抽取50个ID(和原聚类数量相同),保证抽样后的样本结构与原数据匹配 - 统计量计算:根据抽样得到的聚类ID,提取原数据中对应聚类的所有观测值,再计算中位数,保留了聚类内的相关性
- 置信区间选择:BCA(偏置校正加速)置信区间是针对中位数这类非正态分布统计量的最优选择之一,比普通正态近似区间更准确
内容的提问来源于stack exchange,提问作者j1897
相关产品推荐
相关产品推荐

