更多关于mimic数据库的知识,欢迎大家关注我的公众号:科研杂录
针对MIMIC数据库的研究,例如小编之前跟大家分享的MIMIC数据库+中介效应=Critical Care(IF: 9分),往往会涉及到一些时间维度的数据,例如:入ICU后第一天测量的实验室指标、入ICU后每天的静脉输液总量、入ICU后第一天与第三天实验室指标(血乳酸/肌酐等)最大值的差值等。这些数据的共同点都是要对指标测量的记录时间与入ICU时间进行计算。那么,在MIMIC数据库中,我们应该如何进行时间计算呢?
官方视图基于基本的PostgreSQL时间计算函数封装了几个函数,我们在提取这类数据时,直接使用封装好后的函数即可。
MIMIC数据库常用的几个时间计算函数如下
-
datetime_diff(endtime,starttime,'HOUR'): 求endtime-starttime,单位是小时
(单位可以根据需要换成'SECOND','MINUTE','DAY','YEAR')
-
datetime_add(datetime, '1 day'::interval day): 求datetime+1天的时间点,可以根据需要换需要加的时间如datetime_add(datetime, '2 year'::interval year)
-
datetime_sub(datetime, '6 hour'::interval hour): 求datetime前6小时的时间点
下面我们用几个例子来讲解一下这几个函数的应用
1. 如何提取入ICU后第一天测量的血液样本中lymphocytes的最大值、最小值以及平均值
首先我们要提取患者入院后的每次测量的lymphocytes值,可以参考上一篇推文提取实验室指标
提取之后,为了方便后续的查询,我们可以存放在一个物化视图里面
-- 创建名为lymphocytes的视图
create materialized view lymphocytes as
select subject_id,hadm_id,charttime,specimen_id,
max(valuenum) valuenum from
mimic_hosp.labevents
where itemid in (51244,51245)
group by subject_id,hadm_id,charttime,specimen_id
由于labevents表记录的是患者住院过程中所有的测量数据,因此没有stay_id,那么如何知道所测量的数据哪些是患者入ICU后第一天内测量的呢?
MIMIC的官方firstday视图使用labevents与mimic_icu.icustays进行连表,当labevents中的记录时间(charttime)在入ICU时间(intime)的前6至后24小时之间,则认为这些数据是患者入ICU后第一天的测量数据。
因此我们需要计算intime的前6小时与24小时,这时要用到datetime_sub与datetime_add函数。因此获取入ICU后第一天测量的血液样本中lymphocytes的最大值、最小值以及平均值的SQL如下
SELECT t1.stay_id,
min(t2.valuenum) AS lymphocytes_min,
max(t2.valuenum) AS lymphocytes_max,
avg(t2.valuenum) AS lymphocytes_avg
FROM mimic_icu.icustays t1
LEFT JOIN lymphocytes t2
ON (t1.subject_id = t2.subject_id
AND t2.charttime >= datetime_sub(t1.intime, '6 hour'::interval hour)
AND t2.charttime <= datetime_add(t1.intime, '1 day'::interval day))
GROUP BY t1.stay_id
2. 如何获取入ICU后每天静脉输液总量
MIMIC数据库中的mimic_icu.inputevents表记录了患者入ICU后静脉输液数据,我们的思路是,首先计算开始输液时间starttime与intime的差值,如果小于等于1天,我们则认为是第一天输液的数据,同理,如果大于1小于等于2,则认为是第二天输液的数据,最后根据天数分组求和,得出每天静脉输液总量。
用SQL表示,我们可以用datetime_diff计算开始输液时间和入ICU时间的差值,再用ceil函数(SQL自带的函数)向上取整,比如差值是0.4天,那么取整为1,也就是此时输液时间是入ICU的第一天,最后再根据时间分组求和。
select t1.stay_id,ceil(public.datetime_diff(t1.starttime,t2.intime,'DAY')) as date_num,
sum(t1.totalamount)
from mimic_icu.inputevents t1
left join
mimic_icu.icustays t2
on t1.stay_id = t2.stay_id
where t1.totalamount is not null
and t1.totalamount > 0 and t1.starttime > t2.intime
GROUP BY t1.stay_id, date_num;
查询结果如下,我们查出来了入ICU后每一天的静脉输液总量
3. 如何提取入ICU后第一天与第三天血乳酸/肌酐最大值的差值
相信大家看过上面两个例子后,应该也会有思路去提取这个指标。我们可以参考例1提取第一天的最大值,然后修改charttime的时间范围为intime + 2 day至intime + 3 day提取第三天的最大值。有兴趣的小伙伴们可以根据这个思路,仿照上文代码用SQL实现,公众号回复"时间SQL"获取提取入ICU后第一天与第三天血乳酸/肌酐最大值的差值代码。
更多关于临床公共数据库挖掘相关知识可同时关注以下公众号