You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言如何用purrr实现多因变量Matching包倾向得分匹配批量计算

错误原因

  1. 列名调用逻辑错误:当你用字符串变量指代数据框列名时,不能直接用$符号(matching_df$.x会尝试找列名为.x的列,而非.x变量存储的字符串对应的列),drop_na中直接传入.x也无法识别字符串列名。
  2. 返回值格式不兼容: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 06:48:04