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

如何自动化重采样(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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 20:50:09