Implausible values in icu.chartevents and hosp.labevents, MIMIC-IV v3.1
Nobody has claimed this yet.
Assessment
- Difficulty
- 2/5
- Estimated time
- 1-3 hours
- Newbie friendliness
- 68/100
- Issue type
- Documentation
- Clarity
- Mostly clear
- Activity status
- Active
- Tech stack
- sql
- Domain
- databases, documentation
Research direction
Start by locating the MIMIC-IV documentation covering icu/chartevents.csv.gz and hosp/labevents.csv.gz, then review the supplied SQL query and range findings. Done means adding a concise note explaining that users should apply plausibility ranges before summary statistics, including the observed examples where appropriate.
Written by the indexing model from the issue text.
Description
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
- Dominant language
- Jupyter Notebook
- Stars
- 3.4k
- Forks
- 1.7k
- PR merge metrics
- No merged PRs in 30d
Contributor guide
No contributing guide indexed for this repository
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from MIT-LCP/mimic-code
-
Difficulty 1/5 Under an hour Newbie friendliness 72/100
MIT-LCP/mimic-code#1919 · 1 comment ·
-
Difficulty 2/5 1-3 hours Newbie friendliness 65/100
MIT-LCP/mimic-code#1770 · 4 comments · 1 reaction ·
-
enhancement mimic-iv
Difficulty 2/5 1-3 hours Newbie friendliness 74/100
MIT-LCP/mimic-code#1358 · 1 comment ·
-
mimic-ed
Difficulty 1/5 Under an hour Newbie friendliness 64/100
MIT-LCP/mimic-code#1055 · 1 comment ·
-
mimic-iii
Difficulty 1/5 Under an hour Newbie friendliness 78/100
MIT-LCP/mimic-code#906 · 3 comments ·
All issues in MIT-LCP/mimic-code
Similar issues
-
Difficulty 2/5 1-3 hours Newbie friendliness 88/100
-
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
OpenLiberty/open-liberty#35839 ·
-
affects-9.0 found-by-ai may-affects-25.10 may-affects-26.3 may-affects-26.9 may-affects-7.5 may-affects-8.1 may-affects-8.5 severity/major sig/execution type/bug
Difficulty 2/5 1-3 hours Newbie friendliness 85/100
-
Difficulty 1/5 Under an hour Newbie friendliness 92/100
antlr/grammars-v4#5014 · 1 comment ·
-
comp-query-execution fuzz
Difficulty 2/5 1-3 hours Newbie friendliness 88/100
ClickHouse/ClickHouse#121303 · 3 comments ·