bridge

Cross-paper bridge — analytic bounds between sample- and alarm-based metrics under a declared AlarmPolicy.

Useful when comparing a published paper that reported only sample-based AUC against a paper that reported only alarm-based sensitivity + FP/hr.

Derivations (informal):

Let - s = per-window sample sensitivity = P(yhat=1 | y=1) - α = per-window false-positive rate = 1 - specificity = P(yhat=1 | y=0) - π = pre-ictal-window prevalence = P(y=1) - K = ⌈SOP / cadence⌉ = number of independent prediction windows whose

“above-threshold” event would catch a seizure under the alarm semantics.

  • R = refractory_seconds (minimum gap between alarms after merging).

  • T = total observation duration (seconds).

ALARM SENSITIVITY (per-seizure detection probability):

Upper bound (independent errors, perfect coverage):

alarm_sens_upper = 1 - (1 - s) ** K

Lower bound (fully clustered errors — if any one of the K windows is correctly above threshold, all K are):

alarm_sens_lower = s

Prevalence-adjusted upper (when prevalence is very low, even ‘perfect’ sample-sens may not give K independent chances because there may not be K positive-labelled windows in the SOP):

K_eff = min(K, max(1, int(round(SOP * π / cadence)))) alarm_sens_upper_with_prevalence = 1 - (1 - s) ** K_eff

FP/hr:

Naive (no refractory, independent errors):

fp_hr_naive = α * (3600 / cadence) * (1 - π)

Refractory cap (no two alarms within R, regardless of α):

fp_hr_cap = 3600 / R

Upper bound:

fp_hr_upper = min(fp_hr_naive, fp_hr_cap)

Lower bound (under maximal correlation, FP-clustering, alarm count collapses; conservative non-trivial lower bound depends on the correlation length we cannot infer from sample metrics alone):

fp_hr_lower = 0.0 (we report 0 by convention; calibrated lower

bounds require an autocorr-proxy parameter).

References: - Andrade et al. 2024 — sample- vs alarm-based perspectives. - Mormann et al. 2007 — definition of false-prediction rate.

class scitex_seizure_metrics.bridge.SampleToAlarmBounds(alarm_sensitivity_upper, alarm_sensitivity_lower, fp_per_hour_lower, fp_per_hour_upper, K_effective=1, notes=())[source]

Bases: object

Analytic bounds on alarm-based metrics derived from sample-based.

Attrs:

alarm_sensitivity_upper: 1 - (1 - s) ** K_eff alarm_sensitivity_lower: s (worst-case clustering) fp_per_hour_lower: 0.0 by convention (correlation-dependent) fp_per_hour_upper: min(α * preds_per_hour * (1 - π), 3600 / R) K_effective: number of independent chances actually used notes: free-form list of pertinent caveats

Parameters:
  • alarm_sensitivity_upper (float)

  • alarm_sensitivity_lower (float)

  • fp_per_hour_lower (float)

  • fp_per_hour_upper (float)

  • K_effective (int)

  • notes (tuple[str, ...])

K_effective: int = 1
alarm_sensitivity_lower: float
alarm_sensitivity_upper: float
fp_per_hour_lower: float
fp_per_hour_upper: float
notes: tuple[str, ...] = ()
scitex_seizure_metrics.bridge.alarm_to_sample(*, alarm_sensitivity, fp_per_hour, sop_seconds, cadence_seconds, refractory_seconds=0.0, prevalence=0.5)[source]

Reverse-bound: feasible sample-metric ranges from alarm metrics.

Returns dict with sample_sensitivity_lower / upper and sample_specificity_lower / upper.

Parameters:
Return type:

dict

scitex_seizure_metrics.bridge.sample_to_alarm(*, sample_sensitivity, sample_specificity, sop_seconds, cadence_seconds, refractory_seconds=0.0, prevalence=0.5)[source]

Bound alarm-based metrics from sample-based metrics + AlarmPolicy.

Parameters:
  • sample_sensitivity (float) – per-window sensitivity (true-positive rate).

  • sample_specificity (float) – per-window specificity (1 - FPR).

  • sop_seconds (float) – Seizure Occurrence Period.

  • cadence_seconds (float) – time step between predictions.

  • refractory_seconds (float) – minimum gap between alarms.

  • prevalence (float) – per-window prior probability of pre-ictal class. Lower prevalence reduces K_effective (the number of independent chances to detect each seizure) AND reduces FP/hr (because the per-hour count of negative windows scales with 1-π).

Returns:

SampleToAlarmBounds with four numbers and K_effective.

Return type:

SampleToAlarmBounds