MIMIC数据库数据提取教程-提取时间维度数据

更多关于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视图使用labeventsmimic_icu.icustays进行连表,当labevents中的记录时间(charttime)在入ICU时间(intime)的前6至后24小时之间,则认为这些数据是患者入ICU后第一天的测量数据。

因此我们需要计算intime的前6小时与24小时,这时要用到datetime_subdatetime_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 dayintime + 3 day提取第三天的最大值。有兴趣的小伙伴们可以根据这个思路,仿照上文代码用SQL实现,公众号回复"时间SQL"获取提取入ICU后第一天与第三天血乳酸/肌酐最大值的差值代码。


更多关于临床公共数据库挖掘相关知识可同时关注以下公众号 

 

  • 7
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值