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

如何用MatchIt对单处理单元的控制样本按距离排序及设置匹配数?

在MatchIt中对控制样本按与处理单元的距离排序及匹配数量设置

我来帮你搞定MatchIt里的这两个问题~

一、如何按与处理单元的距离排序控制样本

MatchIt在匹配过程中会自动计算每个控制样本和处理单元的距离(具体是倾向得分差、马氏距离还是其他,取决于你选的匹配方法和距离类型),我们可以从匹配结果里提取这些距离,再对控制样本排序:

  1. 先完成基础匹配(先拿到距离数据,匹配数量可以后续调整)

    # 假设你的处理变量是treated(1=处理组,0=控制组),covariates是协变量集合
    m.out <- matchit(treated ~ covariate1 + covariate2, data = your_data, method = "nearest")
    
  2. 把距离数据合并到原数据集,筛选控制单元并排序

    # 合并距离信息到原数据
    matched_data <- cbind(your_data, distance = m.out$distance)
    
    # 筛选所有控制单元,按距离从小到大排序(越靠前的和处理单元相似度越高)
    sorted_control_units <- matched_data[matched_data$treated == 0, ]
    sorted_control_units <- sorted_control_units[order(sorted_control_units$distance), ]
    

    如果你想使用马氏距离而非默认的倾向得分,记得在matchit()里指定distance = "mahalanobis"。

二、决定匹配数量的核心参数

控制每个处理单元匹配多少个控制单元,最关键的参数是**ratio**:

  • 在method = "nearest"(最近邻匹配)模式下,ratio直接指定每个处理单元要匹配的控制单元数量。比如你想匹配5个控制单元,就写ratio = 5;如果想匹配所有符合条件的控制单元,可以设ratio = N(不过实际中如果N很大,不建议这么做,会降低匹配质量)。
  • 另外caliper参数会间接影响匹配数量:它设置了距离的阈值,只有距离小于等于这个阈值的控制单元才会被纳入匹配池。比如你设了caliper = 0.2,那些距离超过0.2的控制单元即使数量够,也不会被匹配。

三、为什么你现在只得到1个匹配结果

因为MatchIt中method = "nearest"的默认ratio值是1!也就是说,默认情况下每个处理单元只会匹配1个距离最近的控制单元,所以你看到的结果只有1个。只要把ratio改成你想要的数字(比如ratio = 3),就能得到对应数量的匹配样本了。

举个完整的示例:

# 构造测试数据:1个处理单元,10个控制单元
set.seed(456)
test_data <- data.frame(
  treated = c(1, rep(0, 10)),
  age = rnorm(11, 40, 6),
  score = rnorm(11, 80, 10)
)

# 给处理单元匹配4个控制单元
m.out <- matchit(treated ~ age + score, data = test_data, method = "nearest", ratio = 4)

# 查看匹配结果
summary(m.out)

# 提取并排序控制单元
sorted_controls <- cbind(test_data, distance = m.out$distance) |>
  subset(treated == 0) |>
  order_by(distance)

print(sorted_controls)

内容的提问来源于stack exchange,提问作者OverFlow Police

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:23:45