如何在R语言的matchit()中指定匹配样本量?
实现两组各100个匹配样本的解决方案
我明白你的需求——手里有120个处理组和147个对照组,想通过MatchIt得到各100个在年龄、性别、BMI上匹配的样本,但MatchIt默认只会匹配到两组中较小的样本量(也就是120个处理+120个对照),而且确实没有直接指定目标样本量的参数。不过我们可以通过两步操作轻松实现你的要求,思路是先从样本量较多的处理组中抽取100个,再用这100个去匹配对照组的100个样本。
具体步骤和代码示例
假设你的数据框名为df,分组变量是treat(1代表处理组,0代表对照组),匹配变量是age、sex和BMI:
加载所需包
我们需要用dplyr来抽样,MatchIt来做匹配:library(MatchIt) library(dplyr)从处理组中随机抽取100个样本
因为处理组有120个,足够抽取100个。记得设置随机种子保证结果可重复:set.seed(123) # 可替换成任意数字,确保结果一致 treated_subset <- df %>% filter(treat == 1) %>% slice_sample(n = 100) # 随机抽取100个处理组样本合并抽样后的处理组和全部对照组
构建新的数据集用于匹配:matching_data <- bind_rows(treated_subset, df %>% filter(treat == 0))执行匹配
使用matchit()函数,指定匹配变量和ratio=1(每个处理组样本匹配1个对照组样本),这里用最常用的最近邻匹配,你也可以换成卡钳匹配、马氏距离匹配等:match_result <- matchit(treat ~ age + sex + BMI, data = matching_data, method = "nearest", # 匹配方法,按需调整 ratio = 1)获取匹配后的数据集
用match.data()提取最终匹配好的样本,里面就会有100个处理组和100个对照组:matched_df <- match.data(match_result)
额外提示
- 如果担心随机抽样处理组会导致特征分布偏差,可以改成分层抽样,比如按性别、年龄组分层后再抽,确保抽样后的处理组和原处理组特征更一致:
set.seed(123) treated_subset <- df %>% filter(treat == 1) %>% group_by(sex, cut(age, breaks = 3)) %>% # 按性别和年龄三分层 slice_sample(prop = 100/120) %>% # 按比例抽样 ungroup() %>% slice_sample(n = 100) # 确保最终是100个 - 匹配完成后可以用
summary(match_result)查看匹配效果,确认年龄、性别、BMI在两组间的平衡情况。
内容的提问来源于stack exchange,提问作者Bart
相关产品推荐
相关产品推荐

