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

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)
代码改动说明
  1. 修正分组逻辑:使用group_by(n_exp, arm)同时按实验编号和干预组分组,确保每个实验的两组数据分别统计康复人数和样本量;
  2. 调整分组保留策略:用.groups = "drop_last"在汇总后只保留n_exp的分组,方便后续按实验整理两组数据;
  3. 确保逐个实验计算:通过rowwise()和list(tidy(prop.test(...)))实现每个实验单独执行检验,最终unnest(tst)会将每个实验的结果展开为一行,得到1000行7列的目标数据框。

内容的提问来源于stack exchange,提问作者OS_name

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 01:52:11