Dataset statistics
How large are the datasets that the public MEDS ETLs produce, and how do they differ? Several
ETL maintainers publish a summary of their converted dataset, computed with
meds_summary_stats. This page collects those
files each time the site is built, together with the summaries committed to this site's repository for datasets
whose ETL repository doesn't publish one, and charts them side by side.
The files are safe to publish by design: meds_summary_stats never writes out a code, reports no minimum or
maximum value (only percentiles), and suppresses every split, calendar year or vocabulary that fewer than 20
subjects contribute to, keeping only a pooled <suppressed> total. This page shows such cells as suppressed and
never estimates them. It does not chart calendar years, because most datasets shift their dates to de-identify
them.
Datasets and their stats files
| Dataset | Dataset name and version | Stats file | Extracted | Schema |
|---|---|---|---|---|
| MIMIC-IV | MIMIC-IV 3.1:0.2.1.dev6+g08cde7301 | 2026-11-05 | 1 (tool 0.0.3) | |
| eICU | eICU 2.0:0.2.0 | 2026-11-04 | 1 (tool 0.0.3) | |
| INSPIRE | INSPIRE 1.4.2 | 2026-11-04 | 1 (tool 0.0.3) | |
| MC-MED | MC-MED 1.0.1:0.1.0 | 2026-11-08 | 1 (tool 0.0.3) | |
| HiRID | hirid 1.1.1:0.1.0 | 2026-11-04 | 1 (tool 0.0.3) | |
| NWICU | NWICU 0.1.0:1.0.0 | 2026-11-04 | 1 (tool 0.0.3) | |
| SICdb | SICdb 1.0.8:0.1.0 | 2026-11-04 | 1 (tool 0.0.3) | |
| AUMCdb | AUMCdb 1.0.2:0.1.1.dev6+g28e8cdaa1.d20261104 | 2026-11-04 | 1 (tool 0.0.3) | |
| INSPECT | INSPECT 1.2† | inspect_full_summary_stats.jsonin this site's repository | 2026-11-10 | 1 (tool 0.0.3) |
| ALOTT | ALOTT 1.0.0:0.0.1 | 2026-11-04 | 1 (tool 0.0.3) | |
| PIC | PICdb 1.1.0:0.0.3 | 2026-11-04 | 1 (tool 0.0.3) | |
| EHRSHOT | EHRSHOT 3.2† | ehrshot_full_summary_stats.jsonin this site's repository | 2026-11-10 | 1 (tool 0.0.3) |
| CDSL | CDSL 1.0.0:0.0.1 | 2026-11-04 | 1 (tool 0.0.3) | |
| Zigong | Zigong 1.1:0.3.0 | 2026-11-04 | 1 (tool 0.0.3) | |
| eICU demo | eICU 2.0.1:0.2.0 | 2026-11-04 | 1 (tool 0.0.3) | |
| K-MIMIC (synthetic) | SYN-ICU 1.0 | 2026-08-24 | 1 (tool 0.0.2) | |
| MIMIC-IV demo | MIMIC-IV 2.2:0.2.0 | 2026-10-30 | 1 (tool 0.0.2) |
† Set in this site's configuration (static/data/etl_summary_stats.yaml) rather than taken from the stats file.
No stats file yet in these ETL repositories from the ecosystem: ETL Template, MEDS-ETL, MEDS Extract, EHR2Trace, WeavEHR, EHR2MEDS, MESSY Synth, EHRSHOT, OMOP (via dedicated OMOP_MEDS), FHIR.
Dataset size
Events (rows) and distinct codes in each dataset, side by side, with the most events first. The axis is logarithmic: each labelled gridline is ten times the last, and the fainter gridlines between them mark 2 to 9 times. The table below also lists each dataset's subjects.
Show the numbers
| Dataset | Subjects | Events | Unique codes |
|---|---|---|---|
| eICU | 166,355 | 1,112,756,293 | 15,528 |
| MIMIC-IV | 364,627 | 881,400,075 | 148,193 |
| HiRID | 33,905 | 775,040,967 | 654 |
| INSPECT | 19,390 | 225,029,469 | 55,672 |
| AUMCdb | 20,109 | 194,203,035 | 14,225 |
| INSPIRE | 99,900 | 140,689,363 | 4,515 |
| SICdb | 21,566 | 68,584,759 | 4,547 |
| MC-MED | 70,545 | 60,573,081 | 56,444 |
| ALOTT | 18,472 | 52,592,412 | 47,130 |
| NWICU | 25,923 | 51,018,616 | 27,463 |
| EHRSHOT | 6,731 | 19,643,798 | 55,872 |
| PIC | 12,881 | 16,442,378 | 9,876 |
| eICU demo | 2,174 | 11,443,674 | 8,122 |
| Zigong | 2,790 | 5,136,602 | 4,979 |
| CDSL | 4,479 | 3,988,718 | 5,621 |
| K-MIMIC (synthetic) | 1,328 | 1,381,580 | 204 |
| MIMIC-IV demo | 100 | 1,024,925 | 10,249 |
Depth vs. breadth
One bubble per dataset. Across is its breadth: the number of subjects it has. Up is its depth: the median number of events per subject. The bubble's area shows the number of unique codes. Both axes are logarithmic, with fainter gridlines at 2 to 9 times each power of ten. Datasets further right are broader, and those higher up are deeper.
Show the numbers
| Dataset | Subjects | Median events per subject | Unique codes |
|---|---|---|---|
| MIMIC-IV | 364,627 | 306 | 148,193 |
| eICU | 166,355 | 3,565 | 15,528 |
| INSPIRE | 99,900 | 810 | 4,515 |
| MC-MED | 70,545 | 498 | 56,444 |
| HiRID | 33,905 | 9,232 | 654 |
| NWICU | 25,923 | 1,178 | 27,463 |
| SICdb | 21,566 | 1,523 | 4,547 |
| AUMCdb | 20,109 | 645 | 14,225 |
| INSPECT | 19,390 | 5,758 | 55,672 |
| ALOTT | 18,472 | 1,466 | 47,130 |
| PIC | 12,881 | 903 | 9,876 |
| EHRSHOT | 6,731 | 1,279 | 55,872 |
| CDSL | 4,479 | 449 | 5,621 |
| Zigong | 2,790 | 1,056 | 4,979 |
| eICU demo | 2,174 | 2,840.5 | 8,122 |
| K-MIMIC (synthetic) | 1,328 | 1,057 | 204 |
| MIMIC-IV demo | 100 | 4,712.5 | 10,249 |
How much data each subject has
The spread across subjects: each box runs from the 25th to the 75th percentile with the median marked inside, and the whiskers reach the 5th and 95th percentiles. The stats files publish no minimum or maximum, by design. The axis is logarithmic: each labelled gridline is ten times the last, and the fainter gridlines between them mark 2 to 9 times.
Show the numbers
| Dataset | Subjects | 5th pct. | 25th pct. | Median | 75th pct. | 95th pct. |
|---|---|---|---|---|---|---|
| MIMIC-IV | 364,627 | 3 | 89 | 306 | 1,477 | 10,856.7 |
| eICU | 166,355 | 785 | 1,919 | 3,565 | 7,104 | 23,294 |
| INSPIRE | 99,900 | 235 | 481 | 810 | 1,505 | 4,132 |
| MC-MED | 70,545 | 39 | 160 | 498 | 1,063 | 2,802.8 |
| HiRID | 33,905 | 2,513.2 | 5,205 | 9,232 | 19,083 | 95,767.2 |
| NWICU | 25,923 | 240 | 600 | 1,178 | 2,333 | 6,347.9 |
| SICdb | 21,566 | 305 | 682 | 1,523 | 3,111.8 | 11,942.8 |
| AUMCdb | 20,109 | 170 | 316 | 645 | 2,362 | 22,281.6 |
| INSPECT | 19,390 | 185 | 1,575 | 5,758 | 15,245.5 | 40,710.6 |
| ALOTT | 18,472 | 375 | 729 | 1,466 | 3,278.5 | 9,782 |
| PIC | 12,881 | 188 | 549 | 903 | 1,473 | 3,557 |
| EHRSHOT | 6,731 | 47 | 396 | 1,279 | 3,296.5 | 11,110 |
| CDSL | 4,479 | 122 | 274 | 449 | 893 | 3,327.7 |
| Zigong | 2,790 | 224.5 | 578.3 | 1,056 | 2,049 | 5,738.5 |
| eICU demo | 2,174 | 497 | 1,509 | 2,840.5 | 5,670.3 | 18,838.8 |
| K-MIMIC (synthetic) | 1,328 | 660.4 | 859.8 | 1,057 | 1,204 | 1,437.9 |
| MIMIC-IV demo | 100 | 1,337.9 | 2,687.5 | 4,712.5 | 11,297.2 | 38,785 |
Pace of events
How densely each dataset records data: each subject's own rate, their timed events divided by the days from their earliest to their latest one, as per_subject.measurements_per_day in a stats file gives it. Birth and death records are left out, so that birth dates and registry deaths don't stretch the span, and subjects with fewer than two distinct timestamps have no rate and aren't counted. Each box runs from the 25th to the 75th percentile of subjects, with the median marked inside, and the whiskers reach the 5th and 95th percentiles. Very short records give very large rates, so the chart shows these percentiles rather than the mean. The datasets are ranked by their median.
No dataset can be drawn in this chart:
- MIMIC-IV, eICU, INSPIRE, MC-MED, HiRID, NWICU, SICdb, AUMCdb, INSPECT, ALOTT, PIC, EHRSHOT, CDSL, Zigong, eICU demo, K-MIMIC (synthetic), MIMIC-IV demo: Their stats files have no per-subject events per day (per_subject.measurements_per_day).
Record coverage
Birth, Death and Static: the share of subjects with a birth record, a death record and static (time-less) data. Numeric: the share of events that carry a numeric value. Darker cells are higher shares.
How long the tail of codes is
For each dataset, the share of events whose code is not among its N most frequent codes (up), against N (across). Both axes are logarithmic, with fainter gridlines at 2 to 9 times each power of ten. As in a power-law plot, a curve that falls in a straight line means that code frequencies fall off as a power of their rank, as in Zipf's law. The steeper a curve falls, the faster its tail thins out. One that drops a labelled gridline (ten times fewer events outside) for every labelled gridline across (ten times as many codes) has a slope of −1; a flatter one has a longer tail of rarer codes. Curves bend down as they near a dataset's number of codes, where the tail runs out. No line is fitted: the points are the published figures, joined by lines. They are the shares of the top 10, 100 and 1,000 codes, and how many codes it takes to cover 50%, 90% and 99% of events (leaving 50%, 10% and 1% outside). A point that leaves nothing outside, such as all of a dataset's codes, can't go on a logarithmic axis and is left out. Each dataset has its own colour, line style and marker; click a legend entry to hide that dataset, double-click it to show only that one, or highlight one to compare it against the rest.
Show the numbers
| Dataset | Outside the top 10 codes | Outside the top 100 | Outside the top 1,000 | Codes to cover 50% | Codes to cover 90% | Codes to cover 99% | Unique codes |
|---|---|---|---|---|---|---|---|
| MIMIC-IV | 91% | 64% | 13% | 185 | 1,393 | 10,282 | 148,193 |
| eICU | 38% | 10% | 1.5% | 6 | 101 | 1,671 | 15,528 |
| INSPIRE | 62% | 9.3% | 0.29% | 16 | 94 | 586 | 4,515 |
| MC-MED | 25% | 9.6% | 2.6% | 4 | 95 | 3,579 | 56,444 |
| HiRID | 32% | 0.45% | 0% | 6 | 19 | 66 | 654 |
| NWICU | 78% | 44% | 13% | 67 | 1,319 | 6,316 | 27,463 |
| SICdb | 72% | 22% | 0.33% | 34 | 181 | 683 | 4,547 |
| AUMCdb | 74% | 18% | 2.6% | 27 | 248 | 1,922 | 14,225 |
| INSPECT | 63% | 17% | 5.3% | 19 | 327 | 5,950 | 55,672 |
| ALOTT | 62% | 42% | 13% | 51 | 1,449 | 8,909 | 47,130 |
| PIC | 82% | 27% | 1.6% | 43 | 270 | 1,268 | 9,876 |
| EHRSHOT | 68% | 48% | 25% | 78 | 3,871 | 19,797 | 55,872 |
| CDSL | 33% | 10% | 0.56% | 7 | 103 | 680 | 5,621 |
| Zigong | 56% | 25% | 0.61% | 14 | 238 | 819 | 4,979 |
| eICU demo | 36% | 8.8% | 1.2% | 6 | 87 | 1,297 | 8,122 |
| K-MIMIC (synthetic) | 76% | 2.4% | 0% | 21 | 55 | 118 | 204 |
| MIMIC-IV demo | 88% | 61% | 9.6% | 160 | 969 | 4,523 | 10,249 |
Mapping to vocabularies
How each dataset's codes map to vocabularies such as LOINC or ICD-10, through the parent codes in its code metadata. Every cell is a share, printed and shaded on a logarithmic scale (darker is larger) so that small shares still show. The first two columns count each event and code once: Any vocabulary is the share of events whose code maps to any vocabulary, de-duplicated, and Codes with a parent the share of the distinct codes in the data that have a parent code. After the gap, each column is one vocabulary (ICD groups several, see below): the share of events whose code has a parent in it. A code can map into several vocabularies, so a row's vocabulary shares can add up to more than its Any vocabulary share. Vocabularies used by the most datasets come first, and a blank grey cell means the dataset doesn't use that vocabulary. Datasets whose code metadata maps no codes show 0% and “No vocabulary mapping”.
Scroll the heatmap sideways to see every vocabulary.
* A standard OMOP CDM vocabulary, as recognised by meds_summary_stats.
ICD groups the vocabularies whose names start with ICD: ICD10, ICD10CM, ICD10GM, ICD10PCS, ICD9CM, ICD9Proc and ICDO3. Its cell is the share of events whose code has a parent in at least one of them. Where the stats file reports that no code has parents in more than one vocabulary, that is the sum of their shares. Otherwise a code can count in several, and the file only bounds the share: from below by the largest ICD share, and by the share mapped to any vocabulary minus the shares of all other vocabularies (including suppressed ones, and parent codes that name none, where the file gives these); from above by the sum of the ICD shares, and by the share mapped to any vocabulary. The cell gives one value where the bounds round alike, and the range otherwise (MC-MED). Suppressed vocabularies are not named, so none of them is counted as ICD. Hover over a cell for each ICD vocabulary's own share.
Not shown in this chart:
- INSPECT: 19 more vocabularies are suppressed, as each is reached by fewer than 20 subjects, so they have no column.
- EHRSHOT: 3 more vocabularies are suppressed, as each is reached by fewer than 20 subjects, so they have no column.
Health check
Invariants every MEDS dataset should meet, from each stats file. A check mark means the check passes, a warning sign that it needs a look, and a question mark that the stats file doesn't report it. Codes with a description pass at 90% or more. The versions, and codes listed in codes.parquet but not used, are information without a verdict.
| Dataset | Empty or null codes and subject IDs | Data codes missing from codes.parquet | Invalid numeric values | Codes with a description | Listed codes not in the data | MEDS and ETL versions |
|---|---|---|---|---|---|---|
| MIMIC-IV | None | None | None | 99.9% | None | MEDS 0.4.1 MEDS_transforms 0.7.0 |
| eICU | None | None | None | 100% | None | MEDS 0.4.1 MEDS_transforms 0.7.0 |
| INSPIRE | None | None | None | 74.8% | None | MEDS 0.4.1 MEDS_transforms 0.7.0 |
| MC-MED | None | None | None | 95.5% | None | MEDS 0.4.1 MEDS_transforms 0.7.1 |
| HiRID | None | None | None | 99.3% | None | MEDS 0.4.1 MEDS_transforms 0.7.0 |
| NWICU | None | None | None | 100% | None | MEDS 0.4.1 MEDS_transforms 0.7.0 |
| SICdb | None | None | None | 99.5% | None | MEDS 0.4.1 MEDS_transforms 0.7.0 |
| AUMCdb | None | None | None | 100% | None | MEDS 0.4.1 MEDS_transforms 0.7.1 |
| INSPECT | None | 99.3% | None | 100% | 95,028 codes | MEDS 0.3.3 meds_etl.omop 0.3.9.dev11+gba0eec1.d20250131 |
| ALOTT | None | None | None | 92.8% | None | MEDS 0.4.1 MEDS_transforms 0.7.0 |
| PIC | None | None | None | 99.9% | None | MEDS 0.4.1 MEDS_transforms 0.7.0 |
| EHRSHOT | None | None | None | 99.9% | None | MEDS 0.4.1 MEDS_transforms 0.6.7 |
| CDSL | None | None | None | 88.8% | None | MEDS 0.4.1 MEDS_transforms 0.7.0 |
| Zigong | None | None | None | 100% | None | MEDS 0.4.1 MEDS_transforms 0.7.0 |
| eICU demo | None | None | None | 100% | None | MEDS 0.4.1 MEDS_transforms 0.7.0 |
| K-MIMIC (synthetic) | None | None | None | 55.3% | None | MEDS 0.3.3 kmimic-meds 0.2.0 |
| MIMIC-IV demo | None | None | None | 99.9% | None | MEDS 0.4.1 MEDS_transforms 0.7.0 |
- Empty or null codes and subject IDs: Rows whose code is empty or null, or whose subject_id is null. MEDS requires both on every row, so there should be none.
- Data codes missing from codes.parquet: Codes that occur in the data but have no row in metadata/codes.parquet, as a percentage of the distinct codes in the data or as a number of codes. MEDS requires every code to be listed there, so there should be none.
- Invalid numeric values: Numeric values that are NaN or infinite. A missing value should be null instead, so there should be none.
- Codes with a description: The share of the codes in codes.parquet that have a description. It passes at 90% or more and is flagged below that.
- Listed codes not in the data: Codes in codes.parquet that never occur in the data. MEDS allows this, e.g. for a whole vocabulary, so it is shown as information, not as a problem.
- MEDS and ETL versions: The MEDS version, and the ETL that wrote the dataset with its version, as metadata/dataset.json states them.
Add your dataset
If you maintain a MEDS ETL, run meds_summary_stats on its output and commit the result to your repository with a
file name containing summary_stats and ending in .json, e.g. tests/regression/full_summary_stats.json:
uvx --from meds_summary_stats extract_MEDS_summary_stats /path/to/your/MEDS/dataset -o full_summary_stats.json
If your ETL is listed in the ecosystem, it appears here the next time this site is built;
name the file *demo*summary_stats*.json for a demo dataset. Otherwise, add your repository to
static/data/etl_summary_stats.yaml.
The same file is also a regression baseline: compare_MEDS_summary_stats and the
meds_summary_stats GitHub Action check
new ETL versions against it.
If there is no ETL repository to commit the file to, open a pull request that adds it to this site's repository
under static/data/etl_summary_stats/ and lists it under local_files in the same YAML file. If the dataset's
metadata/dataset.json doesn't give its name or version as the dataset is published, set them there with
dataset_name and dataset_version, and say where they come from in a note; the page marks them as set in
the configuration.