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

R语言分组重复抽样:求均值、方差及均值置信区间实现方案

解决方案

首先需要修正原始数据框的类型(cbind会将数值列转为字符型),然后通过自助抽样实现需求。以下是基于tidyverse的高效实现:

步骤1:加载依赖并修正数据

library(dplyr)
library(purrr)

# 修正数据类型:variable1被cbind转为字符,需转回数值
df$variable1 <- as.numeric(df$variable1)

步骤2:定义自助抽样统计函数

该函数针对单个分组的variable1向量,执行1000次有放回抽样(每次抽3行),然后计算抽样均值的均值、方差,以及95%置信区间:

bootstrap_stats <- function(x, n_samples = 1000, sample_size = 3) {
  # 生成1000次抽样的均值集合
  sample_means <- replicate(n_samples, mean(sample(x, size = sample_size, replace = TRUE)))
  
  # 计算目标统计量
  mean_of_means <- mean(sample_means)
  var_of_means <- var(sample_means)
  
  # 计算均值的95%置信区间(正态近似)
  z_score <- qnorm(0.975)
  ci_margin <- z_score * sqrt(var_of_means / n_samples)
  ci_lower <- mean_of_means - ci_margin
  ci_upper <- mean_of_means + ci_margin
  
  # 返回结构化结果
  tibble(
    mean_of_means = mean_of_means,
    var_of_means = var_of_means,
    ci_lower = ci_lower,
    ci_upper = ci_upper
  )
}

步骤3:分组执行并获取结果

final_result <- df %>%
  group_by(group) %>%
  reframe(bootstrap_stats(variable1))

# 查看结果
print(final_result)

原代码的问题分析

  1. 数据类型错误:cbind将数值矩阵与字符向量合并后,所有列都会转为字符型,导致后续计算报错,必须先将variable1转回数值。
  2. 抽样函数逻辑错误:
    • 原函数中x是variable1的向量,用nrow(x)会报错(向量没有行属性),应改为length(x)。
    • 循环未收集结果,每次循环仅生成单个方差的data.frame,最终仅返回最后一次循环的结果。
  3. dplyr语法错误:原调用中%>%被误写为%>,且do()已被弃用,推荐用reframe()结合自定义函数实现分组计算。
  4. 置信区间逻辑错误:原函数硬编码了df$variable1,且针对的是原始数据的置信区间,而非1000次抽样均值的置信区间。

Base R替代实现

如果不使用tidyverse,可以用基础R函数实现相同需求:

# 修正数据类型
df$variable1 <- as.numeric(df$variable1)

# 按group拆分数据
grouped_data <- split(df$variable1, df$group)

# 遍历每个分组计算统计量
group_stats <- lapply(grouped_data, function(x) {
  sample_means <- replicate(1000, mean(sample(x, 3, replace = TRUE)))
  mean_mean <- mean(sample_means)
  var_mean <- var(sample_means)
  z_score <- qnorm(0.975)
  ci_margin <- z_score * sqrt(var_mean / 1000)
  
  data.frame(
    mean_of_means = mean_mean,
    var_of_means = var_mean,
    ci_lower = mean_mean - ci_margin,
    ci_upper = mean_mean + ci_margin
  )
})

# 转换为统一数据框
final_result_base <- do.call(rbind, group_stats)
final_result_base$group <- rownames(final_result_base)
rownames(final_result_base) <- NULL

# 查看结果
print(final_result_base)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 15:13:20