已分组受试者交叉设计的等组随机化实现(R语言)
解决交叉设计中剩余组排列均等分配的R方案
问题核心
你需要给每组20名受试者分配剩余3组的所有全排列,且每种排列的人数尽可能均等(20不能被6整除,所以部分排列多1人),而不是单个随机选组——原代码的问题在于只随机选单次试验的组,没法保证完整排列的均衡性。
实现思路
- 对每个初始组,生成剩余3组的所有6种全排列;
- 计算每种排列的重复次数,凑够20名受试者(20=6×3+2,所以2种排列各4人,4种各3人);
- 随机打乱排列后分配给该组受试者;
- 合并所有组的结果。
完整代码
# 安装并加载生成排列的gtools包 if (!require(gtools)) { install.packages("gtools") library(gtools) } # 按初始分组拆分数据 group_list <- split(crossover, crossover$Assigned.Arm.Index) # 逐个处理每个初始组 for (arm in names(group_list)) { current_group <- group_list[[arm]] n_subjects <- nrow(current_group) # 获取当前组之外的所有试验组 remaining_arms <- setdiff(1:4, as.integer(arm)) # 生成剩余组的所有全排列(共6种) permutations_df <- as.data.frame(permutations(n=3, r=3, v=remaining_arms)) colnames(permutations_df) <- c("Trial_2", "Trial_3", "Trial_4") # 计算每种排列的重复次数:基础次数+余数补充 base_count <- n_subjects %/% 6 extra_count <- n_subjects %% 6 # 生成重复后的排列:前extra_count种多1次 repeated_perms <- rbind( permutations_df[rep(1:extra_count, each=base_count+1), ], permutations_df[rep((extra_count+1):6, each=base_count), ] ) # 随机打乱排列,保证分配随机 repeated_perms <- repeated_perms[sample(nrow(repeated_perms)), ] # 把排列赋值给当前组的后续试验列 current_group[, c("Trial_2", "Trial_3", "Trial_4")] <- repeated_perms # 更新分组数据 group_list[[arm]] <- current_group } # 合并所有组回到原数据框 crossover <- do.call(rbind, group_list) rownames(crossover) <- NULL
代码解释
permutations(3,3, remaining_arms):生成剩余3组的所有6种排列,比如初始组1的话,就是2、3、4的所有顺序组合;- 重复次数计算:20除以6得3次基础重复,余2,所以前2种排列各多1次(共4次),刚好凑够20人;
sample(nrow(repeated_perms)):打乱排列顺序,避免固定顺序分配的偏差;- 拆分-处理-合并的逻辑:保证每个初始组独立处理,不互相干扰。
关于你提到的sample(rep(1:6,4), replace=FALSE)
这个代码的逻辑是把6种排列编号(1-6)每种重复4次,总共24个样本,再随机打乱——适合每组24人的情况,但你的每组是20人,所以需要调整重复次数(就是上面代码里的base_count和extra_count逻辑),直接用的话会多4个样本,不符合你的需求。
内容的提问来源于stack exchange,提问作者Elizabeth
相关产品推荐
相关产品推荐

