Skip to content

Data Schemas

Pydantic data contracts for all inference results, configurations, and diagnostics.

data_schemas

Pydantic data contracts for Bayesian A/B test resources.

Defines request / response schemas for the non-paired Beta-Bernoulli model, the paired Laplace model, and the paired Pólya-Gamma Gibbs model.

CredibleInterval

Bases: BaseModel

Symmetric credible (or confidence) interval.

BetaParams

Bases: BaseModel

Parameters of a Beta distribution.

SavageDickeyResult

Bases: BaseModel

Result of a Savage-Dickey density-ratio Bayes factor test.

PosteriorProbH0Result

Bases: BaseModel

Posterior probability of H0 under a spike-and-slab prior.

PPCStatistic

Bases: BaseModel

Single posterior predictive check statistic.

NonPairedTrueParams

Bases: BaseModel

True parameters used to generate non-paired simulation data.

NonPairedSimResult

Bases: BaseModel

Output of :func:simulate_nonpaired_scores.

PairedTrueParams

Bases: BaseModel

True parameters used to generate paired simulation data.

PairedSimResult

Bases: BaseModel

Output of :func:simulate_paired_scores.

NonPairedConfig

Bases: BaseModel

Configuration for :class:NonPairedBayesPropTest.

NonPairedTestResult

Bases: BaseModel

Output of :meth:NonPairedBayesPropTest.test.

NonPairedSummary

Bases: BaseModel

Summary produced by :meth:NonPairedBayesPropTest.fit.

PairedSummary

Bases: BaseModel

Summary produced by :meth:PairedBayesPropTest.fit (Laplace or PG).

PairedLaplaceConfig

Bases: BaseModel

Configuration for :class:PairedBayesPropTest (Laplace approximation).

PairedPGConfig

Bases: BaseModel

Configuration for :class:PairedBayesPropTestPG (PG Gibbs sampler).

MCMCParamDiagnostic

Bases: BaseModel

MCMC convergence diagnostics for a single parameter.

MCMCDiagnostics

Bases: BaseModel

MCMC diagnostics for all parameters.

ROPEResult

Bases: BaseModel

Result of a ROPE (Region of Practical Equivalence) analysis.

Decision rules (Kruschke, 2018):

  • 95% CI entirely outside ROPE → Reject H₀
  • 95% CI entirely inside ROPE → Accept H₀
  • 95% CI overlaps ROPE → Undecided
from_samples(samples, rope=(-0.02, 0.02), ci_mass=0.95) classmethod

Compute ROPE decision from posterior samples.

Parameters:

Name Type Description Default
samples NDArray[floating]

1-D array of posterior draws for Δ (e.g. θ_A − θ_B).

required
rope tuple[float, float]

(lower, upper) bounds of the ROPE.

(-0.02, 0.02)
ci_mass float

Credible interval mass (default 95%).

0.95

Returns:

Name Type Description
Populated ROPEResult

class:ROPEResult.

Source code in bayesprop/resources/data_schemas.py
@classmethod
def from_samples(
    cls,
    samples: npt.NDArray[np.floating],
    rope: tuple[float, float] = (-0.02, 0.02),
    ci_mass: float = 0.95,
) -> ROPEResult:
    """Compute ROPE decision from posterior samples.

    Args:
        samples: 1-D array of posterior draws for Δ (e.g. θ_A − θ_B).
        rope: (lower, upper) bounds of the ROPE.
        ci_mass: Credible interval mass (default 95%).

    Returns:
        Populated :class:`ROPEResult`.
    """
    alpha = (1 - ci_mass) / 2
    ci_lower = float(np.quantile(samples, alpha))
    ci_upper = float(np.quantile(samples, 1 - alpha))

    pct_in = float(np.mean((samples >= rope[0]) & (samples <= rope[1])))
    pct_below = float(np.mean(samples < rope[0]))
    pct_above = float(np.mean(samples > rope[1]))

    if ci_lower > rope[1]:
        decision = "Reject H0 — A practically better"
        interpretation = "95% CI entirely above ROPE — meaningful positive effect"
    elif ci_upper < rope[0]:
        decision = "Reject H0 — B practically better"
        interpretation = "95% CI entirely below ROPE — meaningful negative effect"
    elif ci_lower >= rope[0] and ci_upper <= rope[1]:
        decision = "Accept H0 — practically equivalent"
        interpretation = "95% CI entirely inside ROPE — effect is negligible"
    else:
        decision = "Undecided — CI overlaps ROPE"
        interpretation = "95% CI overlaps ROPE boundary — more data needed"

    return cls(
        rope_lower=rope[0],
        rope_upper=rope[1],
        ci_lower=ci_lower,
        ci_upper=ci_upper,
        ci_mass=ci_mass,
        pct_in_rope=pct_in,
        pct_below_rope=pct_below,
        pct_above_rope=pct_above,
        decision=decision,
        interpretation=interpretation,
    )

HypothesisDecision

Bases: BaseModel

Composite hypothesis test result combining multiple decision frameworks.

Depending on the chosen :attr:rule, one or more of the sub-results will be populated.

SequentialPosteriorState

Bases: BaseModel

Running Beta posterior state for a sequential non-paired test.

By Beta-Bernoulli conjugacy this is the prior for the next batch.

SequentialLookResult

Bases: BaseModel

Snapshot of the sequential test after a single look (batch update).

SequentialLaplaceState

Bases: BaseModel

Running Laplace posterior state for the sequential paired model.

Carries the MAP estimate and 2x2 covariance of (mu, delta_A) on the logit scale, recomputed from cumulative sufficient statistics at every look.

SequentialLaplaceLookResult

Bases: BaseModel

Snapshot of the sequential paired Laplace test after a single look.