MIMICIII 數據庫中患者住院次數分佈

數據庫中三個病人ID

最近在用MIMICIII數據庫提取一些數據,突然意識到一個問題,提取出的數據很多患者都是多次入院的。因此,特地去查看下數據庫中到底有多少患者住了多少次的醫院。
在MIMICIII數據庫中,存在這三個病人ID,分別爲:subject_id, hadm_id, icustay_id。這三個不同的ID分別代表了不同的意義:

subject_id:

在數據庫的官方文檔是這樣描述的:

SUBJECT_ID is a unique identifier which specifies an individual patient.

因此subject_id代表了每一個患者,在數據庫中,一個subject_id就收入了一個患者。

hadm_id

數據庫的官方文檔,對於hamd_id的定義爲:

HADM_ID, which represents a single patient’s admission to the hospital.

hadm_id相當於國內醫院的住院號,每一次的住院就會自動給你生成一個住院號,一個患者可能會擁有多個住院號。

icustay_id

這個標識符用於患者在ICU中停留,在官方文檔的解釋是:

ICUSTAY_ID is unique to a patient ICU stay.

當然,一個患者一次住院可以有多次進入ICU。但是同時也存在這一個ICU轉入另一個ICU單元時,icustay_id不變的情況:

As an ICUSTAY_ID groups all ICU admissions within 24 hours of each other, it is possible for a patient to be transferred from one type of ICU to another and have the same ICUSTAY_ID.

理解這三個不同的標識符很重要,詳情可以仔細閱讀MIMICIII數據庫的官方文檔。

數據庫患者住院次數的分佈

在這裏,我們主要使用SQL查詢語句進行查詢。想要知道“每個患者在這個數據庫中住了多少次醫院?”,我們只需要知道,“每個患者到底有多少個hamd_id”,也就是說,“在以hadm_id,作爲唯一標識符的ADMISSIONS表中,查看出現了多少次的subject_id”就行了。

使用聚合函數進行查詢

要完成上述這個目標,我們需要對ADMISSIONS表進行聚合查詢。聚合函數有很多,以下五種比較常用:

  • COUNT:計算表中的記錄數目
  • SUM:計算表中數值列中數據的合計值
  • AVG:計算表中數值列中數據的平均值
  • MAX:計算表中數值列中數據的最大值
  • MIN:計算表中數值列中數據的最小值

我們所需要的是COUNT函數來計算出現多少次的subject_id。當然,僅僅使用COUNT函數,回報的就是這個表有多少行。比如:

SELECT COUNT(*)
FROM mimiciii.admissions

執行結果爲:

count
------
58976

所以,我們還需要使用GROUP BY語句進行分組,查詢如下:

SELECT subject_id,count(*) as admissiontimes
FROM mimiciii.admissions
GROUP BY subject_id

這樣,我們就可以得到每個subject_id出現了多少次了。
那麼,如果我們想要得到僅僅只住了一次醫院的病人怎麼辦?
我們可以使用HAVING子句在分組中選擇住院一次的患者:

SELECT subject_id,COUNT(*) as admissiontimes
FROM mimiciii.admissions
GROUP BY subject_id
HAVING COUNT(*) =1

至於,HAVINGWHERE子句的區別,這裏主要簡單的提一點。
WHERE子句是指定行所對應的條件,而HAVING子句指定組所對應的條件。

使用R鏈接數據庫進行繪圖

比起SQL,我更加喜歡把數據導入到R進行探索和分析。這個過程最容易聯想到的是,從SQL的軟件中將查詢好的表格導出,然後用R將表格進行導入。其實不用那麼麻煩,在R中提供了外接數據庫的包,這裏我使用的是PostgreSQL,因此我在R中配置的也是這個數據的包。由於我嫌麻煩,所以直接寫了一個函數,方便直接調用進行查詢,具體代碼如下:

#載入數據庫的包
library(RPostgreSQL)
library(DBI)
#連接數據庫,並將其封裝爲一個函數
query <-function(query)
{
drv<-dbDriver("PostgreSQL")
con<-dbConnect(drv,host="localhost",port="5432",dbname="mimic",
               user="",password="")  ## 這裏刪除了用戶名和密碼
on.exit(
          {
                    dbDisconnect(con)
          }
)
dbGetQuery(con,query)
}

這樣我就可以調用函數直接導入數據:

## MIMIC數據庫中患者入院次數的統計
### 將SQL語句傳入pt_sql的向量中
pt_sql <- "SELECT subject_id,count(*) as admissiontimes
FROM mimiciii.admissions
GROUP BY subject_id"
### 進行查詢
pt_times <- query(pt_sql) 
### 生成表格
x <- table(pt_times$admissiontimes)
###繪製條形圖
barplot(x)

得到的結果挺讓我驚訝的。
在這裏插入圖片描述
居然最多的患者住了42次醫院?!
好了,這次就這樣,如有錯誤,請大家多多指正。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章