Skip to content

phenylephrine mimic-iv concept misses concentration-variant itemids, propagating to vasoactive_agent and norepinephrine_equivalent_dose #2159

Description

@TheFifthPostulate

Summary

concepts/medication/phenylephrine.sql filters inputevents on a single itemid, but MIMIC-IV records phenylephrine infusions under several itemids that differ only by bag concentration. Administrations charted under the variant itemids are absent from the derived phenylephrine concept, and therefore from vasoactive_agent and norepinephrine_equivalent_dose.

The practical effect is that a cohort defined as "received a vasopressor" via norepinephrine_equivalent_dose silently omits a subset of phenylephrine-treated patients. Because phenylephrine is one of the most frequently used vasopressors in MIMIC-IV, the omitted group is not small.

Environment

MIMIC-IV v3.1
BigQuery, physionet-data.mimiciv_3_1_icu / physionet-data.mimiciv_3_1_derived

The itemids

SELECT itemid, label
FROM `physionet-data.mimiciv_3_1_icu.d_items`
WHERE LOWER(label) LIKE '%phenylephrine%';
itemid label
229789 Phenylephrine (Intubation)
221749 Phenylephrine
229630 Phenylephrine (50/250)
229631 Phenylephrine (200/250)_OLD_1
229632 Phenylephrine (200/250)

Rate-documented (i.e. infusion) administrations by itemid:

SELECT ie.itemid, i.label,
       COUNT(*)                   AS n_rows,
       COUNT(DISTINCT ie.stay_id) AS n_stays
FROM `physionet-data.mimiciv_3_1_icu.inputevents` ie
JOIN `physionet-data.mimiciv_3_1_icu.d_items` i USING (itemid)
WHERE LOWER(i.label) LIKE '%phenylephrine%'
  AND ie.rate IS NOT NULL
GROUP BY 1, 2 ORDER BY n_stays DESC;
itemid label n_rows n_stays
221749 Phenylephrine 209376 14428
229630 Phenylephrine (50/250) 61013 3778
229632 Phenylephrine (200/250) 12840 453

Reproduction

WITH raw AS (
  SELECT DISTINCT ie.stay_id
  FROM `physionet-data.mimiciv_3_1_icu.inputevents` ie
  JOIN `physionet-data.mimiciv_3_1_icu.d_items` i USING (itemid)
  WHERE LOWER(i.label) LIKE '%phenylephrine%'
    AND LOWER(i.label) NOT LIKE '%intubation%'
    AND ie.rate IS NOT NULL AND ie.rate > 0
),
derived AS (
  SELECT DISTINCT stay_id FROM `physionet-data.mimiciv_3_1_derived.phenylephrine`
)
SELECT (SELECT COUNT(*) FROM raw)     AS n_stays_raw,
       (SELECT COUNT(*) FROM derived) AS n_stays_derived,
       (SELECT COUNT(*) FROM raw WHERE stay_id NOT IN (SELECT stay_id FROM derived))
                                      AS n_missing;
n_stays_raw n_stays_derived n_missing
17841 14428 3413

These are not incidental exposures. Restricting to first ICU stays with ≥24 h length of stay and looking only at the first 24 hours, the affected administrations average 10.5 hours of infusion within the window, with the upper deciles spanning the full 24 hours. Fewer than 7% are single-hour. This is sustained vasopressor support, not peri-procedural dosing.

Current filter

concepts/medication/phenylephrine.sql:
WHERE itemid = 221749 -- phenylephrine

Suggested Fix

Extend the filter to the full set of phenylephrine infusion itemids, excluding the peri-intubation item (which is bolus dosing and has no rate):

WHERE itemid IN (<!-- LIST -->)

Phenylephrine dose unit and dose distributions between labels are consistent with each other. So, adding the missing itemids is the likely immediate fix.

Stays with misrepresented NEE

Currently, there are stays with a calculated NEE dose but without the contribution from concentration-variant phenylephrine medications. This can potentially result in a lower calculated NEE dose than what is represented in the raw data.

WITH variant AS (
  -- stays with a rate-documented infusion under a NON-base phenylephrine item
  SELECT DISTINCT ie.stay_id
  FROM `physionet-data.mimiciv_3_1_icu.inputevents` ie
  JOIN `physionet-data.mimiciv_3_1_icu.d_items` i USING (itemid)
  WHERE LOWER(i.label) LIKE '%phenylephrine%'
    AND LOWER(i.label) NOT LIKE '%intubation%'
    AND ie.itemid != 221749          -- CONFIRM the base itemid from the .sql
    AND ie.rate IS NOT NULL AND ie.rate > 0
),
has_nee AS (
  SELECT DISTINCT stay_id
  FROM `physionet-data.mimiciv_3_1_derived.norepinephrine_equivalent_dose`
  WHERE norepinephrine_equivalent_dose > 0
)
SELECT
  COUNT(*)                                                        AS n_variant_stays,
  COUNTIF(h.stay_id IS NOT NULL)                                  AS n_understated,
  COUNTIF(h.stay_id IS NULL)                                      AS n_absent,
  ROUND(SAFE_DIVIDE(COUNTIF(h.stay_id IS NOT NULL), COUNT(*)), 3) AS frac_understated
FROM variant v
LEFT JOIN has_nee h USING (stay_id);
n_variant_stays n_understated n_absent frac_understated
3872 2277 1595 0.588

Happy to submit a PR

I can put together a PR against concepts/, concepts_duckdb/, and concepts_postgres/ if the approach above looks right to you.

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