Skip to content

Implausible values in icu.chartevents and hosp.labevents, MIMIC-IV v3.1 #2168

Description

@leogshen

Hello,

While building a sepsis early-warning cohort on MIMIC-IV v3.1 I ran a range
audit on 'icu/chartevents.csv.gz' and 'hosp/labevents.csv.gz' and found a small
number of implausible 'valuenum' entries. Volumes are tiny and I assume this is
expected in a near-raw release, but I wanted to flag it in case it's useful —
particularly as it's invisible to anyone who doesn't range-filter before
aggregating.

Heart rate (itemid 220045), counted directly from the raw table — 8,752,069
non-null 'valuenum' rows:

Range Rows Share
≤ 0 3,611 0.0413%
0–20 328 0.0037%
20–250 (plausible) 8,748,069 99.9543%
250–1,000 39 0.0004%
> 1,000 22 0.0003%

Every extreme row carries valueuom = 'bpm', so this isn't a unit-coding issue.
The largest values, each appearing once: 10,000,000 · 5,113,280 · 457,890 ·
152,143 · 118,107 · 102,115 · 102,102 · 86,101 · 11,710 · 11,337 · 10,109 ·
9,086.

Several look consistent with keystroke slips or concatenated digits (102102,
86101). The ≤ 0 group is ambiguous: asystole is a genuine chartable state, and a
disconnected monitor recorded as zero is another possibility — I haven't
established which dominates.

Reproducing the heart-rate figures:

SELECT COUNT(*) FILTER (WHERE valuenum <= 0)  AS nonpositive,
       COUNT(*) FILTER (WHERE valuenum > 250) AS above_250,
       COUNT(*)                               AS total
FROM chartevents WHERE itemid = 220045 AND valuenum IS NOT NULL;

Other variables. These come from a derived hourly grid (adult ICU stays ≥ 6 h,
median-in-bin), so they are not raw row counts and understate full-table
totals. Sources differ: respiratory rate, SpO₂ and temperature are
'icu.chartevents'; WBC, platelets, bilirubin, creatinine and pH are
'hosp.labevents'.

Clearly non-physiological:

  • Respiratory rate (220210): up to 7,000,400 /min
  • SpO₂ (220277): up to 9,765,430%, and negative values (−21, −8)
  • Temperature (223761 °F and 223762 °C, merged and converted to °C): −73.3 °C
    and 130,050 °C
  • pH (50820): 4.6 — arterial pH below roughly 6.8 is not survivable, so unlike
    the extremes below this one cannot be a genuine value

Outside the plausibility bounds we adopted, but plausibly genuine extremes
rather than errors — flagged only for completeness: WBC 479 and 572 ×10³/µL;
platelets 2,360 ×10³/µL; bilirubin 75.6 mg/dL; creatinine 41.5 mg/dL.

Why it may be worth a note in the documentation: The affected fraction is
negligible (~0.001% for HR), but a single 10,000,000 bpm reading is enough to
make a standard deviation meaningless — in our case it inflated the heart-rate
SD to 141 bpm, against an interquartile-based spread estimate of ~18 bpm, which
silently distorted a downstream analysis until we audited the raw values.
Median-based aggregation is robust to this and the 'mimic-code' concepts apply
range filters, so most users are protected. Anyone querying 'chartevents'
directly and computing moments is not.

Would a short "apply plausibility ranges before computing summary statistics"
note in the documentation be welcome? I'm happy to open a PR adding the observed
ranges if that's useful.

Thanks for maintaining the dataset.

Leo Shen
PI/Advisor: Dr. Larry Cheng of Penn State University

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions