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

如何在R语言的matchit()中指定匹配样本量?

实现两组各100个匹配样本的解决方案

我明白你的需求——手里有120个处理组和147个对照组,想通过MatchIt得到各100个在年龄、性别、BMI上匹配的样本,但MatchIt默认只会匹配到两组中较小的样本量(也就是120个处理+120个对照),而且确实没有直接指定目标样本量的参数。不过我们可以通过两步操作轻松实现你的要求,思路是先从样本量较多的处理组中抽取100个,再用这100个去匹配对照组的100个样本。

具体步骤和代码示例

假设你的数据框名为df,分组变量是treat(1代表处理组,0代表对照组),匹配变量是age、sex和BMI:

  1. 加载所需包
    我们需要用dplyr来抽样,MatchIt来做匹配:

    library(MatchIt)
    library(dplyr)
    
  2. 从处理组中随机抽取100个样本
    因为处理组有120个,足够抽取100个。记得设置随机种子保证结果可重复:

    set.seed(123) # 可替换成任意数字,确保结果一致
    treated_subset <- df %>%
      filter(treat == 1) %>%
      slice_sample(n = 100) # 随机抽取100个处理组样本
    
  3. 合并抽样后的处理组和全部对照组
    构建新的数据集用于匹配:

    matching_data <- bind_rows(treated_subset, df %>% filter(treat == 0))
    
  4. 执行匹配
    使用matchit()函数,指定匹配变量和ratio=1(每个处理组样本匹配1个对照组样本),这里用最常用的最近邻匹配,你也可以换成卡钳匹配、马氏距离匹配等:

    match_result <- matchit(treat ~ age + sex + BMI,
                            data = matching_data,
                            method = "nearest", # 匹配方法,按需调整
                            ratio = 1)
    
  5. 获取匹配后的数据集
    用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 10:17:22