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)
原代码的问题分析
- 数据类型错误:
cbind将数值矩阵与字符向量合并后,所有列都会转为字符型,导致后续计算报错,必须先将variable1转回数值。 - 抽样函数逻辑错误:
- 原函数中
x是variable1的向量,用nrow(x)会报错(向量没有行属性),应改为length(x)。 - 循环未收集结果,每次循环仅生成单个方差的
data.frame,最终仅返回最后一次循环的结果。
- 原函数中
- dplyr语法错误:原调用中
%>%被误写为%>,且do()已被弃用,推荐用reframe()结合自定义函数实现分组计算。 - 置信区间逻辑错误:原函数硬编码了
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
相关产品推荐
相关产品推荐

