mimic-code icon indicating copy to clipboard operation
mimic-code copied to clipboard

Questions regarding the calculation of the Respiration SOFA subscores

Open weilidr opened this issue 1 year ago • 0 comments

Prerequisites

  • [X] Put an X between the brackets on this line if you have done all of the following:
    • Checked the online documentation: https://mimic.mit.edu/
    • Checked that your issue isn't already addressed: https://github.com/MIT-LCP/mimic-code/issues?utf8=%E2%9C%93&q=

Description

Dear Database Administrator,

  • [1] first_day_sofa.sql is missing the restriction for arterial pO2, specifically WHERE specimen = 'ART.'
pafi1 AS (
  /* join blood gas to ventilation durations to determine if patient was vent */
  SELECT
    ie.stay_id,
    bg.charttime,
    bg.pao2fio2ratio,
    CASE WHEN NOT vd.stay_id IS NULL THEN 1 ELSE 0 END AS isvent
  FROM mimiciv_icu.icustays AS ie
  LEFT JOIN mimiciv_derived.bg AS bg
    ON ie.subject_id = bg.subject_id
    AND bg.charttime >= ie.intime - INTERVAL '6 HOUR'
    AND bg.charttime <= ie.intime + INTERVAL '1 DAY'
  LEFT JOIN mimiciv_derived.ventilation AS vd
    ON ie.stay_id = vd.stay_id
    AND bg.charttime >= vd.starttime
    AND bg.charttime <= vd.endtime
    AND vd.ventilation_status = 'InvasiveVent'
)
  • [2] Regarding the restriction of vd.ventilation_status = 'InvasiveVent', I am confused about whether the respiratory support in the SOFA score includes only invasive mechanical ventilation, why not include vd.ventilation_status = 'NonInvasiveVent'?

In MIMIC-III code repository, respiratory support includes Noninvasive mechanical ventilation,the restriction is MechVent = 1 or Extubated = 1

mimiciii--ventilation_classification.sql

, max(
    case
      when itemid is null or value is null then 0 -- can't have null values
      when itemid = 720 and value != 'Other/Remarks' THEN 1  -- VentTypeRecorded
      when itemid = 223848 and value != 'Other' THEN 1
      when itemid = 223849 then 1 -- ventilator mode
      when itemid = 467 and value = 'Ventilator' THEN 1 -- O2 delivery device == ventilator
      when itemid in
        (
        445, 448, 449, 450, 1340, 1486, 1600, 224687 -- minute volume
        , 639, 654, 681, 682, 683, 684,224685,224684,224686 -- tidal volume
        , 218,436,535,444,459,224697,224695,224696,224746,224747 -- High/Low/Peak/Mean/Neg insp force ("RespPressure")
        , 221,1,1211,1655,2000,226873,224738,224419,224750,227187 -- Insp pressure
        , 543 -- PlateauPressure
        , 5865,5866,224707,224709,224705,224706 -- APRV pressure
        , 60,437,505,506,686,220339,224700 -- PEEP
        , 3459 -- high pressure relief
        , 501,502,503,224702 -- PCV
        , 223,667,668,669,670,671,672 -- TCPCV
        , 224701 -- PSVlevel
        )
        THEN 1
      else 0
    end
    ) as MechVent

mimiciii--ventilation_durations.sql

, vd2 as
(
  select vd1.*
  -- create a cumulative sum of the instances of new ventilation
  -- this results in a monotonic integer assigned to each instance of ventilation
  , case when MechVent=1 or Extubated = 1 then
      SUM( newvent )
      OVER ( partition by icustay_id order by charttime )
    else null end
    as ventnum
  --- now we convert CHARTTIME of ventilator settings into durations
  from vd1
)
-- create the durations for each mechanical ventilation instance
select icustay_id
  -- regenerate ventnum so it's sequential
  , ROW_NUMBER() over (partition by icustay_id order by ventnum) as ventnum
  , min(charttime) as starttime
  , max(charttime) as endtime
  , DATETIME_DIFF(max(charttime), min(charttime), 'MINUTE')/60 AS duration_hours
from vd2
group by icustay_id, vd2.ventnum
having min(charttime) != max(charttime)
-- patient had to be mechanically ventilated at least once
-- i.e. max(mechvent) should be 1
-- this excludes a frequent situation of NIV/oxygen before intub
-- in these cases, ventnum=0 and max(mechvent)=0, so they are ignored
and max(mechvent) = 1
order by icustay_id, ventnum

mimiciii--sofa.sql

, pafi1 as
(
  -- join blood gas to ventilation durations to determine if patient was vent
  select bg.icustay_id, bg.charttime
  , pao2fio2
  , case when vd.icustay_id is not null then 1 else 0 end as isvent
  from blood_gas_first_day_arterial bg
  left join ventilation_durations vd
    on bg.icustay_id = vd.icustay_id
    and bg.charttime >= vd.starttime
    and bg.charttime <= vd.endtime
  order by bg.icustay_id, bg.charttime
)

Interestingly, the Berlin definition for ARDS appears to include non-invasive mechanical ventilation as well.

Different pieces of information are conflicting. Which one should I choose? Which one is more appropriate? vd.ventilation_status = 'InvasiveVent v.ventilation_status in ('InvasiveVent', 'NonInvasiveVent') v.ventilation_status in ('InvasiveVent', 'Tracheostomy', 'NonInvasiveVent')

Thank you for your attention to this matter!

weilidr avatar Oct 14 '24 11:10 weilidr