如何在R中实现患者单腿均衡随机抽样(最多偏差1)
按患者分层且腿数均衡的随机抽样方案
需求说明
现有N名患者,每名患者对应两条腿(0代表左腿,1代表右腿),需要为每位患者随机抽取一条腿,同时要求最终样本中左腿(0)和右腿(1)的数量尽可能均衡:
- 当N为偶数时,0和1的数量完全相等(各N/2条)
- 当N为奇数时,两类腿的数量最多相差1条
原代码的问题
原代码对每位患者独立随机抽取腿,结果是完全随机的,无法保证腿数的均衡性,会出现像测试案例中4条0、2条1的不均衡情况。
解决方案代码
library(janitor) # 构造测试数据(6名患者,可替换为实际数据集) df <- data.frame( x = rep(1:6, each = 2), # x为患者ID y = rep(c(0, 1), times = 6) # y为腿的标识(0=左腿,1=右腿) ) # 核心抽样逻辑 total_patients <- length(unique(df$x)) # 计算需要抽取的0和1的数量 count_0 <- floor(total_patients / 2) count_1 <- total_patients - count_0 # 随机选取对应数量的患者分配腿类型 set.seed(123) # 设置随机种子保证可复现,可根据需要移除 shuffled_patients <- sample(unique(df$x), size = total_patients) # 前count_0名患者分配0,剩下的分配1 leg_assignment <- data.frame( x = shuffled_patients, assigned_y = c(rep(0, count_0), rep(1, count_1)) ) # 匹配原数据,得到最终样本 df_HS <- merge(df, leg_assignment, by = "x") df_HS <- df_HS[df_HS$y == df_HS$assigned_y, c("x", "y")] # 查看结果分布 tabyl(df_HS$y)
代码解释
- 确定均衡数量:根据总患者数计算需要抽取的左腿和右腿的目标数量,确保最均衡的分配
- 随机分配患者:先打乱患者ID的顺序,再按目标数量为患者分配对应的腿类型,保证随机性的同时满足均衡要求
- 匹配生成样本:将分配结果与原数据合并,筛选出符合分配要求的腿记录,得到最终样本
不同规模测试验证
- 6名患者(偶数):运行后
tabyl结果会显示0和1各3条 - 5名患者(奇数):修改测试数据为
x = rep(1:5, each = 2),运行后会出现2条0+3条1,或3条0+2条1(取决于随机种子) - 33名患者(奇数):会自动分配16条0和17条1,或17条0和16条1,满足最多相差1条的要求
内容的提问来源于stack exchange,提问作者martijn van Hooff
相关产品推荐
相关产品推荐

