Package: EpiSODIC 0.24.0

Matthijs S. Berends

EpiSODIC: Epidemiological Signal Observation, Detection, Identification, and Classification

An automated surveillance system for infectious disease epidemiologists that detects aberrations in laboratory-confirmed infections, records epidemiologist's formal assessment with a full audit trail, and produces outbreak reports for clinical colleagues and infection prevention nurses. Applies evidence-based statistical methods such as Improved Farrington (2013) <doi:10.1002/sim.5595> and 'EpiEstim' (Cori et al. 2013) <doi:10.1093/aje/kwt133>. Ships with a synthetic demo data set requiring no external data or infrastructure.

Authors:Matthijs S. Berends [aut, cre], Certe Medical Diagnostics & Advice Foundation [cph, fnd], University Medical Center Groningen [cph, fnd]

EpiSODIC_0.24.0.tar.gz
EpiSODIC_0.24.0.zip(r-4.7-any)EpiSODIC_0.24.0.zip(r-4.6-any)EpiSODIC_0.24.0.zip(r-4.5-any)
EpiSODIC_0.24.0.tgz(r-4.6-any)EpiSODIC_0.24.0.tgz(r-4.5-any)
EpiSODIC_0.24.0.tar.gz(r-4.7-any)EpiSODIC_0.24.0.tar.gz(r-4.6-any)
EpiSODIC_0.24.0.tgz(r-4.6-emscripten)
manual.pdf |manual.html✨
DESCRIPTION |NEWS
card.svg |card.png
EpiSODIC/json (API)

# Install 'EpiSODIC' in R:
install.packages('EpiSODIC', repos = c('https://certe-medical-epidemiology.r-universe.dev', 'https://cloud.r-project.org'))

Bug tracker:https://github.com/certe-medical-epidemiology/episodic/issues

Pkgdown/docs site:https://certe-medical-epidemiology.github.io

On CRAN:

Conda:

epidemic-modellingepidemiologyshiny

4.54 score 6 scripts 36 exports 80 dependencies

Last updated from:13d45390cc. Checks:7 OK. Indexed: yes.

TargetResultTimeFilesSyslog
linux-develOK434
source / vignettesOK266
linux-releaseOK493
windows-develOK528
windows-releaseOK551
windows-oldrelOK543
wasm-releaseOK143

Exports:episodic_add_manual_clusterepisodic_add_userepisodic_check_casesepisodic_check_denominatorsepisodic_check_institution_activityepisodic_config_exportepisodic_db_connectepisodic_db_createepisodic_db_dsn_mariadbepisodic_db_dsn_mysqlepisodic_db_migrateepisodic_db_openepisodic_db_truncateepisodic_demoepisodic_geo_overlay_resolveepisodic_geo_source_resolveepisodic_mail_template_previewepisodic_notify_testepisodic_paletteepisodic_report_renderepisodic_run_appepisodic_run_cronepisodic_setup_microsoft365episodic_synthetic_casesepisodic_synthetic_cases_calibrationepisodic_synthetic_denominatorsepisodic_synthetic_ground_truthepisodic_synthetic_institution_activityepisodic_ui_code_joinepisodic_ui_epi_curve_chartepisodic_ui_italicise_taxonepisodic_ui_rt_chartepisodic_ui_trend_chartepisodic_validate_comparatorepisodic_validate_detectionepisodic_validate_rethreshold

Dependencies:AMRbase64encbitbit64blobbootbslibcachemclicommonmarkcpp11DBIdeldirdigestdplyrEnvStatsfarverfastmapfontawesomefsgenericsggplot2gluegtablehtmltoolshttpuvisobandjquerylibjsonlitelabelinglaterlatticelifecyclemagrittrMASSMatrixmclustmemmemoisemimenlmenortestotelpillarpkgconfigpolyclippolyCubpromisespurrrR6rappdirsRColorBrewerRcppRcppRollrlangRSQLiteS7sassscalesshinysmsodiumsourcetoolsspspatstat.dataspatstat.geomspatstat.univarspatstat.utilsstringistringrsurveillancetibbletidyrtidyselectutf8vctrsviridisLitewithrxtableyaml

Environment variables
Checking what they actually delivered

Last update: 2026-09-30
Started: 2026-08-24

Tuning detection for your catchment
Before you change anything | Too many false alarms | The Farrington bound is too narrow | same_place fires on endemic patterns | Suppression lets redundant signals through | Missing outbreaks | Farrington never fits | same_place thresholds are too high | The eligibility gate excludes a stream | Clusters close too early or too late | Clusters close before the outbreak is really over | Clusters stay open long after the last case | Cooldown absorption swallows a real recurrence | Priority ranking does not match your triage | Seasonal detection is wrong | MEM never runs | MEM fires too early or too late | Per-pathogen parameters | Verifying that a change helped | Against synthetic ground truth | Against your own board's verdicts | Reference | Reconciliation | Eligibility | Effect-size floor | same_place detector | Farrington detector | MEM detector | rare_trigger detector | Nowcast | Outbreak-end probability | Epidemic direction | Epidemic outlook | Typical past season | Priority score | Scale | Geography | Suppression | Notifications | Report | Access | Database | Per-pathogen CSV columns | See also

Last update: 2026-09-30
Started: 2026-09-19

Detection and reconciliation
The lattice: streams, not one big feed | Four detectors, not one algorithm | Scale routing: outbreaks and epidemics | Reconciliation: turning detections into outbreaks and epidemics | Epidemic closure | The "during" link | Suppression: one lattice, not five parallel views | Derived state, not a stored status | Declarations: a human act

Last update: 2026-09-28
Started: 2026-08-20

Overview
No dependency on any one laboratory system | Three altitudes | The Outbreaks screen: one outbreak at a time | The Epidemics screen: regional and seasonal | The Pathogen screen: one pathogen over a period | Beyond the three altitudes | The Performance screen: is detection itself working | The Archive screen: last winter's precedent | Streams and Activity: how the machinery is behaving | The Info screen | The Settings screen | Where to go next

Last update: 2026-09-28
Started: 2026-08-27

Deployment
The two things you provide | Configuration lives outside the repository | Accounts | Closing the app to anonymous visitors | Watching sign-ins | Where the database lives | Which servers this is tested against | Sharing a schema with something else | If you already have a MariaDB or MySQL database | Upgrading EpiSODIC | What a migration does, and does not do | When the schema is not the application's to change | Going back | Running the app | Behind a reverse proxy | Custom report templates | Scheduled reports | Optional pieces, and their fallbacks | Notifications | See also

Last update: 2026-09-28
Started: 2026-08-20

Frequently asked questions
Getting your data in | Running it day to day | Accounts and hosting

Last update: 2026-09-28
Started: 2026-08-23

Getting your data in
Cases (mandatory) | source_key: one identifier per result, not per specimen | One culture, more than one reported result | Deduplication is EpiSODIC's job, not yours | Check your data first | Positivity metadata (optional) | Institution activity (optional) | Geographic reference data (optional) | The choropleth map | L4 (province-level) detection | What a run reports | Clusters from another system (optional) | See also

Last update: 2026-09-28
Started: 2026-08-27

Notifications
Where to configure | Minimal example: ntfy | ntfy with authentication | SMTP (Gmail, institutional relay, any SMTP server) | sendmail (Linux/Unix) | Microsoft 365 | Option A: App-only (client credentials) -- recommended for unattended cron | Option B: Delegated (cached interactive token) | Option C: Reuse an already-cached login (no app registration needed) | Microsoft Teams | Setting up the webhook | Slack | Triggers | Dashboard link | Full reference example | Testing your setup | What a notification looks like | New clusters | Run failure | Colours and font | Your own email layout | Troubleshooting | See also

Last update: 2026-09-27
Started: 2026-08-31

Scheduled reports
Setting up a schedule | Cadence and delivery | What changed since last time | The email itself | Custom report templates and patient-level detail | See also

Last update: 2026-09-27
Started: 2026-09-06

Measuring detection against known truth
What it does | The ground truth is data | The two matching rules | What it reports, and how to read it | A comparator, and a control | Which detector earns its place | Where the real numbers live

Last update: 2026-09-21
Started: 2026-09-09

Readme and manuals

Help Manual

Help pageTopics
Add One or More Manual (External) Clustersepisodic_add_manual_cluster
Create an Account for a New Epidemiologist or Viewerepisodic_add_user
How sign-in worksepisodic_auth
Connect your own laboratory dataepisodic_case_data
Draw the Dashboard Charts (Epidemic Curve, Trend, and Rt)episodic_charts episodic_ui_epi_curve_chart episodic_ui_rt_chart episodic_ui_trend_chart
Check Your Case Data Before You Hand It to EpiSODICepisodic_check_cases
Check Your Positivity Data Before You Hand It to EpiSODICepisodic_check_denominators
Check Your Hospital Activity Data Before You Hand It to EpiSODICepisodic_check_institution_activity
Export the Resolved Configuration as a Zip Fileepisodic_config_export
Connect to an Existing EpiSODIC Databaseepisodic_db_connect
Set Up a New EpiSODIC Databaseepisodic_db_create
Connect EpiSODIC to a MariaDB or MySQL Serverepisodic_db_dsn_mariadb episodic_db_dsn_mysql
Bring an Existing Database up to the Current Schemaepisodic_db_migrate
Connect Using the 'EPISODIC_DB' Environment Variableepisodic_db_open
Empty Every EpiSODIC Table, Keeping the Schema Itselfepisodic_db_truncate
Try EpiSODIC With Synthetic Outbreak Dataepisodic_demo
Show Clusters on a Mapepisodic_geo episodic_geo_overlay_resolve episodic_geo_source_resolve
Preview an Email Templateepisodic_mail_template_preview
How notifications workepisodic_notifications
Send a Test Notification Through All Configured Channelsepisodic_notify_test
The Dashboard's Colour Palette and Typographyepisodic_palette
Render an Outbreak Report for Clinical Colleaguesepisodic_report_render
Open the EpiSODIC Dashboardepisodic_run_app
Run One Surveillance Detection Cycleepisodic_run_cron
How scheduled reports workepisodic_scheduled_reports
Set Up Microsoft 365 Authentication for Notificationsepisodic_setup_microsoft365
Generate Synthetic Outbreak Dataepisodic_synthetic_cases
Generate Synthetic Data at Tunable Cluster Volumeepisodic_synthetic_cases_calibration
Add a Testing-Volume (Positivity) Feedepisodic_synthetic_denominators
Read Back What Was Injected Into Synthetic Dataepisodic_synthetic_ground_truth
Add a Hospital Activity Feed (Patient-Days)episodic_synthetic_institution_activity
Format Text for Outbreak Reports and the Dashboardepisodic_ui_code_join episodic_ui_italicise_taxon
Measure a Trivial Rule Against the Same Known Truthepisodic_validate_comparator
Measure Detection Against Known Truthepisodic_validate_detection print.episodic_validation
Re-Match a Validation Result at Different Thresholdsepisodic_validate_rethreshold