Built using Zelig version 5.1.4.90000


Weights are often added to statistical models to adjust the observed sample distribution in the data to an underlying population of interest. For example, some types of observations may have been intentionally oversampled, and need to be downweighted for population inferences, or weights may have been created by a matching procedure to create a dataset with treatment and control groups that resemble randomized designs and achieve balance in covariates.

The weights argument, can be a vector of weight values, or a name of a variable in the dataset.

Not all the R implementations of statistical models that Zelig uses have been written to accept weights or use them in estimation. When weights have been supplied by the user, but weights are not written into the package for that model, Zelig is still able to use the weights by one of two procedures:

  • If the supplied weights are all integer values, then Zelig rebuilds a new version of the dataset by duplicating observations according to their weight (and removing observations with zero weight).

  • If the weights are continuously valued, Zelig bootstraps the supplied dataset, using the relative weights as bootstrap probabilities.

Examples

Here we are building a simulated dataset where in the first fifty observations \(y\) has a positive relationship with \(x\). In the next fifty observations there is a negative relationship.

x <- runif(90)
y <- c( 2*x[1:45], -3*x[46:90] ) + rnorm(90)
z <- as.numeric(y>0)
w1 <- c(rep(1.8, 45), rep(0.2,45))
mydata <- data.frame(z,y,x,w1)

w2 <- rep(c(1.8,0.2), 45)

In the first example below, we are passing the name of a variable included in the dataset. We see the weights are correctly implemented as we are more heavily weighting the first 50 observations, where there is a positive relationship, and positive relationship is seen in the regression.

library(Zelig)
## Loading required package: survival
z1.out <- zelig(y ~ x, model = "ls", weights = "w1",
                data = mydata, cite = FALSE)
summary(z1.out)
## Model: 
## 
## Call:
## z5$zelig(formula = y ~ x, data = mydata, weights = "w1")
## 
## Weighted Residuals:
##     Min      1Q  Median      3Q     Max 
## -2.9898 -1.3370 -0.5089  0.5154  2.6108 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)
## (Intercept)  -0.1191     0.3074  -0.387 0.699473
## x             1.6522     0.4725   3.497 0.000741
## 
## Residual standard error: 1.31 on 88 degrees of freedom
## Multiple R-squared:  0.122,  Adjusted R-squared:  0.112 
## F-statistic: 12.23 on 1 and 88 DF,  p-value: 0.0007409
## 
## Next step: Use 'setx' method

In our second example, the weights are provided as a separate vector of the same length as the dataset. These weights give weight to both relationships present when we constructed the data, and we see the estimated relationship is now negative.

z2.out <- zelig(y ~ x, model = "ls", weights = w2,
                data = mydata, cite = FALSE)
summary(z2.out)
## Model: 
## 
## Call:
## z5$zelig(formula = y ~ x, data = mydata, weights = w2)
## 
## Weighted Residuals:
##     Min      1Q  Median      3Q     Max 
## -6.2853 -0.7421  0.2164  1.0452  4.8884 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)
## (Intercept) -0.04192    0.47259  -0.089    0.930
## x           -0.56505    0.71066  -0.795    0.429
## 
## Residual standard error: 2.042 on 88 degrees of freedom
## Multiple R-squared:  0.007133,   Adjusted R-squared:  -0.00415 
## F-statistic: 0.6322 on 1 and 88 DF,  p-value: 0.4287
## 
## Next step: Use 'setx' method

Some checking of the supplied weights are conducted, and warnings or error messages will be given to the user if, for example, the supplied weights are of the wrong length, or the variable name supplied is not present in the dataset. Negative weights are treated as zero weights. Here we use the object oriented approach to building the Zelig object.

z3.out <- zelig(y ~ x, weights = "noSuchName", data = mydata, model = "ls",
                cite = FALSE)
## Warning: Variable name given for weights not found in dataset, so will be ignored.
z4.out <- zelig(y ~ x, weights = w2[1:10], data = mydata, model = "ls",
                cite = FALSE)
## Warning: Length of vector given for weights is not equal to number of observations in dataset, and will be ignored.

Here we use a model where sampling weights are not accepted by the underlying package, so Zelig gives a warning message that bootstrapping will be conducted to construct a dataset.

continuous.weights <- rep(x = c(0.6, 1, 1.4), times = 30)
z5.out <- zelig(z ~ x, model = "logit", weights = continuous.weights,
                data = mydata, cite = FALSE)
## Noninteger weights were set, but the model in Zelig is only able to use integer valued weights.
##  A bootstrapped version of the dataset was constructed using the weights as sample probabilities.

But when the weights happen to be integer valued, then Zelig can construct a dataset by a combination of duplicating and deleting observations.

integer.weights <- rep(x = c(0, 1, 2), times = 30)
z6.out <- zelig(z ~ x, model = "logit", weights = integer.weights,
                data = mydata, cite = FALSE)

Using Matching Weights from MatchIt

Weights that are creating using the matching mechanisms in the MatchIt package will be automatically employed in Zelig analyses if the output object from MatchIt is passed to Zelig as the data argument. For more detail, see Using Zelig with MatchIt.