This function runs the bridge-penalized extended two-way fixed effects estimator (betwfe()) on
simulated data. It is simply a wrapper for betwfe(): it accepts an object of class
"FETWFE_simulated" (produced by simulateData()) and unpacks the necessary
components to pass to betwfe(). So the outputs match betwfe(), and the needed inputs
match their counterparts in betwfe().
betwfeWithSimulatedData(
simulated_obj,
lambda.max = NA,
lambda.min = NA,
nlambda = 100,
q = 0.5,
verbose = FALSE,
alpha = 0.05,
add_ridge = FALSE
)A named list with the following elements:
The estimated overall average treatment effect for a randomly selected treated unit.
If q < 1, a standard error for the ATT. If
indep_counts was provided, this standard error is asymptotically exact; if
not, it is asymptotically conservative. If q >= 1, this will be NA.
A named vector containing the estimated average treatment effects for each cohort.
If q < 1, a named vector
containing the (asymptotically exact, non-conservative) standard errors for
the estimated average treatment effects within each cohort.
A vector of the estimated probabilities of being in each
cohort conditional on being treated, which was used in calculating att_hat.
If indep_counts was provided, cohort_probs was calculated from that;
otherwise, it was calculated from the counts of units in each treated
cohort in pdata.
A dataframe displaying the cohort names,
average treatment effects, standard errors, and 1 - alpha confidence
interval bounds.
The full vector of estimated coefficients.
The indices of beta_hat corresponding to
the treatment effects for each cohort at each time.
The indices of beta_hat corresponding to the
interactions between the treatment effects for each cohort at each time and
the covariates.
Either the provided sig_eps_sq or
the estimated one, if a value wasn't provided.
Either
the provided sig_eps_c_sq or the estimated one, if a value wasn't
provided.
Either the provided lambda.max or the one
that was used, if a value wasn't provided. (This is returned to help with
getting a reasonable range of lambda values for grid search.)
The size of the selected model corresponding
lambda.max (for q <= 1, this will be the smallest model size). As
mentioned above, for q <= 1 ideally this value is close to 0.
Either the provided lambda.min or the one
that was used, if a value wasn't provided.
The
size of the selected model corresponding to lambda.min (for q <= 1, this
will be the largest model size). As mentioned above, for q <= 1 ideally
this value is close to p.
The value of lambda chosen
by BIC. If this value is close to lambda.min or lambda.max, that could
suggest that the range of lambda values should be expanded.
The size of the model that was selected. If
this value is close to lambda.max_model_size or lambda.min_model_size,
That could suggest that the range of lambda values should be expanded.
The design matrix created containing all interactions, time and cohort dummies, etc.
The vector of
responses, containing nrow(X_ints) entries.
The design matrix after applying the change in coordinates to fit the model and also multiplying on the left by the square root inverse of the estimated covariance matrix for each unit.
The final response after multiplying on the left by the square root inverse of the estimated covariance matrix for each unit.
The final number of units that were in the data set used for estimation (after any units may have been removed because they were treated in the first time period).
The number of time periods in the final data set.
The final number of treated cohorts that appear in the final data set.
The final number of covariates that appear in the final data set (after any covariates may have been removed because they contained missing values or all contained the same value for every unit).
The final number of columns in the full set of covariates used to estimate the model.
An object of class "FETWFE_simulated" containing the simulated panel
data and design matrix.
(Optional.) Numeric. A penalty parameter lambda will be
selected over a grid search by BIC in order to select a single model. The
largest lambda in the grid will be lambda.max. If no lambda.max is
provided, one will be selected automatically. For lambda <= 1, the model
will be sparse, and ideally all of the following are true at once: the
smallest model (the one corresponding to lambda.max) selects close to 0
features, the largest model (the one corresponding to lambda.min) selects
close to p features, nlambda is large enough so that models are
considered at every feasible model size, and nlambda is small enough so
that the computation doesn't become infeasible. You may
want to manually tweak lambda.max, lambda.min, and nlambda to try
to achieve these goals, particularly if the selected model size is very
close to the model corresponding to lambda.max or lambda.min, which could
indicate that the range of lambda values was too narrow. You can use the
function outputs lambda.max_model_size, lambda.min_model_size, and
lambda_star_model_size to try to assess this. Default is NA.
(Optional.) Numeric. The smallest lambda penalty
parameter that will be considered. See the description of lambda.max for
details. Default is NA.
(Optional.) Integer. The total number of lambda penalty
parameters that will be considered. See the description of lambda.max for
details. Default is 100.
(Optional.) Numeric; determines what L_q penalty is used for the
fusion regularization. q = 1 is the lasso, and for 0 < q < 1, it is
possible to get standard errors and confidence intervals. q = 2 is ridge
regression. See Faletto (2025) for details. Default is 0.5.
Logical; if TRUE, more details on the progress of the function will be printed as the function executes. Default is FALSE.
Numeric; function will calculate (1 - alpha) confidence intervals
for the cohort average treatment effects that will be returned in catt_df.
(Optional.) Logical; if TRUE, adds a small amount of ridge regularization to the (untransformed) coefficients to stabilize estimation. Default is FALSE.
if (FALSE) {
# Generate coefficients
coefs <- genCoefs(R = 5, T = 30, d = 12, density = 0.1, eff_size = 2, seed = 123)
# Simulate data using the coefficients
sim_data <- simulateData(coefs, N = 120, sig_eps_sq = 5, sig_eps_c_sq = 5)
result <- betwfeWithSimulatedData(sim_data)
}
Run the code above in your browser using DataLab