Source code for scitex_seizure_metrics.papers.maturana2020

"""Maturana et al. 2020 (Nat Commun) replica metrics.

Paper: 'Critical slowing down as a biomarker for seizure susceptibility'.
Reports: per-patient AUROC, IoC, time-in-warning. Long-window (hours-
to-days) features, causal filtering.

Citation: Maturana MI et al., Nat Commun 2020; 11: 2172.
doi:10.1038/s41467-020-15908-3
"""
from __future__ import annotations

import numpy as np

from .. import detection, forecasting
from ..policy import AlarmPolicy


[docs] def metrics(*, y_true, y_proba, times_seconds=None, seizure_times=None, sph_seconds: float = 0.0, sop_seconds: float = 60 * 60, n_surrogate: int = 500, name: str = "maturana2020") -> dict: """Reproduce the metric panel from Maturana 2020. Differs from Karoly 2017: shorter SPH (≈ 0, immediate forecast), longer SOP (1 h default), Poisson surrogate (no circadian baseline in the paper). Returns: dict with auroc, alarm_sensitivity, ioc, fp_per_hour, time_in_warning_frac, sensitivity_range_per_patient (if 2-D). """ out = {"paper": "maturana2020", "name": name} rep = detection.evaluate(y_true, y_proba, name=name) out["auroc"] = rep.roc_auc if times_seconds is not None and seizure_times is not None: policy = AlarmPolicy( sph_seconds=sph_seconds, sop_seconds=sop_seconds, cadence_seconds=float(np.median(np.diff(times_seconds))), refractory_seconds=sop_seconds, ) frep = forecasting.evaluate_stream( y_proba, times_seconds, seizure_times, policy, n_surrogate=n_surrogate, surrogate="poisson", name=name, ) out["alarm_sensitivity"] = frep.sensitivity out["ioc"] = frep.ioc out["fp_per_hour"] = frep.fp_per_hour out["time_in_warning_frac"] = frep.time_in_warning_frac return out