对多站点数据集使用 MatchIt 不起作用

Use MatchIt for multi-site data set does not work

我想使用 MatchIt 包来匹配 多站点 数据集中的患者和对照组。对于匹配,性别和年龄都应该使用,并且匹配过程应该不替换。基本原理应该是迭代每个站点,在每个站点内进行匹配,然后连接匹配的数据帧以获得具有匹配样本的多站点数据帧。

这是我的数据集的样子(只有前七行可以让您快速了解):

> multi_site_df
    age   site   group group_boolean sex_boolean
1    53 site_B patient             1           0
2    30 site_B patient             1           0
3    27 site_B control             0           0
4    32 site_B patient             1           1
5    63 site_B control             0           0
6    34 site_B control             0           0
7    34 site_B patient             1           0
...

关于这个多站点数据集的一件事是,在某些站点中,患者比对照组多,而在其他站点中,情况恰恰相反:

  site   group       n
1 site_A control    44 
2 site_A patient    44 
3 site_B control   100
4 site_B patient    79
5 site_C control    26
6 site_C patient    32
7 site_D control    25
8 site_D patient    33

我开始为多站点数据集的每个子集编写一些使用 MatchIt 的代码:

# get unique sites 
sites <- unique(multi_site_df$site)

# iterate over sites and do the matching for each site
for (site in sites) {
  
  site_df <- multi_site_df[which(multi_site_df$site == site),]
  
  m.out <- matchit(formula=as.formula('group_boolean ~ sex_boolean + age'),
                   data=site_df,
                   method='nearest')
  
  m.out
  site_df_matched <- get_matches(m.out,site_df)

}

但它给了我这个错误:

Warnmeldungen: 1: In matchit2nearest(c(180 = 0L, 181 = 1L, 182 = 0L, 183 = 1L, : Fewer control than treated units and matching without replacement. Not all treated units will receive a match. Treated units will be matched in the order specified by m.order: largest 2: In matchit2nearest(c(238 = 0L, 239 = 0L, 240 = 0L, 241 = 0L, : Fewer control than treated units and matching without replacement. Not all treated units will receive a match. Treated units will be matched in the order specified by m.order: largest

此警告导致匹配的数据框仅包含 NA 值。这似乎与 以及某些站点包含的患者多于对照组的事实有关,反之亦然。除了为每个站点创建一个新的结果变量 notY 之外,是否有任何解决方法?对我来说,是否丢弃患者或对照并不重要。逻辑是:“从多数组中为少数组中的每个单元找到最佳匹配项,并丢弃所有剩余单元”

任何解决方法都会比创建新的治疗变量更复杂。您可以编写足够简单的代码来检查每个站点中控制单元或处理单元是否更丰富,并根据此切换处理变量的值,然后 运行 MatchIt 正常。以下是您可以这样做的方法:

if (sum(site_df$group_boolean == 1) > sum(site_df$group_boolean == 0) {
  site_df$group_boolean <- 1 - site_df$group_boolean
}

这很简单。请注意,在 MatchIt 4.0.0(尚未在 CRAN 上)中,有一个新的 estimand 参数,您可以在 "ATT"(默认值)和 "ATC" 之间切换,后者根据需要在匹配中切换治疗组和对照组的角色。但是您仍然必须告诉 matchit() 您想要哪一个,因此执行该检查是必要的。重要的是 matchit() 失败时你给它的控制比处理单位少,因为当焦点组改变时,估计效果的意义完全改变。当前的行为迫使用户考虑他们是否做出了正确的选择。

另外,我希望你知道你不是在性别和年龄上进行匹配,而是在使用性别和年龄组的逻辑回归估计的倾向得分上进行匹配。配对单位在性别和年龄上可能实际上彼此并不接近。