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
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:
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:
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:
and 130,050 °C
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