Generates balance statistics for ps, mnps, and iptw objects from twang and for ps.cont objects from twangContinuous.

# S3 method for ps
bal.tab(x, 
        stop.method,
        stats,
        int = FALSE,
        poly = 1,
        distance = NULL,
        addl = NULL,
        data = 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,
        ...)

Arguments

x

a ps, mnps, iptw, or ps.cont object; the output of a call to twang::ps(), twang::mnps(), twang::iptw() or twangContinuous::ps.cont().

stop.method

a string containing the names of the stopping methods used in the original call to ps(), mnps(), or iptw(). Examples include "es.max" or "ks.mean" for ps and mnps objects. bal.tab will assess balance for the weights created by those stopping methods. The names can be abbreviated as long as the abbreviations are specific enough. If no stopping methods are provided, bal.tab will default to displaying balance for all available stopping methods. Ignored for ps.cont objects.

stats, int, poly, addl, data, continuous, binary, thresholds, weights, cluster, imp, pairwise, abs, subset, quick, ...

see bal.tab() for details.

See below for special notes on the distance, s.d.denom, and s.weights arguments.

The following arguments have special notes when used with these input objects:

distance

the propensity scores generated by ps() and iptw() (but not mnps() or ps.cont()) are automatically included and named "prop.score.stop.method".

s.d.denom

if not specified, for ps objects, bal.tab() will use "treated" if the estimand of the call to ps() is the ATT and "pooled" if the estimand is the ATE; for mnps objects, bal.tab() will use "treated" if treatATT was specified in the original call to mnps and "pooled" otherwise. Use "all" to get the same values computed by bal.table in twang. Abbreviations allowed.

s.weights

if sampw was supplied in the call to ps(), mnps(), iptw(), or ps.cont(), they will automatically be supplied to s.weights and do not need be specified again (though there is no harm if they are).

Details

bal.tab.ps() generates a list of balance summaries for the input object given, and functions similarly to twang::bal.table().

Value

For binary or continuous point treatments, if clusters are not specified, an object of class "bal.tab" containing balance summaries for the ps 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.

If mnps() is used with multi-category treatments, an object of class "bal.tab.multi" containing balance summaries for each pairwise treatment comparison and a summary of balance across pairwise comparisons. See bal.tab.multi for details.

Note

The function twang::bal.table() in twang performs a similar function. The variances used in the denominator of the standardized mean difference are weighted and computed using survey::svyvar() in twang and are unweighted here (except when s.weights are specified, in which case col_w_sd is used). twang also uses "all" as the default s.d.denom when the estimand is the ATE; the default here is "pooled". For this reason, results may differ slightly between the two packages.

Author

Noah Greifer

See also

bal.tab() for details of calculations.

bal.tab.cluster for more information on clustered data.

bal.tab.multi for more information on multi-category treatments.

bal.tab.msm for more information on longitudinal treatments.

Examples

library(twang); data("lalonde", package = "cobalt")
#> To reproduce results from prior versions of the twang package, please see the version="legacy" option described in the documentation.

## Using ps() for generalized boosted modeling
ps.out <- ps(treat ~ age + educ + married + race +
             nodegree + re74 + re75, data = lalonde, 
             stop.method = c("ks.mean", "es.mean"), 
             estimand = "ATT", verbose = FALSE)
             
bal.tab(ps.out, stop.method = "ks.mean", un = TRUE, 
        m.threshold = .1, disp.ks = TRUE)
#> Balance Measures
#>                 Type Diff.Un  KS.Un Diff.Adj        M.Threshold KS.Adj
#> prop.score  Distance  2.8072 0.8294   0.5712                    0.2164
#> age          Contin. -0.3094 0.1577   0.0538     Balanced, <0.1 0.0980
#> educ         Contin.  0.0550 0.1114  -0.0810     Balanced, <0.1 0.0678
#> married       Binary -0.3236 0.3236   0.0029     Balanced, <0.1 0.0029
#> race_black    Binary  0.6404 0.6404   0.0176     Balanced, <0.1 0.0176
#> race_hispan   Binary -0.0827 0.0827   0.0014     Balanced, <0.1 0.0014
#> race_white    Binary -0.5577 0.5577  -0.0191     Balanced, <0.1 0.0191
#> nodegree      Binary  0.1114 0.1114   0.0637     Balanced, <0.1 0.0637
#> re74         Contin. -0.7211 0.4470   0.1060 Not Balanced, >0.1 0.0591
#> re75         Contin. -0.2903 0.2876   0.1217 Not Balanced, >0.1 0.0941
#> 
#> Balance tally for mean differences
#>                    count
#> Balanced, <0.1         7
#> Not Balanced, >0.1     2
#> 
#> Variable with the greatest mean difference
#>  Variable Diff.Adj        M.Threshold
#>      re75   0.1217 Not Balanced, >0.1
#> 
#> Effective sample sizes
#>            Control Treated
#> Unadjusted   429.      185
#> Adjusted      25.5     185