You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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")

关键逻辑说明

  1. 抽样对象调整:用unique(dat$cluster_id)获取50个不重复的聚类ID,作为自助抽样的总体,确保每个聚类被抽取的概率一致
  2. 抽样方式:boot函数会对这50个ID进行有放回抽样,每次抽取50个ID(和原聚类数量相同),保证抽样后的样本结构与原数据匹配
  3. 统计量计算:根据抽样得到的聚类ID,提取原数据中对应聚类的所有观测值,再计算中位数,保留了聚类内的相关性
  4. 置信区间选择:BCA(偏置校正加速)置信区间是针对中位数这类非正态分布统计量的最优选择之一,比普通正态近似区间更准确

内容的提问来源于stack exchange,提问作者j1897

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 06:50:20