R语言MatchIt包如何同时实现精确匹配与马氏距离匹配
解决方法
你需要做两步调整即可实现需求:
- 先过滤数据集,确保候选对照样本仅保留
Brown=1的观测(处理组样本不受限制) - 在
matchit()函数中加入exact参数,指定需要精确匹配的变量
修正后可运行的完整代码
先补全你示例数据中缺失的treat变量(下方为随机生成的示例处理标识,你替换成自己的实际处理变量即可)和遗漏的size列:
# 加载MatchIt包 library(MatchIt) # 补全示例数据 Brown <- c("1","1","0","1","0","1","0","0") SIC <- c(10, 11, 67, 20, 31, 12, 31, 31) year <- c("2013","2013","2012","2014","2013","2012","2011","2013") size <- c(2000,1000,1200,3100,3131,1233,1920,910) tobinsq <- c(13,23,11,1,31,131,321,111) country <- c("US","CA","NO","US","US","ES","CA","US") treat <- c(1,0,0,1,0,0,1,0) # 1=处理组,0=对照组,替换为你的真实处理标识 dframe <- data.frame(Brown, year, SIC, country, size, tobinsq, treat) # 第一步:过滤对照池,仅保留Brown=1的样本作为候选对照 dframe_filtered <- dframe[dframe$treat == 1 | dframe$Brown == 1,] # 第二步:加入精确匹配参数执行匹配 matchman <- matchit(treat ~ size + tobinsq, data = dframe_filtered, distance = "mahalanobis", exact = ~ year + SIC + country) # 指定需要精确匹配的变量
参数说明
exact参数接受公式格式输入,列在公式中的变量会要求处理组和对照组成员的取值完全一致,系统会自动在每个精确匹配变量的分层内执行后续的马氏距离最近邻匹配,不会出现跨层匹配的情况。- 如果你本身的研究设计要求处理组也必须为
Brown=1,可以直接把Brown也加入exact公式中,省略提前过滤数据集的步骤:exact = ~ Brown + year + SIC + country。
内容的提问来源于stack exchange,提问作者thomas.diridondo
相关产品推荐
相关产品推荐

