Skip to main content

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​

DatasetDataset name and versionStats fileExtractedSchema
MIMIC-IVMIMIC-IV 3.1:0.2.1.dev6+g08cde7301
full_summary_stats.jsonin Medical-Event-Data-Standard/MIMIC_IV_MEDS
2026-11-051 (tool 0.0.3)
eICUeICU 2.0:0.2.02026-11-041 (tool 0.0.3)
INSPIREINSPIRE 1.4.22026-11-041 (tool 0.0.3)
MC-MEDMC-MED 1.0.1:0.1.02026-11-081 (tool 0.0.3)
HiRIDhirid 1.1.1:0.1.02026-11-041 (tool 0.0.3)
NWICUNWICU 0.1.0:1.0.02026-11-041 (tool 0.0.3)
SICdbSICdb 1.0.8:0.1.02026-11-041 (tool 0.0.3)
AUMCdbAUMCdb 1.0.2:0.1.1.dev6+g28e8cdaa1.d202611042026-11-041 (tool 0.0.3)
INSPECTINSPECT 1.2†
inspect_full_summary_stats.jsonin this site's repository
2026-11-101 (tool 0.0.3)
ALOTTALOTT 1.0.0:0.0.12026-11-041 (tool 0.0.3)
PICPICdb 1.1.0:0.0.32026-11-041 (tool 0.0.3)
EHRSHOTEHRSHOT 3.2†
ehrshot_full_summary_stats.jsonin this site's repository
2026-11-101 (tool 0.0.3)
CDSLCDSL 1.0.0:0.0.12026-11-041 (tool 0.0.3)
ZigongZigong 1.1:0.3.02026-11-041 (tool 0.0.3)
eICU demoeICU 2.0.1:0.2.02026-11-041 (tool 0.0.3)
K-MIMIC (synthetic)SYN-ICU 1.02026-08-241 (tool 0.0.2)
MIMIC-IV demoMIMIC-IV 2.2:0.2.02026-10-301 (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
DatasetSubjectsEventsUnique codes
eICU166,3551,112,756,29315,528
MIMIC-IV364,627881,400,075148,193
HiRID33,905775,040,967654
INSPECT19,390225,029,46955,672
AUMCdb20,109194,203,03514,225
INSPIRE99,900140,689,3634,515
SICdb21,56668,584,7594,547
MC-MED70,54560,573,08156,444
ALOTT18,47252,592,41247,130
NWICU25,92351,018,61627,463
EHRSHOT6,73119,643,79855,872
PIC12,88116,442,3789,876
eICU demo2,17411,443,6748,122
Zigong2,7905,136,6024,979
CDSL4,4793,988,7185,621
K-MIMIC (synthetic)1,3281,381,580204
MIMIC-IV demo1001,024,92510,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.

100K codes10K codesBubble area is proportional to the number of unique codes. Datasets with fewer than about 3K codes are drawn at the smallest size, so they stay visible.
Show the numbers
DatasetSubjectsMedian events per subjectUnique codes
MIMIC-IV364,627306148,193
eICU166,3553,56515,528
INSPIRE99,9008104,515
MC-MED70,54549856,444
HiRID33,9059,232654
NWICU25,9231,17827,463
SICdb21,5661,5234,547
AUMCdb20,10964514,225
INSPECT19,3905,75855,672
ALOTT18,4721,46647,130
PIC12,8819039,876
EHRSHOT6,7311,27955,872
CDSL4,4794495,621
Zigong2,7901,0564,979
eICU demo2,1742,840.58,122
K-MIMIC (synthetic)1,3281,057204
MIMIC-IV demo1004,712.510,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
DatasetSubjects5th pct.25th pct.Median75th pct.95th pct.
MIMIC-IV364,6273893061,47710,856.7
eICU166,3557851,9193,5657,10423,294
INSPIRE99,9002354818101,5054,132
MC-MED70,545391604981,0632,802.8
HiRID33,9052,513.25,2059,23219,08395,767.2
NWICU25,9232406001,1782,3336,347.9
SICdb21,5663056821,5233,111.811,942.8
AUMCdb20,1091703166452,36222,281.6
INSPECT19,3901851,5755,75815,245.540,710.6
ALOTT18,4723757291,4663,278.59,782
PIC12,8811885499031,4733,557
EHRSHOT6,731473961,2793,296.511,110
CDSL4,4791222744498933,327.7
Zigong2,790224.5578.31,0562,0495,738.5
eICU demo2,1744971,5092,840.55,670.318,838.8
K-MIMIC (synthetic)1,328660.4859.81,0571,2041,437.9
MIMIC-IV demo1001,337.92,687.54,712.511,297.238,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
DatasetOutside the top 10 codesOutside the top 100Outside the top 1,000Codes to cover 50%Codes to cover 90%Codes to cover 99%Unique codes
MIMIC-IV91%64%13%1851,39310,282148,193
eICU38%10%1.5%61011,67115,528
INSPIRE62%9.3%0.29%16945864,515
MC-MED25%9.6%2.6%4953,57956,444
HiRID32%0.45%0%61966654
NWICU78%44%13%671,3196,31627,463
SICdb72%22%0.33%341816834,547
AUMCdb74%18%2.6%272481,92214,225
INSPECT63%17%5.3%193275,95055,672
ALOTT62%42%13%511,4498,90947,130
PIC82%27%1.6%432701,2689,876
EHRSHOT68%48%25%783,87119,79755,872
CDSL33%10%0.56%71036805,621
Zigong56%25%0.61%142388194,979
eICU demo36%8.8%1.2%6871,2978,122
K-MIMIC (synthetic)76%2.4%0%2155118204
MIMIC-IV demo88%61%9.6%1609694,52310,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.

DatasetEmpty or null codes and subject IDsData codes missing from codes.parquetInvalid numeric valuesCodes with a descriptionListed codes not in the dataMEDS and ETL versions
MIMIC-IVPassesNonePassesNonePassesNonePasses99.9%NoneMEDS 0.4.1 MEDS_transforms 0.7.0
eICUPassesNonePassesNonePassesNonePasses100%NoneMEDS 0.4.1 MEDS_transforms 0.7.0
INSPIREPassesNonePassesNonePassesNoneWarning74.8%NoneMEDS 0.4.1 MEDS_transforms 0.7.0
MC-MEDPassesNonePassesNonePassesNonePasses95.5%NoneMEDS 0.4.1 MEDS_transforms 0.7.1
HiRIDPassesNonePassesNonePassesNonePasses99.3%NoneMEDS 0.4.1 MEDS_transforms 0.7.0
NWICUPassesNonePassesNonePassesNonePasses100%NoneMEDS 0.4.1 MEDS_transforms 0.7.0
SICdbPassesNonePassesNonePassesNonePasses99.5%NoneMEDS 0.4.1 MEDS_transforms 0.7.0
AUMCdbPassesNonePassesNonePassesNonePasses100%NoneMEDS 0.4.1 MEDS_transforms 0.7.1
INSPECTPassesNoneWarning99.3%PassesNonePasses100%95,028 codesMEDS 0.3.3 meds_etl.omop 0.3.9.dev11+gba0eec1.d20250131
ALOTTPassesNonePassesNonePassesNonePasses92.8%NoneMEDS 0.4.1 MEDS_transforms 0.7.0
PICPassesNonePassesNonePassesNonePasses99.9%NoneMEDS 0.4.1 MEDS_transforms 0.7.0
EHRSHOTPassesNonePassesNonePassesNonePasses99.9%NoneMEDS 0.4.1 MEDS_transforms 0.6.7
CDSLPassesNonePassesNonePassesNoneWarning88.8%NoneMEDS 0.4.1 MEDS_transforms 0.7.0
ZigongPassesNonePassesNonePassesNonePasses100%NoneMEDS 0.4.1 MEDS_transforms 0.7.0
eICU demoPassesNonePassesNonePassesNonePasses100%NoneMEDS 0.4.1 MEDS_transforms 0.7.0
K-MIMIC (synthetic)PassesNonePassesNonePassesNoneWarning55.3%NoneMEDS 0.3.3 kmimic-meds 0.2.0
MIMIC-IV demoPassesNonePassesNonePassesNonePasses99.9%NoneMEDS 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.