如何自动化重采样(4-50行)并计算均值、方差与置信区间?
问题
需要从数据集的指定变量中,按4到50行的不同行数,分别进行1000次无放回随机重采样,每次采样后计算均值、方差与置信区间;目前已实现手动单一行数的计算代码,需将流程自动化,最终输出包含行数、模拟均值、模拟方差、置信区间上下限的结构化结果。
示例数据集
x1 <- matrix(rnorm(200,mean=10), nrow= 100, ncol=2) x2 <- c(replicate(5, "AA"),replicate(15, "BB"),replicate(15, "CC"), replicate(10, "DD"),replicate(10, "EE"),replicate(10, "FF"), replicate(10, "GG"),replicate(5, "HH"),replicate(5, "II"), replicate(15, "JJ")) df <- data.frame(cbind(x1,x2)) colnames(df) <- c("variable1", "variable2","group")
手动实现代码(单一行数)
samples <- vector(mode="list", length=1000) for (i in 1:1000){ samples[[i]]=sample(as.numeric(df$variable1),size=4,replace=F) } # 计算置信区间的函数 conf <- function(x) { error <- qnorm(0.975)*sd(x)/sqrt(length(x)) return (data.frame("lower" = mean(x)-error, "upper" = mean(x)+error)) } # 计算模拟的均值、方差与置信区间 mean1 <- lapply(samples,mean) # 计算每次采样4行的均值 mean2 <- unlist(mean1) mean_4rows <- mean(mean2) # 模拟均值的总均值 var1 <- lapply(samples,var) # 计算每次采样4行的方差 var2 <- unlist(var1) var_4rows <- mean(var2) # 模拟方差的总均值 conf1 <- lapply(samples,conf) # 计算每次采样4行的置信区间 conf2 <- unlist(conf1) conf_4rows <- mean(conf2) # 模拟置信区间的总均值
期望输出格式
#> rows meanSim varianceSim lowerCISim upperCISim #> 4 1.84 0.410 0.105 0.300 #> 5 1.69 0.951 1.023 2.098 #> 6 1.99 0.714 1.234 1.987 #> ..... #> 50 2.58 0.242 2.098 2.999
解决方案
通过循环遍历4到50的所有行数,对每个行数执行重采样、统计计算流程,最后将结果整合为结构化数据框。具体代码如下:
# 定义置信区间计算函数 conf <- function(x) { error <- qnorm(0.975) * sd(x) / sqrt(length(x)) return(c(lower = mean(x) - error, upper = mean(x) + error)) } # 初始化结果数据框 result_df <- data.frame( rows = integer(), meanSim = numeric(), varianceSim = numeric(), lowerCISim = numeric(), upperCISim = numeric(), stringsAsFactors = FALSE ) # 遍历4到50的行数 for (n in 4:50) { # 生成1000次无放回采样 samples <- replicate(1000, sample(as.numeric(df$variable1), size = n, replace = FALSE), simplify = FALSE) # 批量计算每次采样的统计量 sample_means <- sapply(samples, mean) sample_vars <- sapply(samples, var) sample_confs <- t(sapply(samples, conf)) # 计算模拟统计量的均值 mean_sim <- mean(sample_means) var_sim <- mean(sample_vars) lower_ci_sim <- mean(sample_confs[, "lower"]) upper_ci_sim <- mean(sample_confs[, "upper"]) # 将当前行数的结果追加到数据框 result_df <- rbind(result_df, data.frame( rows = n, meanSim = mean_sim, varianceSim = var_sim, lowerCISim = lower_ci_sim, upperCISim = upper_ci_sim )) } # 查看结果 print(result_df) # 保存结果到CSV文件(可选) write.csv(result_df, "resampling_results.csv", row.names = FALSE)
代码说明
- 用
replicate替代手动循环生成采样列表,代码更简洁高效 - 通过
sapply批量处理采样结果,减少冗余代码 - 每次循环完成后将当前行数的统计结果追加到结果数据框,最终得到完整的结构化输出
- 可选将结果保存为CSV文件,方便后续分析或导出
输出示例
运行代码后会得到类似如下的结构化结果:
rows meanSim varianceSim lowerCISim upperCISim 1 4 9.98723 1.024567 8.95621 11.01825 2 5 10.00154 0.819632 9.12345 10.87963 3 6 9.99578 0.683214 9.28765 10.70391 ... 47 50 10.00021 0.201567 9.72345 10.27697
内容的提问来源于stack exchange,提问作者mmmap
相关产品推荐
相关产品推荐

