cleverly.ModelSpec#

class cleverly.ModelSpec(outcome_learner: Any = None, treatment_learner: Any = None, missingness_learner: Any = None, intermediate_learner: Any = None, pseudo_learner: Any = None, censoring_learner: Any = None, density_bins: int | None = None, ratio: Literal['density', 'classifier'] = 'density', screen_treatment: bool = False, screen_threshold: float = 0.1, min_retain: int | None = None, outcome_by_arm: bool = False, survival_model: Literal['iterated_mean', 'hazard'] = 'iterated_mean')[source]#

Configure nuisance learning for TMLE methods.

Parameters:
outcome_learnerestimator or None

Outcome-regression learner. None uses the default library.

treatment_learnerestimator or None

Treatment-mechanism learner.

missingness_learnerestimator or None

Observation learner. It fits the outcome observation mechanism and, for a declared missing treatment, the treatment observation mechanism P(Delta_A = 1 | W).

intermediate_learnerestimator or None

Intermediate-variable learner for controlled direct effects.

pseudo_learnerestimator or None

Sequential pseudo-outcome learner.

censoring_learnerestimator or None

Longitudinal observation-mechanism learner.

density_binsint or None

Number of bins for a continuous-treatment conditional density. None grows the count with the sample, max(20, ceil(2 n^(1/3))). A growing count is necessary for a consistent density, and the hazard learner must also be consistent.

ratio{“density”, “classifier”}

How a modified treatment policy’s density ratio is estimated. "density" divides two fitted conditional densities. "classifier" reads the odds of a stacked classifier (Díaz et al. 2023, Section 5.4). It applies to a point fit with ModifiedTreatmentPolicy and to a longitudinal fit with a continuous or vector node. A study refuses "classifier" where no policy ratio is estimated.

screen_treatmentbool

Whether to screen treatment-mechanism covariates by correlation.

screen_thresholdfloat

Absolute correlation threshold used by screening.

min_retainint or None

Minimum number of covariates retained by screening.

outcome_by_armbool

Whether to fit one outcome regression per treatment arm, each on the arm’s rows and the covariates alone (R’s drtmle(stratify=TRUE)). The default fits one regression on the covariates and the treatment. A continuous dose has no arms and is refused, and so is a longitudinal design.

survival_model{“iterated_mean”, “hazard”}

How a longitudinal fit models a survival curve. "hazard" targets the cause-specific hazards of a held baseline treatment; see LTMLE. A point-treatment fit refuses "hazard".

See also

TMLEMethod

Method configuration this object is the model half of.

cleverly.SuperLearner

Ensemble to pass when one learner is not enough.

CrossFitting

How the learners set here are fitted out of fold.

Examples

>>> from cleverly import ModelSpec
>>> from sklearn.linear_model import LinearRegression
>>> models = ModelSpec(outcome_learner=LinearRegression())
>>> type(models.outcome_learner).__name__
'LinearRegression'

Fit one outcome regression for each treatment arm, as drtmle(stratify=TRUE) does:

>>> ModelSpec(outcome_learner=LinearRegression(), outcome_by_arm=True).outcome_by_arm
True

Methods#

Attributes#

ModelSpec.censoring_learner: Any = None#
ModelSpec.density_bins: int | None = None#
ModelSpec.intermediate_learner: Any = None#
ModelSpec.min_retain: int | None = None#
ModelSpec.missingness_learner: Any = None#
ModelSpec.outcome_by_arm: bool = False#
ModelSpec.outcome_learner: Any = None#
ModelSpec.pseudo_learner: Any = None#
ModelSpec.ratio: Literal['density', 'classifier'] = 'density'#
ModelSpec.screen_threshold: float = 0.1#
ModelSpec.screen_treatment: bool = False#
ModelSpec.survival_model: Literal['iterated_mean', 'hazard'] = 'iterated_mean'#
ModelSpec.treatment_learner: Any = None#