使用MatchIt包进行粗化精确匹配(CEM)的分箱参数优化问题
未匹配样本的产生原因
- CEM的核心逻辑是单变量独立分箱后跨箱无匹配:你当前的设置是对当前年龄、诊断年龄分别做2岁间隔的独立分箱,只有两个协变量同时落在同一个分箱的样本才会被划入同一子类,不会根据两个变量的总差值做跨箱匹配。你举的例子里未匹配的对照个体大概率是诊断年龄/当前年龄刚好卡在分箱边界,被划入了和该子类其他样本不同的分箱,哪怕总差值符合要求也无法被匹配。
- 代码存在变量名不匹配的潜在问题:你传入
matchit的协变量是Last_recorded_age,但cutpoints里定义的分箱变量是Current_age,如果两个变量名不对应,你设置的2岁间隔分箱规则根本不会生效,MatchIt会调用默认分箱规则,反而可能出现更不合理的边界切分。 - 空箱自动丢弃规则:如果某分箱内只有处理组或只有对照组样本,该分箱内的所有样本都会被直接丢弃,不会和相邻分箱的样本做匹配。
优化匹配效果的方案
- 第一步先修正代码的变量名一致性:把
cutpoints中的变量名改为和公式中完全一致,确保自定义分箱规则生效,示例修正后代码如下:
matchit <- matchit(Group ~ Last_recorded_age + Diagnosis_age, data = df, method = 'cem', cutpoints = list(Last_recorded_age = seq(1,90,2), Diagnosis_age = seq(0,76,2)), )
直接用seq()生成明确的2岁间隔整数边界,避免默认分箱出现非整数边界导致的样本误切分。
- 如果要匹配两个年龄的总差值≤2的核心需求(本质是匹配病程),可以直接把病程=当前年龄-诊断年龄作为第三个协变量加入匹配规则,同时适当放宽两个年龄的分箱间隔到3岁,匹配完成后再过滤掉两个年龄总差值超过2的样本,比直接严格分箱能保留更多有效样本。
- 若优先保留样本量,可关闭CEM默认的k2k匹配规则(你当前代码没开是对的),不要做1:1配对,保留所有同箱内的处理组和对照组样本,仅丢弃无对应组别的空箱样本。
- 若对联合差值的要求高于单变量精确分箱,可改用马氏距离匹配,设置两个年龄的联合卡尺阈值,能直接实现你要求的总差值限制,匹配保留的样本量会比CEM更高。
内容的提问来源于stack exchange,提问作者erin489
相关产品推荐
相关产品推荐

