causallib.estimation.AIPW#
- class AIPW(outcome_model, weight_model, outcome_covariates=None, weight_covariates=None, overlap_weighting=False)[source]#
Calculates a doubly-robust estimate of the treatment effect by performing potential-outcome prediction (outcome_model) and then correcting its prediction-residuals using re-weighting from a treatment model (weight_model, like IPW).
It has two flavors, which slightly change the weighting of the outcome model in the correction term. Let e(X) be the estimated propensity score and m(X, A) is the estimated effect by an estimator, then the individual estimates are:
m(X,1) + A*(Y-m(X,1))/e(X), andm(X,0) + (1-A)*(Y-m(X,0))/(1-e(X))Which are basically add IP-weighted residuals from the observed predictions. As described in Kang and Schafer (2007) section 3.1 and Robins, Rotnitzky, and Zhao (1994).
The additional flavor when overlap_weighting=True is from Glynn and Quinn (2010), adds weighting by the propensity-of-the-other-class to the outcome model, so extreme example (with poor covariate overlap) will contribute less to the correction (i.e. rely less on their prediction value that might extrapolate too much). This is a similar notion used in Overlap Weights model (hence the argument name)
A * [Y - (1-e(X))m(X,1)]/e(X) + (1-A) * m(X,1), and(1-A) * [Y - e(X)m(X,0)]/(1-e(X)) + A * m(X,0)- Parameters:
outcome_model (
IndividualOutcomeEstimator) – A causal model that estimate on individuals level (e.g. Standardization).weight_model (
WeightEstimator | PropensityEstimator) – A causal model for weighting individuals (e.g. IPW). If overlap_weighting=True then must be a PropensityEstimator model.outcome_covariates (
numpy.ndarray) – Covariates to use for outcome model. If None - all covariates passed will be used. Either list of column names or boolean mask.weight_covariates (
numpy.ndarray) – Covariates to use for weight model. If None - all covariates passed will be used. Either list of column names or boolean mask.overlap_weighting (
bool) – Whether to tweak the outcome-model correction-term to rely less on data-points with poor covariate overlap (extreme propensity). if True, requires weight_model to be an instance of PropensityEstimator.
References
Kang and Schafer, 2007, (https://dx.doi.org/10.1214/07-STS227)
Kang and Schafer attribute the original method to Cassel, Särndal and Wretman.
Glynn and Quinn, 2010, https://doi.org/10.1093/pan/mpp036
Robins, Rotnitzky, and Zhao, 1994, https://doi.org/10.1080/01621459.1994.10476818
- __init__(outcome_model, weight_model, outcome_covariates=None, weight_covariates=None, overlap_weighting=False)[source]#
Calculates a doubly-robust estimate of the treatment effect by performing potential-outcome prediction (outcome_model) and then correcting its prediction-residuals using re-weighting from a treatment model (weight_model, like IPW).
It has two flavors, which slightly change the weighting of the outcome model in the correction term. Let e(X) be the estimated propensity score and m(X, A) is the estimated effect by an estimator, then the individual estimates are:
m(X,1) + A*(Y-m(X,1))/e(X), andm(X,0) + (1-A)*(Y-m(X,0))/(1-e(X))Which are basically add IP-weighted residuals from the observed predictions. As described in Kang and Schafer (2007) section 3.1 and Robins, Rotnitzky, and Zhao (1994).
The additional flavor when overlap_weighting=True is from Glynn and Quinn (2010), adds weighting by the propensity-of-the-other-class to the outcome model, so extreme example (with poor covariate overlap) will contribute less to the correction (i.e. rely less on their prediction value that might extrapolate too much). This is a similar notion used in Overlap Weights model (hence the argument name)
A * [Y - (1-e(X))m(X,1)]/e(X) + (1-A) * m(X,1), and(1-A) * [Y - e(X)m(X,0)]/(1-e(X)) + A * m(X,0)- Parameters:
outcome_model (
IndividualOutcomeEstimator) – A causal model that estimate on individuals level (e.g. Standardization).weight_model (
WeightEstimator | PropensityEstimator) – A causal model for weighting individuals (e.g. IPW). If overlap_weighting=True then must be a PropensityEstimator model.outcome_covariates (
numpy.ndarray) – Covariates to use for outcome model. If None - all covariates passed will be used. Either list of column names or boolean mask.weight_covariates (
numpy.ndarray) – Covariates to use for weight model. If None - all covariates passed will be used. Either list of column names or boolean mask.overlap_weighting (
bool) – Whether to tweak the outcome-model correction-term to rely less on data-points with poor covariate overlap (extreme propensity). if True, requires weight_model to be an instance of PropensityEstimator.
References
Kang and Schafer, 2007, (https://dx.doi.org/10.1214/07-STS227)
Kang and Schafer attribute the original method to Cassel, Särndal and Wretman.
Glynn and Quinn, 2010, https://doi.org/10.1093/pan/mpp036
Robins, Rotnitzky, and Zhao, 1994, https://doi.org/10.1080/01621459.1994.10476818
- fit(X, a, y, refit_weight_model=True, **kwargs)[source]#
Trains a causal model from observed data.
- Parameters:
X (
pandas.DataFrame) – Covariate matrix of size (num_subjects, num_features).a (
pandas.Series) – Treatment assignment of size (num_subjects,).y (
pandas.Series) – Observed outcome of size (num_subjects,).sample_weight – To be passed to the underlining scikit-learn’s fit method.
- Returns:
A causal weight model with an inner learner fitted.
- Return type:
IndividualOutcomeEstimator
- estimate_individual_outcome(X, a, treatment_values=None, predict_proba=None)[source]#
Estimates individual outcome under different treatment values (interventions).
Notes
This method utilizes only the standardization model behind the doubly-robust model. Namely, this is an uncorrected outcome (that does not incorporates the weighted observed outcome). To get a true doubly-robust estimation use the estimate_population_outcome, rather than an individual outcome.
- Parameters:
X (
pandas.DataFrame) – Covariate matrix of size (num_subjects, num_features).a (
pandas.Series) – Treatment assignment of size (num_subjects,).treatment_values (
Any) – Desired treatment value/s to use when estimating the counterfactual outcome/ If not supplied, calculates for all available treatment values.predict_proba (
bool | None) – In case the outcome task is classification and in case learner supports the operation, if True - prediction will utilize learner’s predict_proba or decision_function which returns a continuous matrix of size (n_samples, n_classes). If False - predict will be used and return value will be based on a vector of class classifications.
- Returns:
- DataFrame which columns are treatment values and rows are individuals: each column is a vector
size (num_samples,) that contains the estimated outcome for each individual under the treatment value in the corresponding key.
- Return type:
- estimate_population_outcome(X, a, y=None, treatment_values=None, predict_proba=None, agg_func='mean')[source]#
Doubly-robust averaging, combining the individual counterfactual predictions from the standardization model and the weighted observed outcomes to estimate population outcome for each treatment subgroup.
- Parameters:
X (
pandas.DataFrame) – Covariate matrix of size (num_subjects, num_features).a (
pandas.Series) – Treatment assignment of size (num_subjects,).y (
pandas.Series) – Observed outcome of size (num_subjects,).treatment_values (
Any) – Desired treatment value/s to stratify upon before aggregating individual into population outcome. If not supplied, calculates for all available treatment values.predict_proba (
bool | None) – To be used when provoking estimate_individual_outcome. In case the outcome task is classification and in case learner supports the operation, if True - prediction will utilize learner’s predict_proba or decision_function which returns a continuous matrix of size (n_samples, n_classes). If False - predict will be used and return value will be based on a vector of class classifications.agg_func (
str) – Type of aggregation function (e.g. “mean” or “median”).
- Returns:
- Series which index are treatment values, and the values are numbers - the aggregated outcome for
the strata of people whose assigned treatment is the key.
- Return type:
- estimate_effect(outcome1, outcome2, agg='population', effect_types='diff')[source]#
Estimates an effect given two potential outcomes.
- Parameters:
outcome1 (
pandas.Series) – A potential outcome.outcome2 (
pandas.Series) – A potential outcome.agg (
str) – Either “population” or “individual” - whether to calculate individual effect or population effect.effect_types (
list[str] | str) – Any iterable of strings from the set of EffectEstimator.CALCULATE_EFFECT keys
- Returns:
- A Series if population effect (input is scalar) with index are the effect types
and values are the corresponding computed effect. A DataFrame if individual effect (input is a vector) where columns are effects types and rows are effect in each individual. Always: Value type is the same as outcome_1 and outcome_2 type.
- Return type:
- set_fit_request(*, a='$UNCHANGED$', refit_weight_model='$UNCHANGED$')#
Configure whether metadata should be requested to be passed to the
fitmethod.Note that this method is only relevant when this estimator is used as a sub-estimator within a meta-estimator and metadata routing is enabled with
enable_metadata_routing=True(seesklearn.set_config()). Please check the User Guide on how the routing mechanism works.The options for each parameter are:
True: metadata is requested, and passed tofitif provided. The request is ignored if metadata is not provided.False: metadata is not requested and the meta-estimator will not pass it tofit.None: metadata is not requested, and the meta-estimator will raise an error if the user provides it.str: metadata should be passed to the meta-estimator with this given alias instead of the original name.
The default (
sklearn.utils.metadata_routing.UNCHANGED) retains the existing request. This allows you to change the request for some parameters and not others.Added in version 1.3.
- Parameters:
- Returns:
self – The updated object.
- Return type: