使用 MatchIt 粗化精确匹配

Coarsened exact matching with MatchIt

我正在 运行 在包含约 18,300 行(即每个患者一行)的数据集上使用来自 MatchIt 包的粗化精确匹配 (cem) 匹配方法。我在两个协变量上匹配患者病例。两个协变量是诊断年龄(范围为 0 到 76)和当前年龄(范围为 1 到 90)。

我不想做1:1匹配;相反,我的目标是通过匹配尽可能多的患者来最大程度地减少数据丢失。

我的问题来自试图管理精确平衡和近似平衡之间的权衡。我希望匹配个体的诊断和当前年龄相差不超过 2 岁。 (如果非常罕见的 3 年差异是不可避免的,那没关系——但总的来说,我想将差异保持在不超过两年。)两年的差异可以是诊断年龄的两年差异,当前年龄相差两年,或诊断年龄与当前年龄相差两年。我的想法是,我想尝试匹配这两个群体中个体的疾病持续时间。

我已经为 cutpoints 参数尝试了许多不同的参数。这是一个例子:

matchit <- matchit(Group ~ Last_recorded_age + Diagnosis_age, 
                   data = df,
                   method = 'cem',
                   cutpoints = list(Current_age = 44, Diagnosis_age = 38),
                  )

这会将当前年龄分为 44 个 bin,因此每个 bin 通常包含 2 年的范围。诊断年龄被分成每个包含 2 年的箱子。当我 运行 这个时,除了 383 行之外的所有行都被分配了一个子类。当我使用 match.data() 查看分配了子类的行时,我可以看到只有 25 行的诊断和当前年龄相差 3 年。其余的相差不超过 2 年。这很好——因为这就是我想要的。

但是当我查看未分配子类的 383 行时,我发现有些情况没有分配子类,而我本以为会分配子类,因为它们与被分配到一个子类的案例。例如,其中一个子类包含一对个体,其中接受治疗的个体当前年龄为 31 岁,诊断年龄为 28 岁,而对照个体当前年龄为 30 岁,诊断年龄为 29 岁。但后来我看到有一个无与伦比的对照个体,他的当前年龄为 31 岁,诊断年龄为 30 岁。我想知道为什么那个人没有被分配到我刚才提到的子类中?

是否有更好的方法来定义切点,以便我匹配尽可能多的个体,同时最大限度地减少两组之间的差异?

出现看似接近的不匹配单位现象的原因很简单,就是它们与其他治疗值的单位不属于同一阶层。 CEM 不关心亲密度;它只考虑协变量 space 的 bin。由于您提到的原因,分箱并不总是最佳解决方案:两个单元可能非常接近但被分箱边界隔开,将它们放入不同的层或留下一些不匹配的部分。

另一种解决方案是使用卡尺,无论如何这听起来更像您想要的。您可以使用完全匹配的卡尺来保留尽可能多的单位。完全匹配通过最小化处理单元和控制单元之间的层内总距离来创建具有恰好一个处理单元或恰好一个控制单元的层。卡尺确保控制每个层中处理单元和控制单元之间的距离。您可以直接在协变量上设置卡尺。例如,要确保 strata 内的单位不超过 2 岁以及年龄与诊断年龄之间的距离不超过 2 岁,您可以使用以下代码:

matchit <- matchit(Group ~ Last_recorded_age + Diagnosis_age, 
                   data = df, distance = "mahalanobis",
                   method = "full",
                   caliper = c(Last_recorded_age = 2, Diagnosis_age = 2),
                   std.caliper = FALSE)

有这么多单位,这通常会很慢,但卡钳很紧,可能不会花这么长时间。

否则,我对处理 CEM 的唯一建议是手动调整切割点,直到获得您喜欢的样本。不要忘记您可以自己提供切点,而不仅仅是 bin 的数量。