R语言重复1000次模拟实验结果格式异常求助
问题原因分析
原代码的核心问题在于分组逻辑错误,以及后续汇总方式不当:
- 连续调用
group_by(arm) %>% group_by(n_exp)会覆盖前一个分组,导致无法按每个实验+每个干预组的维度统计康复人数和样本量; - 后续用
dplyr::summarise(X = list(x), N = list(n))会把所有1000次实验的结果合并成单个大列表,最终prop.test是一次性处理所有实验的数据,而非逐个实验计算置信区间,因此得到1行多列的错误结果。
修正后的代码
library(dplyr) library(tidyr) library(broom) set.seed(123) p_R <- 0.1 # 对照组真实康复概率 p_T <- 0.2 # 试验组真实康复概率 sample_size <- 100 # 每组患者数 n_rep <- 1000 # 重复实验次数 # 生成基础数据框 df_all_repeats <- data.frame( n_exp = rep(1:n_rep, each = 2*sample_size), arm = rep(c('R', 'T'), each = sample_size), patient_ID = rep(1:sample_size, n_rep) ) # 为每个实验生成康复状态数据 df_all_repeats <- df_all_repeats %>% group_by(n_exp) %>% mutate(recovery_status = c( sample(c(1,0), sample_size, replace = TRUE, prob = c(p_R, 1 - p_R)), sample(c(1,0), sample_size, replace = TRUE, prob = c(p_T, 1 - p_T)) )) %>% ungroup() # 取消分组避免后续干扰 # 逐个实验计算概率差值的置信区间 df_prop2 <- df_all_repeats %>% # 关键:按实验编号+干预组同时分组 group_by(n_exp, arm) %>% summarise( x = sum(recovery_status), # 康复人数 n = n(), # 样本量 .groups = "drop_last" # 只保留n_exp的分组 ) %>% # 每个实验下,将两组的x和n整理为列表 summarise( X = list(x), N = list(n), .groups = "drop" ) %>% rowwise() %>% # 对每个实验单独执行prop.test并整理结果 mutate(tst = list(tidy(prop.test(X, N, alternative = "two.sided")))) %>% unnest(tst) # 查看结果结构 str(df_prop2)
代码改动说明
- 修正分组逻辑:使用
group_by(n_exp, arm)同时按实验编号和干预组分组,确保每个实验的两组数据分别统计康复人数和样本量; - 调整分组保留策略:用
.groups = "drop_last"在汇总后只保留n_exp的分组,方便后续按实验整理两组数据; - 确保逐个实验计算:通过
rowwise()和list(tidy(prop.test(...)))实现每个实验单独执行检验,最终unnest(tst)会将每个实验的结果展开为一行,得到1000行7列的目标数据框。
内容的提问来源于stack exchange,提问作者OS_name
相关产品推荐
相关产品推荐

