Linear regression with the Lin (2013) covariate adjustment
Linear regression with the Lin (2013) covariate adjustment
This function is a wrapper for lm_robust that is useful for estimating treatment effects with pre-treatment covariate data. This implements the method described by Lin (2013).
formula: an object of class formula, as in lm, such as Y ~ Z with only one variable on the right-hand side, the treatment
covariates: a right-sided formula with pre-treatment covariates on the right hand side, such as ~ x1 + x2 + x3.
data: A data.frame
weights: the bare (unquoted) names of the weights variable in the supplied data.
subset: An optional bare (unquoted) expression specifying a subset of observations to be used.
clusters: An optional bare (unquoted) name of the variable that corresponds to the clusters in the data.
se_type: The sort of standard error sought. If clusters is not specified the options are "HC0", "HC1" (or "stata", the equivalent), "HC2" (default), "HC3", or "classical". If clusters is specified the options are "CR0", "CR2" (default), or "stata" are permissible.
ci: logical. Whether to compute and return p-values and confidence intervals, TRUE by default.
alpha: The significance level, 0.05 by default.
return_vcov: logical. Whether to return the variance-covariance matrix for later usage, TRUE by default.
try_cholesky: logical. Whether to try using a Cholesky decomposition to solve least squares instead of a QR decomposition, FALSE by default. Using a Cholesky decomposition may result in speed gains, but should only be used if users are sure their model is full-rank (i.e., there is no perfect multi-collinearity)
Returns
An object of class "lm_robust".
The post-estimation commands functions summary and tidy
return results in a data.frame. To get useful data out of the return, you can use these data frames, you can use the resulting list directly, or you can use the generic accessor functions coef, vcov, confint, and predict. Marginal effects and uncertainty about them can be gotten by passing this object to margins from the margins.
Users who want to print the results in TeX of HTML can use the extract function and the texreg package.
An object of class "lm_robust" is a list containing at least the following components: - coefficients: the estimated coefficients
std.error: the estimated standard errors
statistic: the t-statistic
df: the estimated degrees of freedom
p.value: the p-values from a two-sided t-test using coefficients, std.error, and df
conf.low: the lower bound of the 1 - alpha percent confidence interval
conf.high: the upper bound of the 1 - alpha percent confidence interval
term: a character vector of coefficient names
alpha: the significance level specified by the user
se_type: the standard error type specified by the user
res_var: the residual variance
N: the number of observations used
k: the number of columns in the design matrix (includes linearly dependent columns!)
rank: the rank of the fitted model
vcov: the fitted variance covariance matrix
r.squared: The R2,
R2=1−Sum(e[i]2)/Sum((y[i]−y∗)2),
where y∗
is the mean of $y[i]$ if there is an intercept and zero otherwise, and $e[i]$ is the ith residual.
adj.r.squared: The R2 but penalized for having more parameters, rank
weighted: whether or not weights were applied
call: the original function call
fitted.values: the matrix of predicted means
We also return terms, contrasts, and treatment_levels, used by predict, and scaled_center (the means of each of the covariates used for centering them).
Details
This function is simply a wrapper for lm_robust and implements the Lin estimator (see the reference below). This method pre-processes the data by taking the covariates specified in the covariates argument, centering them by subtracting from each covariate its mean, and interacting them with the treatment. If the treatment has multiple values, a series of dummies for each value is created and each of those is interacted with the demeaned covariates. More details can be found in the Getting Started vignette
library(fabricatr)library(randomizr)dat <- fabricate( N =40, x = rnorm(N, mean =2.3), x2 = rpois(N, lambda =2), x3 = runif(N), y0 = rnorm(N)+ x, y1 = rnorm(N)+ x +0.35)dat$z <- complete_ra(N = nrow(dat))dat$y <- ifelse(dat$z ==1, dat$y1, dat$y0)# Same specification as lm_robust() with one additional argumentlmlin_out <- lm_lin(y ~ z, covariates =~ x, data = dat)tidy(lmlin_out)# Works with multiple pre-treatment covariateslm_lin(y ~ z, covariates =~ x + x2, data = dat)# Also centers data AFTER evaluating any functions in formulalmlin_out2 <- lm_lin(y ~ z, covariates =~ x + log(x3), data = dat)lmlin_out2$scaled_center["log(x3)"]mean(log(dat$x3))# Works easily with clustersdat$clusterID <- rep(1:20, each =2)dat$z_clust <- cluster_ra(clusters = dat$clusterID)lm_lin(y ~ z_clust, covariates =~ x, data = dat, clusters = clusterID)# Works with multi-valued treatments, whether treatment is specified as a# factor or notdat$z_multi <- sample(1:3, size = nrow(dat), replace =TRUE)lm_lin(y ~ z_multi, covariates =~ x, data = dat)lm_lin(y ~ factor(z_multi), covariates =~ x, data = dat)# Stratified estimator with blocksdat$blockID <- rep(1:5, each =8)dat$z_block <- block_ra(blocks = dat$blockID)lm_lin(y ~ z_block,~ factor(blockID), data = dat)# Fitting the model without an intercept provides estimates of mean outcomes# under each respective treatment conditionlm_lin(y ~ z_multi -1, covariates =~ x, data = dat)# Predictions are the same in equivalent models with and without an interceptlmlin_out3 <- lm_lin(y ~ z_multi -1, covariates =~ x, data = dat)lmlin_out4 <- lm_lin(y ~ z_multi, covariates =~ x, data = dat)predict(lmlin_out3, newdata = dat, se.fit =TRUE, interval ="confidence")predict(lmlin_out4, newdata = dat, se.fit =TRUE, interval ="confidence")## Not run:# Can also use 'margins' package if you have it installed to get# marginal effects library(margins)# Instruct 'margins' to treat z as a factor lmlout <- lm_lin(y ~ factor(z_block),~ x, data = dat) summary(margins(lmlout))# Can output results using 'texreg' library(texreg) texregobj <- extract(lmlout)## End(Not run)
References
Freedman, David A. 2008. "On Regression Adjustments in Experiments with Several Treatments." The Annals of Applied Statistics. JSTOR, 176-96. tools:::Rd_expr_doi("10.1214/07-AOAS143") .
Lin, Winston. 2013. "Agnostic Notes on Regression Adjustments to Experimental Data: Reexamining Freedman's Critique." The Annals of Applied Statistics 7 (1). Institute of Mathematical Statistics: 295-318. tools:::Rd_expr_doi("10.1214/12-AOAS583") .