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:
objectAnalytic 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:
- 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.
- 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: