前回は、医療界のビッグデータベースであるMIMICを紹介しました。今回は、MIMICの具体的な使い方を解説していきたいと思います。
アクセス権をリクエスト
まずはMIMICへのアクセス権をもらう必要があります。以下、その手続きを開設していきますが、こちらも合わせて参照してください。
CITIトレーニング
MIMICへのアクセス権をリクエストする前に、CITI programの”Data or Specimens Only Research”というコースを、オンラインで修了しておく必要があります。
まず、こちらのサイトに行き、”affiliation”のところで”Massachusetts Institute of Technology Affiliates”を選びます(”independent learner”ではないのでご注意を)。
“Massachusetts Institute of Technology Affiliates course”→”Human Subjects training category”→”Data or Specimens Only Research”を選択します。
コースが修了したら、その日付やスコアが記載されているreportを保存してください(PDFまたはimage file)。
PhysioNetへアクセス権をリクエスト
CITI trainingが修了したら、PhysioNetにMIMIC-IIIへのアクセス権をリクエストしましょう。
まず、こちらからPhysioNetにアカウントを作成してください。
次に、MIMICのprojectページに行き、project descriptionの”File” sectionから”credentialed user” linkをクリックし、credentialed accessのための手続きをしていきます。ここで、先ほど保存したCITI trainingのreportをuploadします。
特に問題なければ、数日以内にアクセス権を許可するメールが届きます。打ち込んだ情報に誤りや不正があると、そのようなメールが届かない、もしくは何の連絡もなくリクエストが却下されることがあるのでご注意ください。
MIMICをダウンロード
アクセス権が得られれば、MIMIC全体を自分のPCにダウンロードすることが可能なります。ただし、その方法を手動で行うと結構面倒です。Commandに精通している人は大丈夫かもしれませんが、私のような初心者はGithubで公開されているrepositoryを利用すると良いでしょう。ここでは、Postgresを用いたデータベースを構築していきます。
もちろん、アクセス権さえあれば、データ全体をダウンロードせずともGoogleのBigQueryなどの介してqueryを行うことも可能です。
空き容量を確認
MIMICと関連データを全て合わせると、100GB程度の容量が必要です。私の昔のPCは、容量の約半分がMIMICに奪われてしまいました(悲)。
“Makefile”を用いてダウンロード
Postgresを持っていない人は、まずはこちらからPostgresをダウンロードします。
Postgresをダウンロードできたら、以下のコマンドを(MACであれば)Terminalに打ち込み、mimic-codeを自分のPCにコピーします。
$ git clone https://github.com/MIT-LCP/mimic-code.git
Cloneしたフォルダーのbuildmimic/postgres/
という所にdirectoryを変更します。私の場合は、kimurasatoshi
からmimic-code
と入った所にbuildmimic
があったので、Terminalには、
$ cd /Users/kimurasatoshi/mimic-code/buildmimic/postgres/
と打ち込みます。この場所にあるMakefileというファイルに、MIMICデータベースを自動でダウンロードするためのコードが詰まっています。たとえば、”/path/to/data/”という場所にMIMICを構築するのであれば、
$ make create-user mimic datadir="/path/to/data/"
とします。
Defaultでは、
- Database name:
mimic
- User name:
postgres
- Password:
postgres
- Schema:
mimiciii
となっています。これらは後々SQLを用いてデータを抽出する際に必要になりますが、特に変更する必要はないでしょう。
以上で終了です。MIMICは膨大なデータベースです。それぞれのtable(csv file)をgz形式でダウンロードしますが、私の場合は数時間かかりました。
トラブルシューティング
一見簡単そうですし、特に問題なくダウンロードできる人もいると思います。しかし、人によってはerror messageが出現するかもしれません。私はPCの専門家ではないため、トラブルシューティングに結構時間がかかりました。
よくあるエラーに関しては、こちらに書いてあるので参照してみてください。
SQLを用いたデータ抽出例
では、実際にMIMICからデータを取り出してみましょう。Rを用いてデータを抽出(query)することも可能ですが、ここではPythonを使い、Jupyter notebook上でやってみます。
Queryの前準備
import pandas as pd import psycopg2 con = psycopg2.connect(dbname='mimic', user='postgres', password='postgres' ) query_schema = 'set search_path to ' + 'mimiciii'+ ';'
まず始めに、上記をコピペして走らせてみてください。ここらになってくると複雑に見えますが、簡単に解説します。
1行目でpandas
というmoduleを呼び出し、今後のタイピングを楽するためpd
と省略しています。
2行目でpsycopg2
というmoduleを呼び出し、PythonからSQLを使えるようにしています。
3〜4行目で、ダウンロードしたMIMICへ繋げるためのコードをまとめ、簡略化して定義し直しています。データベース名やuser名、passwordなどは、上でダウンロードした際に設定した(or default)ものです。
実際のquery
まずは、シンプルにデータを抽出してみましょう。
pd.read_sql(query_schema+""" SELECT * FROM patients LIMIT 5 """, con)
この、"""
と"""
で挟まれた部分が、データを抽出するためのSQLです。今回は、「patient
というtableにある全てのcolumnを抜き出し(*
)、最初の5行のみ抽出する」というコードになっています。そして、"""
以外の部分で、抜き出したデータをdata frameのような型で表示させています。
Jupyter notebookを使えば、以下のような感じになります。
男女でどのくらいの人数がいるのか知りたければ、
といった感じになります。
慣れてくると、もう少し複雑なコードも書けるようになります。例えば、患者の生死を年齢のカテゴリー別に抽出してみましょう。admisssions
とpatients
という2つのtableを用い、誕生日と入室時間から年齢を計算し、それらを3つのカテゴリーに分類してみます。
pd.read_sql(query_schema+""" WITH first_admission_time AS ( SELECT p.subject_id, p.dob, p.gender, p.expire_flag , MIN (a.admittime) AS first_admittime , MIN( ROUND( (cast(admittime as date) - cast(dob as date)) / 365.242,2) ) AS first_admit_age FROM patients p INNER JOIN admissions a ON p.subject_id = a.subject_id GROUP BY p.subject_id, p.dob, p.gender, p.expire_flag ORDER BY p.subject_id ) , age as ( SELECT subject_id, dob, gender, expire_flag , first_admittime, first_admit_age , CASE WHEN first_admit_age > 100 then '>89' WHEN first_admit_age >= 14 THEN 'adult' WHEN first_admit_age <= 1 THEN 'neonate' ELSE 'middle' END AS age_group FROM first_admission_time ) select age_group, gender, expire_flag , count(subject_id) as NumberOfPatients from age group by age_group, gender, expire_flag ORDER BY age_group, gender """, con)
とすると、
というように、年齢・男女別の生死を人数を知ることができましたね。
MIMICを使う際の難関の一つは、どのデータがどのtableに入っているか、そして、どのデータがどのようにlabelされているかを理解しなければならないことです。詳細はこちらに記載されていますので、ご参照ください。
まとめ
MIMICには、患者の年齢や体重、既往歴、診断名だけでなく、ICU入室中の1時間毎の全てのバイタルサイン、輸液量、輸血、尿量、検査値などなど、ありとあらゆるデータが存在します。SQLさえできるようになれば、データは面白いほど手に入ります。しかも無料。こんな貴重なデータベース、利用しない手はありませんね。
コメント