The hardware and bandwidth for this mirror is donated by dogado GmbH, the Webhosting and Full Service-Cloud Provider. Check out our Wordpress Tutorial.
If you wish to report a bug, or if you are interested in having us mirror your free-software or open-source project, please feel free to contact us at mirror[@]dogado.de.

Introduction

What is Syrona?

Syrona compares health datasets built on the OMOP Common Data Model. Given two OMOP CDM databases (or two cohorts within the same database), it:

  1. Extracts stratified prevalence tables across three clinical domains (conditions, procedures, drugs)
  2. Compares paired datasets by computing log2 prevalence ratios per stratum
  3. Synthesizes (pools) results via multi-level random-effects meta-analysis

The output is a set of CSV tables that can be explored in the Syrona dashboard or consumed by downstream tools.

How it differs from other OHDSI tools

Tool Purpose
ACHILLES Profile a single database (aggregate statistics)
CohortDiagnostics Validate cohort definitions (incidence, attrition)
CohortContrast Feature selection: target vs control within one database
Syrona Compare 2 datasets (cohorts, sites) by prevalences of the 3 domains (diagnoses, procedures, drugs)

Syrona is designed for multi-site comparisons where you want to understand how prevalence patterns differ between institutions, countries, or data sources.

Installation

# From GitHub:
# install.packages("remotes")
remotes::install_github("HealthInformaticsUT/syrona")

Dependencies

Quick start

1. Connect to a database

library(syrona)

# PostgreSQL (the typical production CDM; e.g. via SSH tunnel).
# Omit `password` and set PGPASSWORD in ~/.Renviron, or use ~/.pgpass.
db <- syrona_connect_pg(
  dbname = "omop",
  user = "analyst",
  cdm_schema = "cdm",
  write_schema = "results_analyst"
)

# Or a local DuckDB file (read-only by default)
db <- syrona_connect("path/to/omop.duckdb")

2. Extract a dataset

# Extract all three domains
tables <- extract_all("Dataset_A", db = db)

# Or a single domain (faster for large databases)
tables <- extract_all("Dataset_A", db = db, domains = "conditions")

3. Compare two datasets

# After extracting both datasets:
compare_all("Dataset_A", "Dataset_B")

4. Disconnect

syrona_disconnect(db)

Output structure

Syrona writes CSV files to two directories:

data/
  sources/                        # Phase 1: extracted datasets
    Dataset_A/
      _metadata.csv
      condition_prevalence.csv    # concept x year x sex x age_group
      condition_info.csv          # concept metadata
      condition_chapters.csv      # SNOMED/ICD-10 chapter assignments
      condition_attributes.csv    # SNOMED relationship targets
      demographics.csv            # birth year x sex counts
      death_counts.csv            # deaths by stratum
      ...                         # same pattern for procedures + drugs
    Dataset_B/
      ...
  comparisons/                    # Phase 2-3: comparison results
    Dataset_A_vs_Dataset_B/
      _metadata.csv
      condition_yearly.csv        # per-stratum prevalence ratios
      condition_meta_agegroups.csv # meta across years
      condition_meta_by_sex.csv   # meta across age groups
      condition_meta_summary.csv  # final summary (one row per concept)
      ...                         # same pattern for procedures + drugs

Next steps

These binaries (installable software) and packages are in development.
They may not be fully stable and should be used with caution. We make no claims about them.
Health stats visible at Monitor.