如何在R中对样本量100-200的场景执行1000次模拟?
解决方案
优化后的完整代码
library(tibble) library(dplyr) library(purrr) # 定义模拟函数(优化统计量计算逻辑,避免重复调用aggregate) simulation <- function(n){ id <- 1:n trt <- rbinom(n, 1, 0.2) x <- rnorm(n, 0, 1) data <- data.frame(id, trt, x) # 一次性按trt分组计算均值、标准差和样本量 stats <- data %>% group_by(trt) %>% summarize( mean_x = mean(x), sd_x = sd(x), n_x = n(), .groups = "drop" ) # 处理极端情况:某组样本量为0(trt全为0或全为1) if(nrow(stats) < 2){ return(tibble(d_con = NA_real_, z_con = NA_real_)) } # 提取两组统计量 Mean.1 <- stats$mean_x[stats$trt == 0] Mean.2 <- stats$mean_x[stats$trt == 1] s.1 <- stats$sd_x[stats$trt == 0] s.2 <- stats$sd_x[stats$trt == 1] n.1 <- stats$n_x[stats$trt == 0] n.2 <- stats$n_x[stats$trt == 1] # 计算SMD和z值 d_con <- (Mean.1 - Mean.2) / sqrt((s.1^2 + s.2^2)/2) z_con <- (Mean.1 - Mean.2) / sqrt(s.1^2/n.1 + s.2^2/n.2) tibble(d_con, z_con) } # 定义需覆盖的样本量范围 sample_sizes <- 100:200 # 遍历每个样本量,执行1000次模拟并计算均值 final_results <- map_dfr(sample_sizes, function(n){ # 批量生成1000次模拟结果 sim_results <- map_df(1:1000, ~simulation(n)) # 计算当前样本量下的均值(忽略极端情况的NA) tibble( sample_size = n, mean_d = mean(sim_results$d_con, na.rm = TRUE), mean_z = mean(sim_results$z_con, na.rm = TRUE) ) }) # 查看最终结果 print(final_results)
关键改进说明
- 简化统计计算:用
dplyr的分组汇总一次性计算均值、标准差和样本量,替代重复调用aggregate,代码更简洁高效。 - 异常防护:处理了
trt全为0或1的极端情况,避免因分组缺失导致的程序报错。 - 高效批量模拟:用
purrr::map_df替代循环拼接结果,大幅提升模拟数据生成效率;外层用map_dfr直接汇总所有样本量的结果,无需手动管理数据框拼接。
传统for循环写法(若偏好显式循环)
如果习惯用for循环实现外层遍历,可替换为以下代码:
# 初始化空结果数据框 final_results <- tibble( sample_size = integer(), mean_d = numeric(), mean_z = numeric() ) for(n in sample_sizes){ sim_results <- map_df(1:1000, ~simulation(n)) mean_d <- mean(sim_results$d_con, na.rm = TRUE) mean_z <- mean(sim_results$z_con, na.rm = TRUE) final_results <- bind_rows(final_results, tibble(sample_size = n, mean_d = mean_d, mean_z = mean_z)) }
内容的提问来源于stack exchange,提问作者Stella
相关产品推荐
相关产品推荐

