# `causalis.scenarios.unconfoundedness.refutation.score.residual_plots`

Residual diagnostic plots for nuisance models g0/g1 and m.

## Module Contents

### Functions

`plot_residual_diagnostics` | Plot residual diagnostics for nuisance models.

### Data

`__all__` |

### API

causalis.scenarios.unconfoundedness.refutation.score.residual_plots.plot_residual_diagnostics(estimate: causalis.data_contracts.causal_estimate.CausalEstimate, data: Optional[causalis.dgp.causaldata.CausalData] = None, *, clip_propensity: float = 1e-06, n_bins: int = 20, marker_size: float = 12.0, alpha: float = 0.35, max_scatter_points: Optional[int] = None, random_state: Optional[int] = None, figsize: Tuple[float, float] = (14.0, 4.8), dpi: int = 220, font_scale: float = 1.1, save: Optional[str] = None, save_dpi: Optional[int] = None, transparent: bool = False) → matplotlib.pyplot.Figure

  Plot residual diagnostics for nuisance models.

  Panels

  1. Treated-only: `u1 = y - g1` vs `g1`.

  2. Control-only: `u0 = y - g0` vs `g0`.

  3. Binned calibration error: `E[d - m | m in bin]` vs binned `m`.

  Notes

  These plots check the nuisance pieces directly:

  - outcome residuals :math:`u_1 = Y - \hat g_1(X)` and :math:`u_0 = Y - \hat g_0(X)` should look roughly centered around zero without strong patterns against fitted values,

  - treatment residuals :math:`D - \hat m(X)` should average near zero within propensity bins.

  Clear trends usually mean the nuisance models still leave structure in the data, which can show up later as unstable score diagnostics.

  Parameters

  estimate : CausalEstimate Estimate with diagnostic data (`m_hat`, `g0_hat`; optionally `g1_hat`, `y`, `d`). data : CausalData, optional Optional fallback source for `y` and `d` when missing in diagnostic data. clip_propensity : float, default 1e-6 Clipping epsilon for propensity values in the treatment-residual panel. n_bins : int, default 20 Number of quantile bins for the binned-mean trend overlays. marker_size : float, default 12.0 Scatter marker size. alpha : float, default 0.35 Scatter opacity. max_scatter_points : int, optional Maximum number of points drawn in each residual scatter panel. When set, scatter points are sampled uniformly without replacement, while the binned-mean overlays and calibration panel still use all observations. random_state : int, optional Random seed used when `max_scatter_points` triggers scatter sampling. figsize : tuple, default (14.0, 4.8) Figure size. 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.

  Examples

  > > > from sklearn.ensemble import RandomForestClassifier, RandomForestRegressor from causalis.dgp import obs_linear_26_dataset from causalis.scenarios.unconfoundedness.model import IRM data = obs_linear_26_dataset( … n=1000, … seed=3141, … include_oracle=False, … return_causal_data=True, … ) irm = IRM( … data=data, … ml_g=RandomForestRegressor( … n_estimators=200, … max_depth=6, … min_samples_leaf=5, … random_state=3141, … ), … ml_m=RandomForestClassifier( … n_estimators=200, … max_depth=6, … min_samples_leaf=5, … random_state=3141, … ), … n_folds=3, … random_state=3141, … ) estimate = irm.fit().estimate(score=”ATE”) fig = plot_residual_diagnostics(estimate, data=data) # doctest: +SKIP

causalis.scenarios.unconfoundedness.refutation.score.residual_plots.__all__

  [‘plot_residual_diagnostics’]