optweight
contains functions to estimate weights that balance treatments to given balance thresholds. It solves a quadratic programming problem to minimize an objective function of the weights using solve_osqp()
in the rosqp
package. This is the method described in Zubizarreta (2015). optweight
extends the method to multinomial, continuous, and longitudinal treatments and provides a simple user interface and compatibility with the cobalt
package.
Below is an example of estimating weights with optweight
and assessing balance on the covariates with cobalt
.
devtools::install_github("ngreifer/optweight") #development version
library("optweight")
library("cobalt")
data("lalonde")
# Estimate weights
ow <- optweight(treat ~ age + educ + race + nodegree + married + re74 + re75 +
I(re74 == 0) + I(re75 == 0), data = lalonde, estimand = "ATT", tols = 0.01)
ow
An optweight object
- number of obs.: 614
- sampling weights: none
- treatment: 2-category
- estimand: ATT (focal: 1)
- covariates: age, educ, race, nodegree, married, re74, re75, I(re74 == 0), I(re75 == 0)
Summary of weights:
- Weight ranges:
Min Max
treated 1.0000 || 1.0000
control 0.0021 |---------------------------| 7.4319
- Units with 5 greatest weights by group:
2 3 4 5 6
treated 1 1 1 1 1
608 574 559 573 303
control 7.2344 7.3161 7.4058 7.4058 7.4319
Coef of Var Mean Abs Dev
treated 0.0000 0.0000
control 1.9018 1.3719
overall 1.5897 0.9585
- Effective Sample Sizes:
Control Treated
Unweighted 429.000 185
Weighted 92.917 185
Call
optweight(formula = treat ~ age + educ + race + nodegree + married +
re74 + re75 + I(re74 == 0) + I(re75 == 0), data = lalonde,
tols = 0.01, estimand = "ATT")
Balance Measures
Type Diff.Adj
age Contin. 0.01
educ Contin. 0.01
race_black Binary 0.01
race_hispan Binary 0.00
race_white Binary -0.01
nodegree Binary 0.01
married Binary -0.01
re74 Contin. 0.01
re75 Contin. 0.01
I(re74 == 0) Binary 0.01
I(re75 == 0) Binary 0.01
Effective sample sizes
Control Treated
Unadjusted 429.000 185
Adjusted 92.917 185
# Estimate a treatment effect
library("jtools")
summ(lm(re78 ~ treat, data = lalonde, weights = ow$weights), confint = TRUE,
robust = TRUE, model.fit = FALSE)
MODEL INFO:
Observations: 614
Dependent Variable: re78
Type: OLS linear regression
Standard errors: Robust, type = HC3
Est. 2.5% 97.5% t val. p
(Intercept) 5342.94 4635.09 6050.78 14.85 0.00 ***
treat 1006.21 57.22 1955.19 2.09 0.04 *
The lower-level function optweight.fit
operates on the covariates and treatment variables directly.
In addition to estimating balancing weights for estimating treatment effects, optweight
can estimate sampling weights for generalizing an estimate to a new target population defined by covariate moments using the function optweight.svy
.