causalis.shared.srm

Sample Ratio Mismatch (SRM) utilities for randomized experiments.

This module provides a chi-square goodness-of-fit SRM check for randomized experiments. It accepts observed assignments as labels or aggregated counts and returns a compact result object with diagnostics.

Module Contents

Classes

SRMResult

Result of a Sample Ratio Mismatch (SRM) check.

Functions

check_srm

Check Sample Ratio Mismatch (SRM) for an RCT via a chi-square goodness-of-fit test.

Data

Number

__all__

API

causalis.shared.srm.Number

None

class causalis.shared.srm.SRMResult

Result of a Sample Ratio Mismatch (SRM) check.

Attributes

chi2 : float The calculated chi-square statistic. p_value : float The p-value of the test, rounded to 5 decimals. expected : dict[Hashable, float] Expected counts for each variant. observed : dict[Hashable, int] Observed counts for each variant. alpha : float Significance level used for the check. is_srm : bool True if an SRM was detected (chi-square p-value < alpha), False otherwise. warning : str or None Warning message if the test assumptions might be violated (e.g., small expected counts).

chi2: float

None

p_value: float

None

expected: Dict[Hashable, float]

None

observed: Dict[Hashable, int]

None

alpha: float

None

is_srm: bool

None

warning: str | None

None

__repr__() str
causalis.shared.srm.check_srm(assignments: Union[Iterable[Hashable], pandas.Series, causalis.dgp.causaldata.CausalData, collections.abc.Mapping[Hashable, causalis.shared.srm.Number]], target_allocation: Dict[Hashable, causalis.shared.srm.Number], alpha: float = 0.001, min_expected: float = 5.0, strict_variants: bool = True) causalis.shared.srm.SRMResult

Check Sample Ratio Mismatch (SRM) for an RCT via a chi-square goodness-of-fit test.

Parameters

assignments : Iterable[Hashable] or pandas.Series or CausalData or Mapping[Hashable, Number] Observed variant assignments. If iterable or Series, elements are labels per unit (user_id, session_id, etc.). If CausalData is provided, the treatment column is used. If a mapping is provided, it is treated as {variant: observed_count} with non-negative integer counts. target_allocation : dict[Hashable, Number] Mapping {variant: p} describing intended allocation as probabilities. alpha : float, default 1e-3 Significance level. Use strict values like 1e-3 or 1e-4 in production. min_expected : float, default 5.0 If any expected count < min_expected, a warning is attached. strict_variants : bool, default True - True: fail if observed variants differ from target keys. - False: drop unknown variants and test only on declared ones.

Returns

SRMResult The result of the SRM check.

Raises

ValueError If inputs are invalid or empty. ImportError If scipy is required but not installed.

Notes

  • Target allocation probabilities must sum to 1 within numerical tolerance.

  • is_srm is computed using the unrounded p-value; the returned p_value is rounded to 5 decimals.

  • Missing assignments are dropped and reported via warning.

  • Requires SciPy for p-value computation.

Examples

assignments = [“control”] * 50 + [“treatment”] * 50 check_srm(assignments, {“control”: 0.5, “treatment”: 0.5}, alpha=1e-3) SRMResult(status=no SRM, p_value=1.00000, chi2=0.0000)

counts = {“control”: 70, “treatment”: 30} check_srm(counts, {“control”: 0.5, “treatment”: 0.5}) SRMResult(status=SRM DETECTED, p_value=0.00006, chi2=16.0000)

causalis.shared.srm.__all__

[‘SRMResult’, ‘check_srm’]