Matching
, optmatch
, ebal
, and designmatch
Objectsbal.tab.Match.Rd
Generates balance statistics for output objects from Matching, optmatch, ebal, and designmatch.
# S3 method for Match
bal.tab(x,
formula = NULL,
data = NULL,
treat = NULL,
covs = NULL,
stats,
int = FALSE,
poly = 1,
distance = NULL,
addl = NULL,
continuous,
binary,
s.d.denom,
thresholds = NULL,
weights = NULL,
cluster = NULL,
imp = NULL,
pairwise = TRUE,
s.weights = NULL,
abs = FALSE,
subset = NULL,
quick = TRUE,
...)
either a Match
object (the output of a call to Matching::Match()
or Matching::Matchby()
), an optmatch
object (the output of a call to optmatch::pairmatch()
or optmatch::fullmatch()
), an ebalance
object (the output of a call to ebal::ebalance()
or ebal::ebalance.trim()
), or the output of a call to designmatch::bmatch()
or related wrapper functions from the designmatch package.
a formula
with the treatment variable as the response and the covariates for which balance is to be assessed as the predictors. All named variables must be in data
. See Details.
a data frame containing variables named in formula
, if supplied, and other arguments.
a vector of treatment statuses. See Details.
a data frame of covariate values for which to check balance. See Details.
see bal.tab()
for details.
See below for a special note on the s.d.denom
argument.
The following argument has a special notes when used with these input objects:
if not specified, for Match
objects, bal.tab()
will use "treated" if the estimand of the call to Match()
is the ATT, "pooled" if the estimand is the ATE, and "control" if the estimand is the ATC; for optmatch
, ebal
, and designmatch
objects, bal.tab()
will determine which value makes the most sense based on the input. Abbreviations allowed.
bal.tab()
generates a list of balance summaries for the object given, and function similarly to Matching::MatchBalance()
and designmatch::meantab()
. Note that output objects from designmatch do not have their own class; bal.tab()
first checks whether the object meets the criteria to be treated as a designmatch
object before dispatching the correct method. Renaming or removing items from the output object can create unintended consequences.
The input to bal.tab.Match()
, bal.tab.optmatch()
, bal.tab.ebalance()
, and bal.tab.designmatch()
must include either both formula
and data
or both covs
and treat
. Using the formula
+ data
inputs mirrors how Matching::MatchBalance()
is used, and using the covs
+ treat
input mirrors how designmatch::meantab()
is used. (Note that to see identical results to meantab()
, s.d.denom
must be set to "pooled"
, though this is not recommended.) For optmatch
output objects, specifying a treatment is not required.
For point treatments, if clusters and imputations are not specified, an object of class "bal.tab"
containing balance summaries for the given object. See bal.tab()
for details.
If clusters are specified, an object of class "bal.tab.cluster"
containing balance summaries within each cluster and a summary of balance across clusters. See bal.tab.cluster
for details.
bal.tab()
for details of calculations.
########## Matching ##########
library(Matching); data("lalonde", package = "cobalt")
#> ##
#> ## Matching (Version 4.10-2, Build Date: 2022-04-13)
#> ## See http://sekhon.berkeley.edu/matching for additional documentation.
#> ## Please cite software as:
#> ## Jasjeet S. Sekhon. 2011. ``Multivariate and Propensity Score Matching
#> ## Software with Automated Balance Optimization: The Matching package for R.''
#> ## Journal of Statistical Software, 42(7): 1-52.
#> ##
p.score <- glm(treat ~ age + educ + race +
married + nodegree + re74 + re75,
data = lalonde, family = "binomial")$fitted.values
Match.out <- Match(Tr = lalonde$treat, X = p.score)
## Using formula and data
bal.tab(Match.out, formula = treat ~ age + educ + race +
married + nodegree + re74 + re75, data = lalonde)
#> Balance Measures
#> Type Diff.Adj
#> age Contin. 0.2106
#> educ Contin. 0.0201
#> race_black Binary 0.0054
#> race_hispan Binary -0.0051
#> race_white Binary -0.0003
#> married Binary 0.0661
#> nodegree Binary -0.0079
#> re74 Contin. -0.0772
#> re75 Contin. -0.0127
#>
#> Sample sizes
#> Control Treated
#> All 429. 185
#> Matched (ESS) 49.17 185
#> Matched (Unweighted) 136. 185
#> Unmatched 293. 0
########## optmatch ##########
library("optmatch"); data("lalonde", package = "cobalt")
lalonde$prop.score <- glm(treat ~ age + educ + race +
married + nodegree + re74 + re75,
data = lalonde, family = binomial)$fitted.values
pm <- pairmatch(treat ~ prop.score, data = lalonde)
## Using formula and data
bal.tab(pm, formula = treat ~ age + educ + race +
married + nodegree + re74 + re75, data = lalonde,
distance = "prop.score")
#> Call
#> pairmatch(x = treat ~ prop.score, data = lalonde)
#>
#> Balance Measures
#> Type Diff.Adj
#> prop.score Distance 0.9740
#> age Contin. 0.0922
#> educ Contin. -0.1264
#> race_black Binary 0.3730
#> race_hispan Binary -0.1568
#> race_white Binary -0.2162
#> married Binary -0.0162
#> nodegree Binary 0.0703
#> re74 Contin. -0.0539
#> re75 Contin. -0.0247
#>
#> Sample sizes
#> Control Treated
#> All 429 185
#> Matched 185 185
#> Unmatched 244 0
########## ebal ##########
library("ebal"); data("lalonde", package = "cobalt")
#> ##
#> ## ebal Package: Implements Entropy Balancing.
#> ## See http://www.stanford.edu/~jhain/ for additional information.
#>
covariates <- subset(lalonde, select = -c(re78, treat, race))
e.out <- ebalance(lalonde$treat, covariates)
#> Converged within tolerance
## Using treat and covs
bal.tab(e.out, treat = lalonde$treat, covs = covariates)
#> Balance Measures
#> Type Diff.Adj
#> age Contin. -0
#> educ Contin. -0
#> married Binary -0
#> nodegree Binary 0
#> re74 Contin. -0
#> re75 Contin. -0
#> prop.score Contin. 0
#>
#> Effective sample sizes
#> Control Treated
#> Unadjusted 429. 185
#> Adjusted 95.28 185
########## designmatch ##########
# \donttest{
library("designmatch"); data("lalonde", package = "cobalt")
#> Loading required package: lattice
#> Loading required package: slam
#> Loading required package: Rglpk
#> Using the GLPK callable library version 5.0
covariates <- as.matrix(lalonde[c("age", "educ", "re74", "re75")])
treat <- lalonde$treat
dmout <- bmatch(treat,
total_groups = sum(treat == 1),
mom = list(covs = covariates,
tols = absstddif(covariates,
treat, .05))
)
#> Building the matching problem...
#> GLPK optimizer is open...
#> Finding the optimal matches...
#> Optimal matches found
## Using treat and covs
bal.tab(dmout, treat = treat, covs = covariates)
#> Balance Measures
#> Type Diff.Adj
#> age Contin. 0.0567
#> educ Contin. -0.0538
#> re74 Contin. -0.0613
#> re75 Contin. -0.0501
#>
#> Sample sizes
#> Control Treated
#> All 429 185
#> Matched 185 185
#> Unmatched 244 0
# }