Tests covariate balance at the RD cutoff by running rdrobust with each covariate as the outcome variable. If the RD design is valid, predetermined covariates should not exhibit a discontinuity at the cutoff.

rd_covariate_balance(
  data,
  covariates,
  x,
  c = 0,
  bw = NULL,
  kernel = "tri",
  p = 1,
  conf_level = 0.95,
  theme_use = causalverse::ama_theme()
)

Arguments

data

A data frame containing the covariates and running variable.

covariates

Character vector. Names of covariate columns to test.

x

Character string. Name of the running variable.

c

Numeric. The cutoff value for the RD design. Default is 0.

bw

Numeric or NULL. Bandwidth to use for all tests. If NULL (the default), rdrobust selects the MSE-optimal bandwidth separately for each covariate.

kernel

Character string. Kernel function for rdrobust. Default is "tri" (triangular).

p

Integer. Order of the local polynomial. Default is 1.

conf_level

Numeric. Confidence level for intervals. Default is 0.95.

theme_use

A ggplot2 theme to apply to the plot. Default is causalverse::ama_theme().

Value

A list with components:

table

A data frame with columns: covariate, estimate, std_error, ci_lower, ci_upper, p_value, bandwidth, n_left, n_right, significant.

plot

A ggplot2 coefficient plot showing the estimate and CI for each covariate.

References

Lee, D. S. and Lemieux, T. (2010). "Regression Discontinuity Designs in Economics." Journal of Economic Literature, 48(2), 281-355.

Examples

if (FALSE) { # \dontrun{
set.seed(42)
n <- 1000
x <- runif(n, -1, 1)
df <- data.frame(
  x   = x,
  age = 30 + 5 * x + rnorm(n),
  inc = 50000 + 10000 * x + rnorm(n, sd = 5000),
  edu = 12 + 2 * x + rnorm(n, sd = 1.5)
)

result <- rd_covariate_balance(
  data       = df,
  covariates = c("age", "inc", "edu"),
  x          = "x",
  c          = 0
)

result$plot
result$table
} # }