匹配四元变量R

时间:2018-08-17 19:04:16

标签: r for-loop dplyr matching

我正在使用可以通过以下代码生成的数据集:

set.seed(922)
dat<-data.frame("y" = c(rnorm(500,20,2),rnorm(500, 40,2),rnorm(500,60,2),rnorm(500,80,2)),
                "quaternary" = sample(LETTERS[1:4],2000,replace = T),
                "binary" = sample(c("0","1"),2000,replace = T))

(生成4模态分布是一个任意决定)

重要的是四个治疗组(“ A”,“ B”,“ C”,“ D”)。

我正在尝试根据数据框中y的值创建一个平衡的匹配样本。我已经使用“ Matchit”包根据二进制变量构建平衡的样本:

matchit(binary~y,data = dat)

但是我不确定如何在“ y”的值上建立4级因子“四元”的匹配。

我不确定在Matchit软件包中是否有一种优雅的方法可以做到这一点,但是我对如何堆叠方法以获得平衡的样本都持开放态度。任何帮助都很棒

编辑:

好的,所以我想我接近了。您可以在for循环中利用dplyr。这有点效率低下,我仍然不得不考虑使用它来创建 balanced 样本的含义,但是它越来越近了……

首先在dat框架中,创建四个用NA填充的新变量:

dat$A_match<-NA
dat$B_match<-NA
dat$C_match<-NA
dat$D_match<-NA

您可以使用dplyr中的summary函数查找值。

require(dplyr) #haha. Hey that rhymes

for(i in 1:dim(dat)[1]){
  dat_A_index<-dat%>%
    mutate(y = ifelse(quaternary=="A",y,0),
           abs = abs(dat[i,1]-y))%>%
    summarise(A_index = which.min(abs))
  dat$A_match[i]<-dat[dat_A_index$A_index,1]
  rm(dat_A_index)
  dat_B_index<-dat%>%
    mutate(y = ifelse(quaternary=="B",y,0),
           abs = abs(dat[i,1]-y))%>%
    summarise(B_index = which.min(abs))
  dat$B_match[i]<-dat[dat_B_index$B_index,1]
  rm(dat_B_index)
  dat_C_index<-dat%>%
    mutate(y = ifelse(quaternary=="C",y,0),
           abs = abs(dat[i,1]-y))%>%
    summarise(C_index = which.min(abs))
  dat$C_match[i]<-dat[dat_C_index$C_index,1]
  rm(dat_C_index)
  dat_D_index<-dat%>%
    mutate(y = ifelse(quaternary=="D",y,0),
           abs = abs(dat[i,1]-y))%>%
    summarise(D_index = which.min(abs))
  dat$D_match[i]<-dat[dat_D_index$D_index,1]
  rm(dat_D_index)
}

我知道它很笨拙,但是至少它在给定y值的情况下,在4个类别中的每个类别中都选择了最佳匹配。在实际应用中,最终的平衡样本应不大于最小条件 n 乘以4。您还必须假设可能需要剔除一些离群值(也许要进行F检验,最后的过滤规则?)。无论如何,我们生成的向量 y 已经表示一个平衡的样本,但是对于实际应用而言,这是不正确的。

1 个答案:

答案 0 :(得分:1)

请记住,MatchIt仅生成适合于估计ATT(对被治疗者的平均治疗效果)的匹配样本。通常,MatchIt选择它认为“已治疗”的组,通常是标记为“ 1”的治疗水平。然后将其与每个处理的单元匹配一个或多个控制单元。

使用多项式处理时,您还需要确定您对哪个估计感兴趣。如果再次对ATT感兴趣,则必须选择一个组视为“已处理”,而将其他组视为“控制”(我更喜欢将它们称为“焦点”和“非焦点”)。重要的是,您的治疗效果估计值将只推广到组成与焦点人群相似的人群。

如果这是您想要的,则需要选择一个组作为焦点,然后执行三个单独的matchit调用,每个调用都将非焦点组之一与焦点组中的单元匹配。焦点小组保持不变。以下是一些我可能用来执行此操作的代码:

set.seed(922)
library(MatchIt)
dat<-data.frame("y" = c(rnorm(500,20,2),rnorm(500, 40,2),rnorm(500,60,2),rnorm(500,80,2)),
                "quaternary" = sample(LETTERS[1:4],2000,replace = T, prob = c(.1, .3, .3, .3)),
                "binary" = sample(c("0","1"),2000,replace = T))
focal <- "A"

dat$match.weights <- 1
for (lev in levels(dat$quaternary)) {
    if (lev != focal) {
        dat0 <- dat[dat$quaternary %in% c(focal, lev),]
        dat0$treat <- as.numeric(dat0$quaternary == focal)

        m.out <- matchit(treat ~ y, dat = dat0, replace = FALSE)
        dat$match.weights[dat$quaternary == lev] <- m.out$weights[dat0$treat == 0]
    }
}

library(cobalt)
bal.tab(quaternary ~ y, data = dat, weights = dat$match.weights, 
        method = "matching", focal = focal, un = TRUE)
#> Note: estimand and s.d.denom not specified; assuming ATT and treated.
#> Balance summary across all treatment pairs
#>      Type Max.Diff.Un Max.Diff.Adj
#> y Contin.      0.1134       0.0009
#> 
#> Sample sizes
#>             B   C   D   A
#> All       593 597 612 198
#> Matched   198 198 198 198
#> Unmatched 395 399 414   0

由reprex软件包(v0.2.1)于2018-10-13创建

请注意,如果焦点小组不是小组中最小的小组,则必须通过在replace = TRUE中设置matchit()与替换小组进行匹配。为了确保此示例中的焦点组最小,我设置了quaternary的随机采样值的概率,以使A的概率最低。

另一方面,如果您要使用ATE,则匹配可能不是您的最佳选择。使用MatchIt来为ATE生成匹配集以进行二进制处理将非常困难,这使得在多个处理组中更加困难。取而代之的是,您可能会研究倾向得分加权,通过多项式处理可以很好地定义权重。下面是一些代码,这些代码使用上述数据集来估计ATT或ATE来估计权重:

library(WeightIt)
#Weighting for the ATT with A as focal:
w.out.att <- weightit(quaternary ~ y, data = dat, estimand = "ATT", focal = "A")
#> Using multinomial logit regression.
dat$w.att <- w.out.att$weights

#Weighting for the ATE:
w.out.ate <- weightit(quaternary ~ y, data = dat, estimand = "ATE")
#> Using multinomial logit regression.
dat$w.ate <- w.out.ate$weights

bal.tab(quaternary ~ y, data = dat, weights = c("w.att", "w.ate"), 
        method = "weighting", estimand = c("ATT", "ATE"), un = TRUE)
#> Balance summary across all treatment pairs
#>      Type Max.Diff.Un Max.Diff.w.att Max.Diff.w.ate
#> y Contin.      0.1092         0.0055         0.0024
#> 
#> Effective sample sizes
#>             A       B       C       D
#> All   198.000 593.000 597.000 612.000
#> w.att 198.000 591.139 593.474 604.162
#> w.ate 196.947 592.822 596.993 611.107

由reprex软件包(v0.2.1)于2018-10-13创建

无论使用哪种策略,都可以使用估计的匹配权重或ATT或ATE权重将权重用于治疗结果的加权回归中。

[披露:我是cobalt和WeightIt软件包的作者。]