如何用R实现分层随机化,将数据分为4组(性别/年龄/焦虑度均衡)
用R实现分层随机化分组(基于性别、年龄、焦虑度)
针对你的需求,我们可以通过分层随机化的方式,先把参与者按性别、年龄分层、焦虑度分层组合成同质小组,再在每个小组内随机分配到4个条件组,以此保证组间人口统计学特征尽可能均衡。
步骤1:准备工作与数据预处理
首先加载tidyverse工具包,然后对连续变量(年龄、焦虑度)进行分箱处理——因为分层随机化更适合基于分类变量操作,分箱后能让同一层的参与者在这些指标上更相似:
library(tidyverse) # 对年龄、焦虑度按分位数分成3层(可根据数据分布调整层数) daten_strat <- daten_strat %>% mutate( age_bin = ntile(age, 3), # 年龄分3层:低/中/高 anxiety_bin = ntile(anxiety, 3), # 焦虑度分3层:低/中/高 # 组合性别、年龄层、焦虑度层为分层标识 strat_id = paste(gender, age_bin, anxiety_bin, sep = "_") )
步骤2:分层随机分配分组
在每个分层内,将参与者随机分配到4个条件组,保证每层内的分配尽可能均匀:
set.seed(123) # 设置随机种子,让结果可重复 daten_strat <- daten_strat %>% group_by(strat_id) %>% mutate( # 生成重复的1-4序列(匹配当前分层的人数),再随机打乱 condition_group = sample(rep(1:4, length.out = n())) ) %>% ungroup() # 可选:删除中间生成的分层辅助变量 daten_strat <- daten_strat %>% select(-age_bin, -anxiety_bin, -strat_id)
步骤3:验证组间均衡性
分配完成后,检查各组在目标变量上的分布是否均衡:
# 检查性别分布 daten_strat %>% count(condition_group, gender) %>% pivot_wider(names_from = gender, values_from = n, values_fill = 0) # 检查年龄、焦虑度的组间均值 daten_strat %>% group_by(condition_group) %>% summarise( avg_age = mean(age), avg_anxiety = mean(anxiety) )
备选方案:使用blockrand包简化操作
如果你想更便捷地实现分层区组随机化,可以用blockrand包:
library(blockrand) # 先创建分层标识 daten_strat$strat_id <- with(daten_strat, paste(gender, ntile(age,3), ntile(anxiety,3), sep="_")) # 执行分层区组随机分配 set.seed(123) assign_result <- blockrand( n = nrow(daten_strat), num.levels = 4, # 4个条件组 strata = daten_strat$strat_id, # 分层依据 block.sizes = 4 # 每个区组包含4个参与者,对应4个组各1人 ) # 合并分配结果到原数据 daten_strat <- bind_cols(daten_strat, assign_result %>% select(treatment))
说明:分箱的层数可以根据你的数据分布调整(比如改成4层),核心是让同一分层内的参与者特征尽可能相近,这样随机分配后的组间差异会被最小化。
内容的提问来源于stack exchange,提问作者abeckers
相关产品推荐
相关产品推荐

