微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

与 MatchIt 粗化精确匹配

如何解决与 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 不关心亲密度;它只考虑协变量空间的 bin。由于您提到的原因,分箱并不总是最好的解决方案:两个单元可能非常接近,但被分箱边界隔开,将它们置于不同的层中或留下一些不匹配的。

另一种解决方案是使用卡尺,这听起来更像是您想要的。您可以使用完全匹配的卡尺来保留尽可能多的单位。完全匹配通过最小化处理单元和控制单元之间的地层内总距离来创建具有恰好一个处理单元或恰好一个控制单元的层。卡尺确保控制每个层中处理单元和控制单元之间的距离。您可以直接在协变量上设置卡尺。例如,要确保层内的单位不超过 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 的唯一建议是手动调整切割点,直到获得您喜欢的样本。不要忘记您可以自己提供切割点,而不仅仅是箱的数量。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。