# `causalis.scenarios.unconfoundedness.refutation.unconfoundedness.love_plot`

Love plot for covariate balance before and after weighting.

## Module Contents

### Functions

`love_plot` | Plot covariate balance before and after weighting implied by an estimate.

### Data

`__all__` |

### API

causalis.scenarios.unconfoundedness.refutation.unconfoundedness.love_plot.love_plot(data: causalis.dgp.causaldata.CausalData, estimate: causalis.data_contracts.causal_estimate.CausalEstimate, *, threshold: float = 0.1, figsize: Optional[Tuple[float, float]] = None, dpi: int = 220, font_scale: float = 1.1, save: Optional[str] = None, save_dpi: Optional[int] = None, transparent: bool = False) → matplotlib.pyplot.Figure

  Plot covariate balance before and after weighting implied by an estimate.

  Parameters

  data : CausalData Dataset used to fit the estimator. estimate : CausalEstimate Effect estimate with diagnostic data needed for balance diagnostics. threshold : float, default 0.10 Reference threshold for absolute standardized mean differences. figsize : tuple, optional Figure size. Defaults to an auto-scaled height based on confounder count. dpi : int, default 220 Dots per inch. font_scale : float, default 1.10 Font scaling factor. save : str, optional Path to save the figure. save_dpi : int, optional DPI for saving. transparent : bool, default False Whether to save with transparency.

  Returns

  matplotlib.figure.Figure The generated figure.

  Notes

  The Love plot visualizes the Absolute Standardized Mean Difference (ASMD) for each confounder both before and after weighting. The ASMD for confounder :math:`X_j` is defined as:

  .. math::

      \mathrm{ASMD}_j = \frac{|\bar{X}_{j,1} - \bar{X}_{j,0}|}{\sqrt{(s_{j,1}^2 + s_{j,0}^2)/2}}

  where :math:`\bar{X}_{j,d}` and :math:`s_{j,d}^2` are the weighted mean and variance of :math:`X_j` in treatment group :math:`d`. In the unweighted case, all weights are 1.

  Good balance is typically indicated by ASMD values below a threshold (e.g., 0.10) for all confounders after weighting.

  Examples

  > > > from sklearn.ensemble import RandomForestClassifier, RandomForestRegressor from causalis.dgp import obs_linear_26_dataset from causalis.scenarios.unconfoundedness.model import IRM

  > > > 1. Generate data

  > > > data = obs_linear_26_dataset(n=1000, seed=42, return_causal_data=True)

  > > > 2. Fit model with diagnostics enabled

  > > > irm = IRM( … data=data, … ml_g=RandomForestRegressor(random_state=42), … ml_m=RandomForestClassifier(random_state=42), … store_diagnostics=True … ) estimate = irm.fit().estimate()

  > > > 3. Generate Love plot

  > > > fig = love_plot(data, estimate, threshold=0.1) # doctest: +SKIP

causalis.scenarios.unconfoundedness.refutation.unconfoundedness.love_plot.__all__

  [‘love_plot’]