R语言如何用purrr实现多因变量Matching包倾向得分匹配批量计算
错误原因
- 列名调用逻辑错误:当你用字符串变量指代数据框列名时,不能直接用
$符号(matching_df$.x会尝试找列名为.x的列,而非.x变量存储的字符串对应的列),drop_na中直接传入.x也无法识别字符串列名。 - 返回值格式不兼容:
summary(psm1)返回的是summary.Match类对象,不是可直接拼接的行数据结构,map_dfr无法直接将这类对象合并为tibble。
修正后的代码
library(carData) library(purrr) library(tidyverse) library(Matching) vars <- c("lfp", "lwg", "inc") names(vars) <- vars matching_fcn <- function(.x){ # 数据预处理,用all_of识别字符串列名做缺失值剔除 matching_df <- Mroz %>% mutate(wc = case_when(wc == "yes" ~ TRUE, wc == "no" ~ FALSE)) %>% drop_na(k5, k618, age, wc, hc, all_of(.x)) # 拟合倾向得分 ps1 <- glm(wc ~ k5 + k618 + age + hc, family = binomial, data = matching_df) pscore <- ps1$fitted.values # 用[[.x]]语法取字符串对应的因变量列 Y <- matching_df[[.x]] Tr <- matching_df$wc psm1 <- Matching::Match( Y = Y, Tr = Tr, X = pscore, estimand = "ATT", M = 1, replace = TRUE, caliper = 0.05, version = "fast") # 提取指标转为单行tibble返回,可直接被map_dfr拼接 tibble( 因变量 = .x, 估计值 = psm1$est, 标准误 = psm1$se, T统计量 = psm1$est / psm1$se, P值 = 2 * pnorm(-abs(psm1$est / psm1$se)) ) } # 批量运行合并结果 result <- purrr::map_dfr( .x = vars, .f = matching_fcn)
运行后输出的result就是你需要的格式,每一行对应一个因变量的匹配效应估计结果。
内容的提问来源于stack exchange,提问作者C.Robin
相关产品推荐
相关产品推荐

