results Module#

Unified rich result classes for Episia public API.

This module provides a consistent result interface across all Episia modules. Every public function returns a subclass of EpiResult, ensuring consistent serialization and visualization.

Base Classes#

class episia.api.results.EpiResult[source]#

Bases: ABC

Abstract base class for all Episia result objects.

All public-API results inherit from this class and share:
  • Serialization: to_dict(), to_json(), to_dataframe()

  • Metadata: confidence, method, warnings

  • Visualization: plot()

plot(backend='plotly', **kwargs)[source]#

Render a visualization of this result.

Parameters:
  • backend (str) – ‘plotly’ (default, interactive) or ‘matplotlib’ (publication).

  • **kwargs – Passed to the underlying plot function.

to_dataframe()[source]#

Return a pandas DataFrame summary of the result.

abstract to_dict()[source]#

Return a JSON-serializable dictionary of all result fields.

Return type:

Dict[str, Any]

to_json(indent=2)[source]#

Serialize result to a JSON string.

Parameters:

indent (int)

Return type:

str

class episia.api.results.ConfidenceInterval(lower, upper, confidence=0.95, method='wald')[source]#

Bases: object

Container for a confidence interval.

Parameters:
lower#

Lower bound.

Type:

float

upper#

Upper bound.

Type:

float

confidence#

Confidence level (e.g. 0.95).

Type:

float

method#

Method used to compute the interval.

Type:

str

__init__(lower, upper, confidence=0.95, method='wald')#
Parameters:
Return type:

None

confidence: float = 0.95#
contains(value)[source]#

Return True if value falls within the interval.

Parameters:

value (float)

Return type:

bool

lower: float#
method: str = 'wald'#
to_dict()[source]#
Return type:

Dict[str, Any]

upper: float#

Result Classes#

class episia.api.results.AssociationResult(measure, estimate, ci, p_value=None, null_value=1.0, method='wald', n_total=None, metadata=<factory>)[source]#

Bases: EpiResult

Result for a single association measure (RR, OR, RD…).

Parameters:
measure#

Name of the measure (e.g. ‘risk_ratio’).

Type:

str

estimate#

Point estimate.

Type:

float

ci#

ConfidenceInterval object.

Type:

episia.api.results.ConfidenceInterval

p_value#

P-value for the null hypothesis.

Type:

float | None

null_value#

Null hypothesis value (1.0 for ratios, 0.0 for differences).

Type:

float

method#

Statistical method used.

Type:

str

n_total#

Total sample size.

Type:

int | None

metadata#

Extra key/value pairs (exposed/unexposed counts, etc.).

Type:

Dict[str, Any]

__init__(measure, estimate, ci, p_value=None, null_value=1.0, method='wald', n_total=None, metadata=<factory>)#
Parameters:
Return type:

None

ci: ConfidenceInterval#
estimate: float#
measure: str#
metadata: Dict[str, Any]#
method: str = 'wald'#
n_total: int | None = None#
null_value: float = 1.0#
p_value: float | None = None#
property significant: bool#

True if the CI does not contain the null value.

to_dict()[source]#

Return a JSON-serializable dictionary of all result fields.

Return type:

Dict[str, Any]

class episia.api.results.ProportionResult(proportion, ci, numerator=None, denominator=None, label='proportion', metadata=<factory>)[source]#

Bases: EpiResult

Result for a proportion or rate with confidence interval.

Parameters:
proportion#

Point estimate.

Type:

float

ci#

ConfidenceInterval.

Type:

episia.api.results.ConfidenceInterval

numerator#

Event count.

Type:

int | None

denominator#

Population at risk.

Type:

int | None

label#

Human-readable label (e.g. ‘attack_rate’).

Type:

str

metadata#

Extra context.

Type:

Dict[str, Any]

__init__(proportion, ci, numerator=None, denominator=None, label='proportion', metadata=<factory>)#
Parameters:
Return type:

None

ci: ConfidenceInterval#
denominator: int | None = None#
label: str = 'proportion'#
metadata: Dict[str, Any]#
numerator: int | None = None#
proportion: float#
to_dict()[source]#

Return a JSON-serializable dictionary of all result fields.

Return type:

Dict[str, Any]

class episia.api.results.SampleSizeResult(n_total=None, n_per_group=None, n_cases=None, n_controls=None, power=None, alpha=0.05, effect_size=None, design='', method='', assumptions=<factory>, note=None)[source]#

Bases: EpiResult

Result for a sample size or statistical power calculation.

Parameters:
n_total#

Total required sample size.

Type:

int | None

n_per_group#

Per-group size for balanced designs.

Type:

int | None

n_cases#

Cases required (case-control designs).

Type:

int | None

n_controls#

Controls required.

Type:

int | None

power#

Achieved or requested power.

Type:

float | None

alpha#

Significance level.

Type:

float

effect_size#

Effect size used.

Type:

float | None

design#

Study design name.

Type:

str

method#

Calculation method.

Type:

str

assumptions#

Input parameters for traceability.

Type:

Dict[str, Any]

note#

Optional interpretive note.

Type:

str | None

__init__(n_total=None, n_per_group=None, n_cases=None, n_controls=None, power=None, alpha=0.05, effect_size=None, design='', method='', assumptions=<factory>, note=None)#
Parameters:
Return type:

None

alpha: float = 0.05#
assumptions: Dict[str, Any]#
design: str = ''#
effect_size: float | None = None#
method: str = ''#
n_cases: int | None = None#
n_controls: int | None = None#
n_per_group: int | None = None#
n_total: int | None = None#
note: str | None = None#
power: float | None = None#
to_dict()[source]#

Return a JSON-serializable dictionary of all result fields.

Return type:

Dict[str, Any]

class episia.api.results.DiagnosticResult(sensitivity, specificity, ppv, npv, lr_positive, lr_negative, accuracy, youden, tp=0, fp=0, fn=0, tn=0, prevalence=None, ci_sensitivity=None, ci_specificity=None)[source]#

Bases: EpiResult

Result for a diagnostic test performance evaluation.

Parameters:
sensitivity#

True positive rate.

Type:

float

specificity#

True negative rate.

Type:

float

ppv#

Positive predictive value.

Type:

float

npv#

Negative predictive value.

Type:

float

lr_positive#

Positive likelihood ratio.

Type:

float

lr_negative#

Negative likelihood ratio.

Type:

float

accuracy#

Overall accuracy.

Type:

float

youden#

Youden’s J index.

Type:

float

tp, fp, fn, tn

Confusion matrix counts.

prevalence#

Prevalence used (sample or provided).

Type:

float | None

ci_sensitivity#

CI for sensitivity.

Type:

episia.api.results.ConfidenceInterval | None

ci_specificity#

CI for specificity.

Type:

episia.api.results.ConfidenceInterval | None

__init__(sensitivity, specificity, ppv, npv, lr_positive, lr_negative, accuracy, youden, tp=0, fp=0, fn=0, tn=0, prevalence=None, ci_sensitivity=None, ci_specificity=None)#
Parameters:
Return type:

None

accuracy: float#
ci_sensitivity: ConfidenceInterval | None = None#
ci_specificity: ConfidenceInterval | None = None#
fn: int = 0#
fp: int = 0#
lr_negative: float#
lr_positive: float#
npv: float#
ppv: float#
prevalence: float | None = None#
sensitivity: float#
specificity: float#
tn: int = 0#
to_dict()[source]#

Return a JSON-serializable dictionary of all result fields.

Return type:

Dict[str, Any]

tp: int = 0#
youden: float#
class episia.api.results.ROCResult(fpr, tpr, thresholds, auc, optimal_threshold, optimal_point, method='youden')[source]#

Bases: EpiResult

Result for ROC curve analysis.

Parameters:
fpr#

False positive rates array.

Type:

numpy.ndarray

tpr#

True positive rates array.

Type:

numpy.ndarray

thresholds#

Threshold values array.

Type:

numpy.ndarray

auc#

Area under the curve.

Type:

float

optimal_threshold#

Threshold maximising the chosen criterion.

Type:

float

optimal_point#

Dict with sens/spec at optimal threshold.

Type:

Dict[str, float]

method#

Criterion for optimal threshold selection.

Type:

str

__init__(fpr, tpr, thresholds, auc, optimal_threshold, optimal_point, method='youden')#
Parameters:
Return type:

None

auc: float#
fpr: ndarray#
method: str = 'youden'#
optimal_point: Dict[str, float]#
optimal_threshold: float#
thresholds: ndarray#
to_dict()[source]#

Return a JSON-serializable dictionary of all result fields.

Return type:

Dict[str, Any]

tpr: ndarray#
class episia.api.results.StratifiedResult(measure, mh_estimate, ci, p_value=None, homogeneity_p=None, effect_modifier=False, stratum_results=<factory>, n_strata=0)[source]#

Bases: EpiResult

Result for stratified (Mantel-Haenszel) analysis.

Parameters:
measure#

‘mh_risk_ratio’ or ‘mh_odds_ratio’.

Type:

str

mh_estimate#

Pooled MH estimate.

Type:

float

ci#

CI for pooled estimate.

Type:

episia.api.results.ConfidenceInterval

p_value#

P-value for pooled test.

Type:

float | None

homogeneity_p#

P-value for Breslow-Day homogeneity test.

Type:

float | None

effect_modifier#

True if homogeneity rejected (p < 0.05).

Type:

bool

stratum_results#

Per-stratum AssociationResult list.

Type:

List[episia.api.results.AssociationResult]

n_strata#

Number of strata.

Type:

int

__init__(measure, mh_estimate, ci, p_value=None, homogeneity_p=None, effect_modifier=False, stratum_results=<factory>, n_strata=0)#
Parameters:
Return type:

None

ci: ConfidenceInterval#
effect_modifier: bool = False#
homogeneity_p: float | None = None#
measure: str#
mh_estimate: float#
n_strata: int = 0#
p_value: float | None = None#
stratum_results: List[AssociationResult]#
to_dict()[source]#

Return a JSON-serializable dictionary of all result fields.

Return type:

Dict[str, Any]

class episia.api.results.ModelResult(model_type, t, compartments, parameters, r0=None, peak_infected=None, peak_time=None, final_size=None, metadata=<factory>)[source]#

Bases: EpiResult

Result for a compartmental epidemic model simulation.

Parameters:
model_type#

‘SIR’, ‘SEIR’, ‘SEIRD’, etc.

Type:

str

t#

Time array.

Type:

numpy.ndarray

compartments#

Dict of compartment name to array.

Type:

Dict[str, numpy.ndarray]

parameters#

Input parameters (beta, gamma, R0…).

Type:

Dict[str, float]

r0#

Basic reproduction number.

Type:

float | None

peak_infected#

Peak infected count.

Type:

float | None

peak_time#

Time of peak infection.

Type:

float | None

final_size#

Total proportion infected at end.

Type:

float | None

metadata#

Extra simulation context.

Type:

Dict[str, Any]

__init__(model_type, t, compartments, parameters, r0=None, peak_infected=None, peak_time=None, final_size=None, metadata=<factory>)#
Parameters:
Return type:

None

compartments: Dict[str, ndarray]#
final_size: float | None = None#
metadata: Dict[str, Any]#
model_type: str#
parameters: Dict[str, float]#
peak_infected: float | None = None#
peak_time: float | None = None#
r0: float | None = None#
t: ndarray#
to_dataframe()[source]#

Return time-series DataFrame with one column per compartment.

to_dict()[source]#

Return a JSON-serializable dictionary of all result fields.

Return type:

Dict[str, Any]

class episia.api.results.TimeSeriesResult(times, values, trend=None, trend_method=None, doubling_time=None, metadata=<factory>)[source]#

Bases: EpiResult

Result for temporal epidemiological analysis (incidence, trends).

Parameters:
times#

Array of time points or period labels.

Type:

numpy.ndarray

values#

Observed values (counts or rates).

Type:

numpy.ndarray

trend#

Fitted trend values (if computed).

Type:

numpy.ndarray | None

trend_method#

Name of trend method used.

Type:

str | None

doubling_time#

Estimated doubling time (if applicable).

Type:

float | None

metadata#

Additional analysis context.

Type:

Dict[str, Any]

__init__(times, values, trend=None, trend_method=None, doubling_time=None, metadata=<factory>)#
Parameters:
Return type:

None

doubling_time: float | None = None#
metadata: Dict[str, Any]#
times: ndarray#
to_dataframe()[source]#

Return a pandas DataFrame summary of the result.

to_dict()[source]#

Return a JSON-serializable dictionary of all result fields.

Return type:

Dict[str, Any]

trend: ndarray | None = None#
trend_method: str | None = None#
values: ndarray#
class episia.api.results.RegressionResult(model_type, coefficients, p_values, ci_table, odds_ratios=None, aic=None, bic=None, n=None, converged=True)[source]#

Bases: EpiResult

Result for logistic or Poisson regression.

Parameters:
model_type#

‘logistic’, ‘poisson’, ‘linear’.

Type:

str

coefficients#

Dict of variable to coefficient.

Type:

Dict[str, float]

odds_ratios#

Dict of variable to OR (logistic only).

Type:

Dict[str, float] | None

ci_table#

Dict of variable to (lower, upper) CI tuple.

Type:

Dict[str, Tuple[float, float]]

p_values#

Dict of variable to p-value.

Type:

Dict[str, float]

aic#

Akaike information criterion.

Type:

float | None

bic#

Bayesian information criterion.

Type:

float | None

n#

Sample size.

Type:

int | None

converged#

Whether optimisation converged.

Type:

bool

__init__(model_type, coefficients, p_values, ci_table, odds_ratios=None, aic=None, bic=None, n=None, converged=True)#
Parameters:
Return type:

None

aic: float | None = None#
bic: float | None = None#
ci_table: Dict[str, Tuple[float, float]]#
coefficients: Dict[str, float]#
converged: bool = True#
model_type: str#
n: int | None = None#
odds_ratios: Dict[str, float] | None = None#
p_values: Dict[str, float]#
to_dict()[source]#

Return a JSON-serializable dictionary of all result fields.

Return type:

Dict[str, Any]

Factory Functions#

episia.api.results.make_ci(lower, upper, confidence=0.95, method='wald')[source]#

Convenience factory for ConfidenceInterval.

Parameters:
Return type:

ConfidenceInterval

episia.api.results.make_association(measure, estimate, ci_lower, ci_upper, confidence=0.95, method='wald', p_value=None, null_value=1.0, n_total=None, **metadata)[source]#

Convenience factory for AssociationResult.

Parameters:
Return type:

AssociationResult

episia.api.results.make_proportion(proportion, ci_lower, ci_upper, numerator=None, denominator=None, label='proportion', confidence=0.95, method='wilson')[source]#

Convenience factory for ProportionResult.

Parameters:
Return type:

ProportionResult