├── .gitignore ├── 01_explore_patients.ipynb ├── 02_severity_of_illness.ipynb ├── 03_summary_statistics.ipynb ├── 04_timeseries.ipynb ├── 05_mortality_prediction.ipynb ├── 06_aki_project.ipynb ├── 07_project_work.ipynb ├── LICENSE ├── README.md ├── mimic-iii-los.rmd ├── mimic-weekend-effect.ipynb └── requirements.txt /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | pip-wheel-metadata/ 24 | share/python-wheels/ 25 | *.egg-info/ 26 | .installed.cfg 27 | *.egg 28 | MANIFEST 29 | 30 | # PyInstaller 31 | # Usually these files are written by a python script from a template 32 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 33 | *.manifest 34 | *.spec 35 | 36 | # Installer logs 37 | pip-log.txt 38 | pip-delete-this-directory.txt 39 | 40 | # Unit test / coverage reports 41 | htmlcov/ 42 | .tox/ 43 | .nox/ 44 | .coverage 45 | .coverage.* 46 | .cache 47 | nosetests.xml 48 | coverage.xml 49 | *.cover 50 | *.py,cover 51 | .hypothesis/ 52 | .pytest_cache/ 53 | 54 | # Translations 55 | *.mo 56 | *.pot 57 | 58 | # Django stuff: 59 | *.log 60 | local_settings.py 61 | db.sqlite3 62 | db.sqlite3-journal 63 | 64 | # Flask stuff: 65 | instance/ 66 | .webassets-cache 67 | 68 | # Scrapy stuff: 69 | .scrapy 70 | 71 | # Sphinx documentation 72 | docs/_build/ 73 | 74 | # PyBuilder 75 | target/ 76 | 77 | # Jupyter Notebook 78 | .ipynb_checkpoints 79 | 80 | # IPython 81 | profile_default/ 82 | ipython_config.py 83 | 84 | # pyenv 85 | .python-version 86 | 87 | # pipenv 88 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 89 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 90 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 91 | # install all needed dependencies. 92 | #Pipfile.lock 93 | 94 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow 95 | __pypackages__/ 96 | 97 | # Celery stuff 98 | celerybeat-schedule 99 | celerybeat.pid 100 | 101 | # SageMath parsed files 102 | *.sage.py 103 | 104 | # Environments 105 | .env 106 | .venv 107 | env/ 108 | venv/ 109 | ENV/ 110 | env.bak/ 111 | venv.bak/ 112 | 113 | # Spyder project settings 114 | .spyderproject 115 | .spyproject 116 | 117 | # Rope project settings 118 | .ropeproject 119 | 120 | # mkdocs documentation 121 | /site 122 | 123 | # mypy 124 | .mypy_cache/ 125 | .dmypy.json 126 | dmypy.json 127 | 128 | # Pyre type checker 129 | .pyre/ 130 | -------------------------------------------------------------------------------- /01_explore_patients.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": { 6 | "colab_type": "text", 7 | "id": "view-in-github" 8 | }, 9 | "source": [ 10 | "\"Open" 11 | ] 12 | }, 13 | { 14 | "cell_type": "markdown", 15 | "metadata": { 16 | "colab_type": "text", 17 | "id": "NCI19_Ix7xuI" 18 | }, 19 | "source": [ 20 | "# eICU Collaborative Research Database\n", 21 | "\n", 22 | "# Notebook 1: Exploring the patient table\n", 23 | "\n", 24 | "The aim of this notebook is to get set up with access to a demo version of the [eICU Collaborative Research Database](http://eicu-crd.mit.edu/). The demo is a subset of the full database, limited to ~1000 patients.\n", 25 | "\n", 26 | "We begin by exploring the `patient` table, which contains patient demographics and admission and discharge details for hospital and ICU stays. For more detail, see: http://eicu-crd.mit.edu/eicutables/patient/" 27 | ] 28 | }, 29 | { 30 | "cell_type": "markdown", 31 | "metadata": {}, 32 | "source": [ 33 | "## Prerequisites\n", 34 | "\n", 35 | "- If you do not have a Gmail account, please create one at http://www.gmail.com. \n", 36 | "- If you have not yet signed the data use agreement (DUA) sent by the organizers, please do so now to get access to the dataset." 37 | ] 38 | }, 39 | { 40 | "cell_type": "markdown", 41 | "metadata": { 42 | "colab_type": "text", 43 | "id": "l_CmlcBu8Wei" 44 | }, 45 | "source": [ 46 | "## Load libraries and connect to the data\n", 47 | "\n", 48 | "Run the following cells to import some libraries and then connect to the database." 49 | ] 50 | }, 51 | { 52 | "cell_type": "code", 53 | "execution_count": null, 54 | "metadata": { 55 | "colab": {}, 56 | "colab_type": "code", 57 | "id": "3WQsJiAj8B5L" 58 | }, 59 | "outputs": [], 60 | "source": [ 61 | "# Import libraries\n", 62 | "import numpy as np\n", 63 | "import os\n", 64 | "import pandas as pd\n", 65 | "import matplotlib.pyplot as plt\n", 66 | "import matplotlib.patches as patches\n", 67 | "import matplotlib.path as path\n", 68 | "\n", 69 | "# Make pandas dataframes prettier\n", 70 | "from IPython.display import display, HTML\n", 71 | "\n", 72 | "# Access data using Google BigQuery.\n", 73 | "from google.colab import auth\n", 74 | "from google.cloud import bigquery" 75 | ] 76 | }, 77 | { 78 | "cell_type": "markdown", 79 | "metadata": { 80 | "colab_type": "text", 81 | "id": "Ld59KZ0W9E4v" 82 | }, 83 | "source": [ 84 | "Before running any queries, you need to first authenticate yourself by running the following cell. If you are running it for the first time, it will ask you to follow a link to log in using your Gmail account, and accept the data access requests to your profile. Once this is done, it will generate a string of verification code, which you should paste back to the cell below and press enter." 85 | ] 86 | }, 87 | { 88 | "cell_type": "code", 89 | "execution_count": null, 90 | "metadata": { 91 | "colab": {}, 92 | "colab_type": "code", 93 | "id": "ABh4hMt288yg" 94 | }, 95 | "outputs": [], 96 | "source": [ 97 | "auth.authenticate_user()" 98 | ] 99 | }, 100 | { 101 | "cell_type": "markdown", 102 | "metadata": { 103 | "colab_type": "text", 104 | "id": "BPoHP2a8_eni" 105 | }, 106 | "source": [ 107 | "We'll also set the project details." 108 | ] 109 | }, 110 | { 111 | "cell_type": "code", 112 | "execution_count": null, 113 | "metadata": { 114 | "colab": {}, 115 | "colab_type": "code", 116 | "id": "P0fdtVMa_di9" 117 | }, 118 | "outputs": [], 119 | "source": [ 120 | "project_id='sccm-datathon'\n", 121 | "os.environ[\"GOOGLE_CLOUD_PROJECT\"]=project_id" 122 | ] 123 | }, 124 | { 125 | "cell_type": "markdown", 126 | "metadata": { 127 | "colab_type": "text", 128 | "id": "5bHZALFP9VN1" 129 | }, 130 | "source": [ 131 | "# \"Querying\" our database with SQL\n", 132 | "\n", 133 | "Now we can start exploring the data. We'll begin by running a simple query to load all columns of the `patient` table to a Pandas DataFrame. The query is written in SQL, a common language for extracting data from databases. The structure of an SQL query is:\n", 134 | "\n", 135 | "```sql\n", 136 | "SELECT \n", 137 | "FROM \n", 138 | "WHERE \n", 139 | "```\n", 140 | "\n", 141 | "`*` is a wildcard that indicates all columns" 142 | ] 143 | }, 144 | { 145 | "cell_type": "markdown", 146 | "metadata": {}, 147 | "source": [ 148 | "# BigQuery\n", 149 | "\n", 150 | "Our dataset is stored on BigQuery, Google's database engine. We can run our query on the database using some special (\"magic\") [BigQuery syntax](https://googleapis.dev/python/bigquery/latest/magics.html)." 151 | ] 152 | }, 153 | { 154 | "cell_type": "code", 155 | "execution_count": null, 156 | "metadata": { 157 | "colab": {}, 158 | "colab_type": "code", 159 | "id": "RE-UZAPG_rHq" 160 | }, 161 | "outputs": [], 162 | "source": [ 163 | "%%bigquery patient\n", 164 | "\n", 165 | "SELECT *\n", 166 | "FROM `physionet-data.eicu_crd_demo.patient`" 167 | ] 168 | }, 169 | { 170 | "cell_type": "markdown", 171 | "metadata": { 172 | "colab_type": "text", 173 | "id": "YbnkcCZxBkdK" 174 | }, 175 | "source": [ 176 | "We have now assigned the output to our query to a variable called `patient`. Let's use the `head` method to view the first few rows of our data." 177 | ] 178 | }, 179 | { 180 | "cell_type": "code", 181 | "execution_count": null, 182 | "metadata": { 183 | "colab": {}, 184 | "colab_type": "code", 185 | "id": "GZph0FPDASEs" 186 | }, 187 | "outputs": [], 188 | "source": [ 189 | "# view the top few rows of the patient data\n", 190 | "patient.head()" 191 | ] 192 | }, 193 | { 194 | "cell_type": "markdown", 195 | "metadata": { 196 | "colab_type": "text", 197 | "id": "TlxaXLevC_Rz" 198 | }, 199 | "source": [ 200 | "## Questions\n", 201 | "\n", 202 | "- What does `patientunitstayid` represent? (hint, see: http://eicu-crd.mit.edu/eicutables/patient/)\n", 203 | "- What does `patienthealthsystemstayid` represent?\n", 204 | "- What does `uniquepid` represent?" 205 | ] 206 | }, 207 | { 208 | "cell_type": "code", 209 | "execution_count": null, 210 | "metadata": { 211 | "colab": {}, 212 | "colab_type": "code", 213 | "id": "2rLY0WyCBzp9" 214 | }, 215 | "outputs": [], 216 | "source": [ 217 | "# select a limited number of columns to view\n", 218 | "columns = ['uniquepid', 'patientunitstayid','gender','age','unitdischargestatus']\n", 219 | "patient[columns].head()" 220 | ] 221 | }, 222 | { 223 | "cell_type": "markdown", 224 | "metadata": { 225 | "colab_type": "text", 226 | "id": "FSdS2hS4EWtb" 227 | }, 228 | "source": [ 229 | "- Try running the following query, which lists unique values in the age column. What do you notice?" 230 | ] 231 | }, 232 | { 233 | "cell_type": "code", 234 | "execution_count": null, 235 | "metadata": { 236 | "colab": {}, 237 | "colab_type": "code", 238 | "id": "0Aom69ftDxBN" 239 | }, 240 | "outputs": [], 241 | "source": [ 242 | "# what are the unique values for age?\n", 243 | "age_col = 'age'\n", 244 | "patient[age_col].sort_values().unique()" 245 | ] 246 | }, 247 | { 248 | "cell_type": "markdown", 249 | "metadata": { 250 | "colab_type": "text", 251 | "id": "Y_qJL94jE0k8" 252 | }, 253 | "source": [ 254 | "- Try plotting a histogram of ages using the command in the cell below. What happens? Why?" 255 | ] 256 | }, 257 | { 258 | "cell_type": "code", 259 | "execution_count": null, 260 | "metadata": { 261 | "colab": {}, 262 | "colab_type": "code", 263 | "id": "1zad3Gr4D4LE" 264 | }, 265 | "outputs": [], 266 | "source": [ 267 | "# try plotting a histogram of ages\n", 268 | "patient[age_col].plot(kind='hist', bins=15)" 269 | ] 270 | }, 271 | { 272 | "cell_type": "markdown", 273 | "metadata": { 274 | "colab_type": "text", 275 | "id": "xIdwVEEPF25H" 276 | }, 277 | "source": [ 278 | "Let's create a new column named `age_num`, then try again." 279 | ] 280 | }, 281 | { 282 | "cell_type": "code", 283 | "execution_count": null, 284 | "metadata": { 285 | "colab": {}, 286 | "colab_type": "code", 287 | "id": "-rwc-28oFF6R" 288 | }, 289 | "outputs": [], 290 | "source": [ 291 | "# create a column containing numerical ages\n", 292 | "# If ‘coerce’, then invalid parsing will be set as NaN\n", 293 | "agenum_col = 'age_num'\n", 294 | "patient[agenum_col] = pd.to_numeric(patient[age_col], errors='coerce')\n", 295 | "patient[agenum_col].sort_values().unique()" 296 | ] 297 | }, 298 | { 299 | "cell_type": "code", 300 | "execution_count": null, 301 | "metadata": { 302 | "colab": {}, 303 | "colab_type": "code", 304 | "id": "uTFMqqWqFMjG" 305 | }, 306 | "outputs": [], 307 | "source": [ 308 | "patient[agenum_col].plot(kind='hist', bins=15)" 309 | ] 310 | }, 311 | { 312 | "cell_type": "markdown", 313 | "metadata": { 314 | "colab_type": "text", 315 | "id": "FrbR8rV3GlR1" 316 | }, 317 | "source": [ 318 | "## Questions\n", 319 | "\n", 320 | "- Use the `mean()` method to find the average age. Why do we expect this to be lower than the true mean?\n", 321 | "- In the same way that you use `mean()`, you can use `describe()`, `max()`, and `min()`. Look at the admission heights (`admissionheight`) of patients in cm. What issue do you see? How can you deal with this issue?" 322 | ] 323 | }, 324 | { 325 | "cell_type": "code", 326 | "execution_count": null, 327 | "metadata": { 328 | "colab": {}, 329 | "colab_type": "code", 330 | "id": "TPps13DZG6Ac" 331 | }, 332 | "outputs": [], 333 | "source": [ 334 | "adheight_col = 'admissionheight'\n", 335 | "patient[adheight_col].describe()" 336 | ] 337 | }, 338 | { 339 | "cell_type": "code", 340 | "execution_count": null, 341 | "metadata": { 342 | "colab": {}, 343 | "colab_type": "code", 344 | "id": "9jhV9xQoGRJq" 345 | }, 346 | "outputs": [], 347 | "source": [ 348 | "# set threshold\n", 349 | "adheight_col = 'admissionheight'\n", 350 | "patient[patient[adheight_col] < 10] = None" 351 | ] 352 | } 353 | ], 354 | "metadata": { 355 | "colab": { 356 | "collapsed_sections": [], 357 | "include_colab_link": true, 358 | "name": "01-explore-patient-table", 359 | "provenance": [], 360 | "version": "0.3.2" 361 | }, 362 | "kernelspec": { 363 | "display_name": "Python 3", 364 | "language": "python", 365 | "name": "python3" 366 | }, 367 | "language_info": { 368 | "codemirror_mode": { 369 | "name": "ipython", 370 | "version": 3 371 | }, 372 | "file_extension": ".py", 373 | "mimetype": "text/x-python", 374 | "name": "python", 375 | "nbconvert_exporter": "python", 376 | "pygments_lexer": "ipython3", 377 | "version": "3.7.4" 378 | } 379 | }, 380 | "nbformat": 4, 381 | "nbformat_minor": 1 382 | } 383 | -------------------------------------------------------------------------------- /02_severity_of_illness.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": { 6 | "colab_type": "text", 7 | "id": "view-in-github" 8 | }, 9 | "source": [ 10 | "\"Open" 11 | ] 12 | }, 13 | { 14 | "cell_type": "markdown", 15 | "metadata": { 16 | "colab_type": "text", 17 | "id": "y4AOVdliM8gm" 18 | }, 19 | "source": [ 20 | "# eICU Collaborative Research Database\n", 21 | "\n", 22 | "# Notebook 2: Severity of illness\n", 23 | "\n", 24 | "This notebook introduces high level admission details relating to a single patient stay, using the following tables:\n", 25 | "\n", 26 | "- patient\n", 27 | "- admissiondx\n", 28 | "- apacheapsvar\n", 29 | "- apachepredvar\n", 30 | "- apachepatientresult\n", 31 | "\n" 32 | ] 33 | }, 34 | { 35 | "cell_type": "markdown", 36 | "metadata": { 37 | "colab_type": "text", 38 | "id": "e0lUnIkYOyv4" 39 | }, 40 | "source": [ 41 | "## Load libraries and connect to the database" 42 | ] 43 | }, 44 | { 45 | "cell_type": "code", 46 | "execution_count": 0, 47 | "metadata": { 48 | "colab": {}, 49 | "colab_type": "code", 50 | "id": "SJ6l1i3fOL4j" 51 | }, 52 | "outputs": [], 53 | "source": [ 54 | "# Import libraries\n", 55 | "import numpy as np\n", 56 | "import os\n", 57 | "import pandas as pd\n", 58 | "import matplotlib.pyplot as plt\n", 59 | "import matplotlib.patches as patches\n", 60 | "import matplotlib.path as path\n", 61 | "\n", 62 | "# Make pandas dataframes prettier\n", 63 | "from IPython.display import display, HTML\n", 64 | "\n", 65 | "# Access data using Google BigQuery.\n", 66 | "from google.colab import auth\n", 67 | "from google.cloud import bigquery" 68 | ] 69 | }, 70 | { 71 | "cell_type": "code", 72 | "execution_count": 0, 73 | "metadata": { 74 | "colab": {}, 75 | "colab_type": "code", 76 | "id": "TE4JYS8aO-69" 77 | }, 78 | "outputs": [], 79 | "source": [ 80 | "# authenticate\n", 81 | "auth.authenticate_user()" 82 | ] 83 | }, 84 | { 85 | "cell_type": "code", 86 | "execution_count": 0, 87 | "metadata": { 88 | "colab": {}, 89 | "colab_type": "code", 90 | "id": "oVavf-ujPOAv" 91 | }, 92 | "outputs": [], 93 | "source": [ 94 | "# Set up environment variables\n", 95 | "project_id='sccm-datathon'\n", 96 | "os.environ[\"GOOGLE_CLOUD_PROJECT\"]=project_id" 97 | ] 98 | }, 99 | { 100 | "cell_type": "markdown", 101 | "metadata": { 102 | "colab_type": "text", 103 | "id": "a1CAI3GjQYE0" 104 | }, 105 | "source": [ 106 | "## Selecting a single patient stay¶\n", 107 | "\n", 108 | "As we have seen, the patient table includes general information about the patient admissions (for example, demographics, admission and discharge details). See: http://eicu-crd.mit.edu/eicutables/patient/\n", 109 | "\n", 110 | "## Questions\n", 111 | "\n", 112 | "Use your knowledge from the previous notebook and the online documentation (http://eicu-crd.mit.edu/) to answer the following questions:\n", 113 | "\n", 114 | "- Which column in the patient table is distinct for each stay in the ICU (similar to `icustay_id` in MIMIC-III)?\n", 115 | "- Which column is unique for each patient (similar to `subject_id` in MIMIC-III)?" 116 | ] 117 | }, 118 | { 119 | "cell_type": "code", 120 | "execution_count": 0, 121 | "metadata": { 122 | "colab": {}, 123 | "colab_type": "code", 124 | "id": "R6huFICkSQAd" 125 | }, 126 | "outputs": [], 127 | "source": [ 128 | "# view distinct ids\n", 129 | "%%bigquery\n", 130 | "\n", 131 | "SELECT DISTINCT(patientunitstayid)\n", 132 | "FROM `physionet-data.eicu_crd_demo.patient`" 133 | ] 134 | }, 135 | { 136 | "cell_type": "code", 137 | "execution_count": 0, 138 | "metadata": { 139 | "colab": {}, 140 | "colab_type": "code", 141 | "id": "yEBIFRBqRo4y" 142 | }, 143 | "outputs": [], 144 | "source": [ 145 | "# set the where clause to select the stay of interest\n", 146 | "%%bigquery patient\n", 147 | "\n", 148 | "SELECT *\n", 149 | "FROM `physionet-data.eicu_crd_demo.patient`\n", 150 | "WHERE patientunitstayid = " 151 | ] 152 | }, 153 | { 154 | "cell_type": "code", 155 | "execution_count": 0, 156 | "metadata": { 157 | "colab": {}, 158 | "colab_type": "code", 159 | "id": "LjIL2XR6TAyp" 160 | }, 161 | "outputs": [], 162 | "source": [ 163 | "patient" 164 | ] 165 | }, 166 | { 167 | "cell_type": "markdown", 168 | "metadata": { 169 | "colab_type": "text", 170 | "id": "QSbKYqF0TQ1n" 171 | }, 172 | "source": [ 173 | "## Questions\n", 174 | "\n", 175 | "- Which type of unit was the patient admitted to? Hint: Try `patient['unittype']` or `patient.unittype`\n", 176 | "- What year was the patient discharged from the ICU? Hint: You can view the table columns with `patient.columns`\n", 177 | "- What was the status of the patient upon discharge from the unit?" 178 | ] 179 | }, 180 | { 181 | "cell_type": "markdown", 182 | "metadata": { 183 | "colab_type": "text", 184 | "id": "izaH0XwwUxDD" 185 | }, 186 | "source": [ 187 | "## The admissiondx table\n", 188 | "\n", 189 | "The `admissiondx` table contains the primary diagnosis for admission to the ICU according to the APACHE scoring criteria. For more detail, see: http://eicu-crd.mit.edu/eicutables/admissiondx/" 190 | ] 191 | }, 192 | { 193 | "cell_type": "code", 194 | "execution_count": 0, 195 | "metadata": { 196 | "colab": {}, 197 | "colab_type": "code", 198 | "id": "dlj3UCDTTEjj" 199 | }, 200 | "outputs": [], 201 | "source": [ 202 | "# set the where clause to select the stay of interest\n", 203 | "%%bigquery admissiondx\n", 204 | "\n", 205 | "SELECT *\n", 206 | "FROM `physionet-data.eicu_crd_demo.admissiondx`\n", 207 | "WHERE patientunitstayid = " 208 | ] 209 | }, 210 | { 211 | "cell_type": "code", 212 | "execution_count": 0, 213 | "metadata": { 214 | "colab": {}, 215 | "colab_type": "code", 216 | "id": "3wdEHFLJVMKm" 217 | }, 218 | "outputs": [], 219 | "source": [ 220 | "# View the columns in this data\n", 221 | "admissiondx.columns" 222 | ] 223 | }, 224 | { 225 | "cell_type": "code", 226 | "execution_count": 0, 227 | "metadata": { 228 | "colab": {}, 229 | "colab_type": "code", 230 | "id": "tbOA44lAVNLr" 231 | }, 232 | "outputs": [], 233 | "source": [ 234 | "# View the data\n", 235 | "admissiondx.head()" 236 | ] 237 | }, 238 | { 239 | "cell_type": "code", 240 | "execution_count": 0, 241 | "metadata": { 242 | "colab": {}, 243 | "colab_type": "code", 244 | "id": "Hc0y4ueOVWOk" 245 | }, 246 | "outputs": [], 247 | "source": [ 248 | "# Set the display options to avoid truncating the text\n", 249 | "pd.set_option('display.max_colwidth', -1)\n", 250 | "admissiondx.admitdxpath" 251 | ] 252 | }, 253 | { 254 | "cell_type": "markdown", 255 | "metadata": { 256 | "colab_type": "text", 257 | "id": "mSb_BrgvWDdD" 258 | }, 259 | "source": [ 260 | "## Questions\n", 261 | "\n", 262 | "- What was the primary reason for admission?\n", 263 | "- How soon after admission to the ICU was the diagnoses recorded in eCareManager? Hint: The `offset` columns indicate the time in minutes after admission to the ICU. " 264 | ] 265 | }, 266 | { 267 | "cell_type": "markdown", 268 | "metadata": { 269 | "colab_type": "text", 270 | "id": "rd3Tw6_kWwlS" 271 | }, 272 | "source": [ 273 | "## The apacheapsvar table\n", 274 | "\n", 275 | "The apacheapsvar table contains the variables used to calculate the Acute Physiology Score (APS) III for patients. APS-III is an established method of summarizing patient severity of illness on admission to the ICU, taking the \"worst\" observations for a patient in a 24 hour period.\n", 276 | "\n", 277 | "The score is part of the Acute Physiology Age Chronic Health Evaluation (APACHE) system of equations for predicting outcomes for ICU patients. See: http://eicu-crd.mit.edu/eicutables/apacheApsVar/" 278 | ] 279 | }, 280 | { 281 | "cell_type": "code", 282 | "execution_count": 0, 283 | "metadata": { 284 | "colab": {}, 285 | "colab_type": "code", 286 | "id": "fXOzR5XWVdNa" 287 | }, 288 | "outputs": [], 289 | "source": [ 290 | "# set the where clause to select the stay of interest\n", 291 | "%%bigquery apacheapsvar\n", 292 | "\n", 293 | "SELECT *\n", 294 | "FROM `physionet-data.eicu_crd_demo.apacheapsvar`\n", 295 | "WHERE patientunitstayid = " 296 | ] 297 | }, 298 | { 299 | "cell_type": "code", 300 | "execution_count": 0, 301 | "metadata": { 302 | "colab": {}, 303 | "colab_type": "code", 304 | "id": "mL_lVORdXDIg" 305 | }, 306 | "outputs": [], 307 | "source": [ 308 | "apacheapsvar.head()" 309 | ] 310 | }, 311 | { 312 | "cell_type": "markdown", 313 | "metadata": { 314 | "colab_type": "text", 315 | "id": "8x_Z8q4jXH7D" 316 | }, 317 | "source": [ 318 | "## Questions\n", 319 | "\n", 320 | "- What was the 'worst' heart rate recorded for the patient during the scoring period?\n", 321 | "- Was the patient oriented and able to converse normally on the day of admission? (hint: the verbal element refers to the Glasgow Coma Scale)." 322 | ] 323 | }, 324 | { 325 | "cell_type": "markdown", 326 | "metadata": { 327 | "colab_type": "text", 328 | "id": "XplJvhIYX432" 329 | }, 330 | "source": [ 331 | "# apachepredvar table\n", 332 | "\n", 333 | "The apachepredvar table provides variables underlying the APACHE predictions. Acute Physiology Age Chronic Health Evaluation (APACHE) consists of a groups of equations used for predicting outcomes in critically ill patients. See: http://eicu-crd.mit.edu/eicutables/apachePredVar/" 334 | ] 335 | }, 336 | { 337 | "cell_type": "code", 338 | "execution_count": 0, 339 | "metadata": { 340 | "colab": {}, 341 | "colab_type": "code", 342 | "id": "iAIFESy9XFhC" 343 | }, 344 | "outputs": [], 345 | "source": [ 346 | "# set the where clause to select the stay of interest\n", 347 | "%%bigquery apachepredvar\n", 348 | "\n", 349 | "SELECT *\n", 350 | "FROM `physionet-data.eicu_crd_demo.apachepredvar`\n", 351 | "WHERE patientunitstayid = " 352 | ] 353 | }, 354 | { 355 | "cell_type": "code", 356 | "execution_count": 0, 357 | "metadata": { 358 | "colab": {}, 359 | "colab_type": "code", 360 | "id": "LAu7G72cYEY1" 361 | }, 362 | "outputs": [], 363 | "source": [ 364 | "apachepredvar.columns" 365 | ] 366 | }, 367 | { 368 | "cell_type": "markdown", 369 | "metadata": { 370 | "colab_type": "text", 371 | "id": "IEaS6L9OY0vJ" 372 | }, 373 | "source": [ 374 | "## Questions\n", 375 | "\n", 376 | "- Was the patient ventilated during (APACHE) day 1 of their stay?\n", 377 | "- Is the patient recorded as having diabetes?" 378 | ] 379 | }, 380 | { 381 | "cell_type": "markdown", 382 | "metadata": { 383 | "colab_type": "text", 384 | "id": "nrTEkjxqZD2l" 385 | }, 386 | "source": [ 387 | "# `apachepatientresult` table\n", 388 | "\n", 389 | "The `apachepatientresult` table provides predictions made by the APACHE score (versions IV and IVa), including probability of mortality, length of stay, and ventilation days. See: http://eicu-crd.mit.edu/eicutables/apachePatientResult/" 390 | ] 391 | }, 392 | { 393 | "cell_type": "code", 394 | "execution_count": 0, 395 | "metadata": { 396 | "colab": {}, 397 | "colab_type": "code", 398 | "id": "M2RCJNBgZOJ2" 399 | }, 400 | "outputs": [], 401 | "source": [ 402 | "# set the where clause to select the stay of interest\n", 403 | "%%bigquery apachepatientresult\n", 404 | "\n", 405 | "SELECT *\n", 406 | "FROM `physionet-data.eicu_crd_demo.apachepatientresult`\n", 407 | "WHERE patientunitstayid = " 408 | ] 409 | }, 410 | { 411 | "cell_type": "code", 412 | "execution_count": 0, 413 | "metadata": { 414 | "colab": {}, 415 | "colab_type": "code", 416 | "id": "4whVaOP1Za8f" 417 | }, 418 | "outputs": [], 419 | "source": [ 420 | "apachepatientresult" 421 | ] 422 | }, 423 | { 424 | "cell_type": "markdown", 425 | "metadata": { 426 | "colab_type": "text", 427 | "id": "5YO_GQcNZUWR" 428 | }, 429 | "source": [ 430 | "## Questions\n", 431 | "\n", 432 | "- What versions of the APACHE score are computed?\n", 433 | "- How many days during the stay was the patient ventilated?\n", 434 | "- How long was the patient predicted to stay in hospital?\n", 435 | "- Was this prediction close to the truth?" 436 | ] 437 | } 438 | ], 439 | "metadata": { 440 | "colab": { 441 | "collapsed_sections": [], 442 | "include_colab_link": true, 443 | "name": "02-severity-of-illness", 444 | "provenance": [], 445 | "version": "0.3.2" 446 | }, 447 | "kernelspec": { 448 | "display_name": "Python 3", 449 | "language": "python", 450 | "name": "python3" 451 | }, 452 | "language_info": { 453 | "codemirror_mode": { 454 | "name": "ipython", 455 | "version": 3 456 | }, 457 | "file_extension": ".py", 458 | "mimetype": "text/x-python", 459 | "name": "python", 460 | "nbconvert_exporter": "python", 461 | "pygments_lexer": "ipython3", 462 | "version": "3.7.4" 463 | } 464 | }, 465 | "nbformat": 4, 466 | "nbformat_minor": 1 467 | } 468 | -------------------------------------------------------------------------------- /03_summary_statistics.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "nbformat": 4, 3 | "nbformat_minor": 0, 4 | "metadata": { 5 | "colab": { 6 | "name": "03-summary-statistics", 7 | "provenance": [], 8 | "collapsed_sections": [], 9 | "include_colab_link": true 10 | }, 11 | "kernelspec": { 12 | "display_name": "Python 3", 13 | "language": "python", 14 | "name": "python3" 15 | }, 16 | "language_info": { 17 | "codemirror_mode": { 18 | "name": "ipython", 19 | "version": 3 20 | }, 21 | "file_extension": ".py", 22 | "mimetype": "text/x-python", 23 | "name": "python", 24 | "nbconvert_exporter": "python", 25 | "pygments_lexer": "ipython3", 26 | "version": "3.7.4" 27 | } 28 | }, 29 | "cells": [ 30 | { 31 | "cell_type": "markdown", 32 | "metadata": { 33 | "id": "view-in-github", 34 | "colab_type": "text" 35 | }, 36 | "source": [ 37 | "\"Open" 38 | ] 39 | }, 40 | { 41 | "cell_type": "markdown", 42 | "metadata": { 43 | "colab_type": "text", 44 | "id": "1G_TVh1ybQkl" 45 | }, 46 | "source": [ 47 | "# eICU Collaborative Research Database\n", 48 | "\n", 49 | "# Notebook 3: Summary statistics\n", 50 | "\n", 51 | "This notebook shows how summary statistics can be computed for a patient cohort using the `tableone` package. Usage instructions for tableone are at: https://pypi.org/project/tableone/\n" 52 | ] 53 | }, 54 | { 55 | "cell_type": "markdown", 56 | "metadata": { 57 | "colab_type": "text", 58 | "id": "L9XF77F2bnee" 59 | }, 60 | "source": [ 61 | "## Load libraries and connect to the database" 62 | ] 63 | }, 64 | { 65 | "cell_type": "code", 66 | "metadata": { 67 | "colab_type": "code", 68 | "id": "wXiSE558bn_w", 69 | "colab": {} 70 | }, 71 | "source": [ 72 | "# Import libraries\n", 73 | "import numpy as np\n", 74 | "import os\n", 75 | "import pandas as pd\n", 76 | "import matplotlib.pyplot as plt\n", 77 | "\n", 78 | "# Make pandas dataframes prettier\n", 79 | "from IPython.display import display, HTML\n", 80 | "\n", 81 | "# Access data using Google BigQuery.\n", 82 | "from google.colab import auth\n", 83 | "from google.cloud import bigquery" 84 | ], 85 | "execution_count": 0, 86 | "outputs": [] 87 | }, 88 | { 89 | "cell_type": "code", 90 | "metadata": { 91 | "colab_type": "code", 92 | "id": "pLGnLAy-bsKb", 93 | "colab": {} 94 | }, 95 | "source": [ 96 | "# authenticate\n", 97 | "auth.authenticate_user()" 98 | ], 99 | "execution_count": 0, 100 | "outputs": [] 101 | }, 102 | { 103 | "cell_type": "code", 104 | "metadata": { 105 | "colab_type": "code", 106 | "id": "PUjFDFdobszs", 107 | "colab": {} 108 | }, 109 | "source": [ 110 | "# Set up environment variables\n", 111 | "project_id='sccm-datathon'\n", 112 | "os.environ[\"GOOGLE_CLOUD_PROJECT\"]=project_id" 113 | ], 114 | "execution_count": 0, 115 | "outputs": [] 116 | }, 117 | { 118 | "cell_type": "markdown", 119 | "metadata": { 120 | "colab_type": "text", 121 | "id": "iWDUCA5Nb5BK" 122 | }, 123 | "source": [ 124 | "## Install and load the `tableone` package\n", 125 | "\n", 126 | "The tableone package can be used to compute summary statistics for a patient cohort. Unlike the previous packages, it is not installed by default in Colab, so will need to install it first." 127 | ] 128 | }, 129 | { 130 | "cell_type": "code", 131 | "metadata": { 132 | "colab_type": "code", 133 | "id": "F9doCgtscOJd", 134 | "colab": {} 135 | }, 136 | "source": [ 137 | "!pip install tableone" 138 | ], 139 | "execution_count": 0, 140 | "outputs": [] 141 | }, 142 | { 143 | "cell_type": "code", 144 | "metadata": { 145 | "colab_type": "code", 146 | "id": "SDI_Q7W0b4Le", 147 | "colab": {} 148 | }, 149 | "source": [ 150 | "# Import the tableone class\n", 151 | "from tableone import TableOne" 152 | ], 153 | "execution_count": 0, 154 | "outputs": [] 155 | }, 156 | { 157 | "cell_type": "markdown", 158 | "metadata": { 159 | "colab_type": "text", 160 | "id": "14TU4lcrdD7I" 161 | }, 162 | "source": [ 163 | "## Load the patient cohort\n", 164 | "\n", 165 | "In this example, we will load all data from the patient data, and link it to APACHE data to provide richer summary information." 166 | ] 167 | }, 168 | { 169 | "cell_type": "code", 170 | "metadata": { 171 | "colab_type": "code", 172 | "id": "HF5WF5EObwfw", 173 | "colab": {} 174 | }, 175 | "source": [ 176 | "# Link the patient and apachepatientresult tables on patientunitstayid\n", 177 | "# using an inner join.\n", 178 | "%%bigquery cohort\n", 179 | "\n", 180 | "SELECT p.unitadmitsource, p.gender, p.age, p.ethnicity, p.admissionweight, \n", 181 | " p.unittype, p.unitstaytype, a.acutephysiologyscore,\n", 182 | " a.apachescore, a.actualiculos, a.actualhospitalmortality,\n", 183 | " a.unabridgedunitlos, a.unabridgedhosplos\n", 184 | "FROM `physionet-data.eicu_crd_demo.patient` p\n", 185 | "INNER JOIN `physionet-data.eicu_crd_demo.apachepatientresult` a\n", 186 | "ON p.patientunitstayid = a.patientunitstayid\n", 187 | "WHERE apacheversion LIKE 'IVa'" 188 | ], 189 | "execution_count": 0, 190 | "outputs": [] 191 | }, 192 | { 193 | "cell_type": "code", 194 | "metadata": { 195 | "colab_type": "code", 196 | "id": "k3hURHFihHNA", 197 | "colab": {} 198 | }, 199 | "source": [ 200 | "cohort.head()" 201 | ], 202 | "execution_count": 0, 203 | "outputs": [] 204 | }, 205 | { 206 | "cell_type": "markdown", 207 | "metadata": { 208 | "colab_type": "text", 209 | "id": "qnG8dVb2iHSn" 210 | }, 211 | "source": [ 212 | "## Calculate summary statistics\n", 213 | "\n", 214 | "Before summarizing the data, we will need to convert the ages to numerical values." 215 | ] 216 | }, 217 | { 218 | "cell_type": "code", 219 | "metadata": { 220 | "colab_type": "code", 221 | "id": "oKHpqwAPkx6U", 222 | "colab": {} 223 | }, 224 | "source": [ 225 | "cohort['agenum'] = pd.to_numeric(cohort['age'], errors='coerce')" 226 | ], 227 | "execution_count": 0, 228 | "outputs": [] 229 | }, 230 | { 231 | "cell_type": "code", 232 | "metadata": { 233 | "colab_type": "code", 234 | "id": "FQT-u8EXhXRG", 235 | "colab": {} 236 | }, 237 | "source": [ 238 | "columns = ['unitadmitsource', 'gender', 'agenum', 'ethnicity',\n", 239 | " 'admissionweight','unittype','unitstaytype',\n", 240 | " 'acutephysiologyscore','apachescore']" 241 | ], 242 | "execution_count": 0, 243 | "outputs": [] 244 | }, 245 | { 246 | "cell_type": "code", 247 | "metadata": { 248 | "colab_type": "code", 249 | "id": "3ETr3NCzielL", 250 | "colab": {} 251 | }, 252 | "source": [ 253 | "table = TableOne(cohort, columns=columns, rename={'agenum': 'age'}, \n", 254 | " groupby='actualhospitalmortality',\n", 255 | " label_suffix=True, limit=4, pval=False)\n", 256 | "\n", 257 | "print(table.tabulate(tablefmt = \"fancy_grid\"))" 258 | ], 259 | "execution_count": 0, 260 | "outputs": [] 261 | }, 262 | { 263 | "cell_type": "markdown", 264 | "metadata": { 265 | "colab_type": "text", 266 | "id": "LCBcpJ9bZpDp" 267 | }, 268 | "source": [ 269 | "## Questions\n", 270 | "\n", 271 | "- Are the severity of illness measures higher in the survival or non-survival group?" 272 | ] 273 | }, 274 | { 275 | "cell_type": "markdown", 276 | "metadata": { 277 | "colab_type": "text", 278 | "id": "2_8z1CIVahWg" 279 | }, 280 | "source": [ 281 | "## Visualizing the data\n", 282 | "\n", 283 | "Plotting the distribution of each variable by group level via histograms, kernel density estimates and boxplots is a crucial component to data analysis pipelines. Vizualisation is often is the only way to detect problematic variables in many real-life scenarios. We'll review a couple of the variables." 284 | ] 285 | }, 286 | { 287 | "cell_type": "code", 288 | "metadata": { 289 | "colab_type": "code", 290 | "id": "81yp2bSUigzh", 291 | "colab": {} 292 | }, 293 | "source": [ 294 | "# Plot distributions\n", 295 | "cohort[['acutephysiologyscore','agenum']].dropna().plot.kde(figsize=[12,8])\n", 296 | "plt.legend(['APS Score', 'Age (years)'])\n", 297 | "plt.xlim([-30,250])" 298 | ], 299 | "execution_count": 0, 300 | "outputs": [] 301 | } 302 | ] 303 | } -------------------------------------------------------------------------------- /05_mortality_prediction.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": { 6 | "colab_type": "text", 7 | "id": "view-in-github" 8 | }, 9 | "source": [ 10 | "\"Open" 11 | ] 12 | }, 13 | { 14 | "cell_type": "markdown", 15 | "metadata": { 16 | "colab_type": "text", 17 | "id": "T3wdKZCPklNq" 18 | }, 19 | "source": [ 20 | "# eICU Collaborative Research Database\n", 21 | "\n", 22 | "# Notebook 5: Mortality prediction\n", 23 | "\n", 24 | "This notebook explores how a logistic regression can be trained to predict in-hospital mortality of patients.\n" 25 | ] 26 | }, 27 | { 28 | "cell_type": "markdown", 29 | "metadata": { 30 | "colab_type": "text", 31 | "id": "rG3HrM7GkwCH" 32 | }, 33 | "source": [ 34 | "## Load libraries and connect to the database" 35 | ] 36 | }, 37 | { 38 | "cell_type": "code", 39 | "execution_count": 0, 40 | "metadata": { 41 | "colab": {}, 42 | "colab_type": "code", 43 | "id": "s-MoFA6NkkbZ" 44 | }, 45 | "outputs": [], 46 | "source": [ 47 | "# Import libraries\n", 48 | "import numpy as np\n", 49 | "import os\n", 50 | "import pandas as pd\n", 51 | "import matplotlib.pyplot as plt\n", 52 | "\n", 53 | "# model building\n", 54 | "from sklearn.model_selection import train_test_split\n", 55 | "from sklearn.linear_model import LogisticRegression\n", 56 | "from sklearn.pipeline import Pipeline\n", 57 | "from sklearn import preprocessing\n", 58 | "from sklearn import metrics\n", 59 | "from sklearn import impute\n", 60 | "\n", 61 | "# Make pandas dataframes prettier\n", 62 | "from IPython.display import display, HTML\n", 63 | "\n", 64 | "# Access data using Google BigQuery.\n", 65 | "from google.colab import auth\n", 66 | "from google.cloud import bigquery" 67 | ] 68 | }, 69 | { 70 | "cell_type": "code", 71 | "execution_count": 0, 72 | "metadata": { 73 | "colab": {}, 74 | "colab_type": "code", 75 | "id": "jyBV_Q9DkyD3" 76 | }, 77 | "outputs": [], 78 | "source": [ 79 | "# authenticate\n", 80 | "auth.authenticate_user()" 81 | ] 82 | }, 83 | { 84 | "cell_type": "code", 85 | "execution_count": 0, 86 | "metadata": { 87 | "colab": {}, 88 | "colab_type": "code", 89 | "id": "cF1udJKhkzYq" 90 | }, 91 | "outputs": [], 92 | "source": [ 93 | "# Set up environment variables\n", 94 | "project_id='sccm-datathon'\n", 95 | "os.environ[\"GOOGLE_CLOUD_PROJECT\"]=project_id" 96 | ] 97 | }, 98 | { 99 | "cell_type": "markdown", 100 | "metadata": { 101 | "colab_type": "text", 102 | "id": "LgcRCqxCk3HC" 103 | }, 104 | "source": [ 105 | "## Load the patient cohort\n", 106 | "\n", 107 | "In this example, we will load all data from the patient data, and link it to APACHE data to provide richer summary information." 108 | ] 109 | }, 110 | { 111 | "cell_type": "code", 112 | "execution_count": 0, 113 | "metadata": { 114 | "colab": {}, 115 | "colab_type": "code", 116 | "id": "ReCl7-aek1-k" 117 | }, 118 | "outputs": [], 119 | "source": [ 120 | "# Link the patient and apachepatientresult tables on patientunitstayid\n", 121 | "# using an inner join.\n", 122 | "%%bigquery cohort\n", 123 | "\n", 124 | "SELECT p.unitadmitsource, p.gender, p.age, p.admissionweight, \n", 125 | " p.unittype, p.unitstaytype, a.acutephysiologyscore,\n", 126 | " a.apachescore, a.actualhospitalmortality\n", 127 | "FROM `physionet-data.eicu_crd_demo.patient` p\n", 128 | "INNER JOIN `physionet-data.eicu_crd_demo.apachepatientresult` a\n", 129 | "ON p.patientunitstayid = a.patientunitstayid\n", 130 | "WHERE apacheversion LIKE 'IVa'" 131 | ] 132 | }, 133 | { 134 | "cell_type": "code", 135 | "execution_count": 0, 136 | "metadata": { 137 | "colab": {}, 138 | "colab_type": "code", 139 | "id": "yxLctVBpk9sO" 140 | }, 141 | "outputs": [], 142 | "source": [ 143 | "cohort.head()" 144 | ] 145 | }, 146 | { 147 | "cell_type": "markdown", 148 | "metadata": { 149 | "colab_type": "text", 150 | "id": "NPlwRV2buYb1" 151 | }, 152 | "source": [ 153 | "## Prepare the data for analysis" 154 | ] 155 | }, 156 | { 157 | "cell_type": "code", 158 | "execution_count": 0, 159 | "metadata": { 160 | "colab": {}, 161 | "colab_type": "code", 162 | "id": "v3OJ4LDvueKu" 163 | }, 164 | "outputs": [], 165 | "source": [ 166 | "# review the data dataset\n", 167 | "print(cohort.info())" 168 | ] 169 | }, 170 | { 171 | "cell_type": "code", 172 | "execution_count": 0, 173 | "metadata": { 174 | "colab": {}, 175 | "colab_type": "code", 176 | "id": "s4wQ6o_RvLph" 177 | }, 178 | "outputs": [], 179 | "source": [ 180 | "# Encode the categorical data\n", 181 | "encoder = preprocessing.LabelEncoder()\n", 182 | "cohort['gender_code'] = encoder.fit_transform(cohort['gender'])\n", 183 | "cohort['admissionweight_code'] = encoder.fit_transform(cohort['admissionweight'])\n", 184 | "cohort['unittype_code'] = encoder.fit_transform(cohort['unittype'])\n", 185 | "cohort['apachescore_code'] = encoder.fit_transform(cohort['apachescore'])\n", 186 | "cohort['actualhospitalmortality_code'] = encoder.fit_transform(cohort['actualhospitalmortality'])" 187 | ] 188 | }, 189 | { 190 | "cell_type": "code", 191 | "execution_count": 0, 192 | "metadata": { 193 | "colab": {}, 194 | "colab_type": "code", 195 | "id": "4ogi_ns-ylnP" 196 | }, 197 | "outputs": [], 198 | "source": [ 199 | "# Handle the deidentified ages\n", 200 | "cohort['agenum'] = pd.to_numeric(cohort['age'], downcast='integer', errors='coerce')" 201 | ] 202 | }, 203 | { 204 | "cell_type": "code", 205 | "execution_count": 0, 206 | "metadata": { 207 | "colab": {}, 208 | "colab_type": "code", 209 | "id": "77M0QJQ5wcPQ" 210 | }, 211 | "outputs": [], 212 | "source": [ 213 | "# Preview the encoded data\n", 214 | "cohort[['gender','gender_code']].head()" 215 | ] 216 | }, 217 | { 218 | "cell_type": "code", 219 | "execution_count": 0, 220 | "metadata": { 221 | "colab": {}, 222 | "colab_type": "code", 223 | "id": "GqvwTNPN3KZz" 224 | }, 225 | "outputs": [], 226 | "source": [ 227 | "# Check the outcome variable\n", 228 | "cohort['actualhospitalmortality_code'].unique()" 229 | ] 230 | }, 231 | { 232 | "cell_type": "markdown", 233 | "metadata": { 234 | "colab_type": "text", 235 | "id": "ze7y5J4Ioz8u" 236 | }, 237 | "source": [ 238 | "## Create our train and test sets" 239 | ] 240 | }, 241 | { 242 | "cell_type": "code", 243 | "execution_count": 0, 244 | "metadata": { 245 | "colab": {}, 246 | "colab_type": "code", 247 | "id": "i5zXkn_AlDJW" 248 | }, 249 | "outputs": [], 250 | "source": [ 251 | "predictors = ['gender_code','agenum','apachescore_code','unittype_code',\n", 252 | " 'admissionweight_code']\n", 253 | "outcome = 'actualhospitalmortality_code'\n", 254 | "\n", 255 | "X = cohort[predictors]\n", 256 | "y = cohort[outcome]" 257 | ] 258 | }, 259 | { 260 | "cell_type": "code", 261 | "execution_count": 0, 262 | "metadata": { 263 | "colab": {}, 264 | "colab_type": "code", 265 | "id": "IHhIgDUwocmA" 266 | }, 267 | "outputs": [], 268 | "source": [ 269 | "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=10)" 270 | ] 271 | }, 272 | { 273 | "cell_type": "code", 274 | "execution_count": 0, 275 | "metadata": { 276 | "colab": {}, 277 | "colab_type": "code", 278 | "id": "NvQWkuY6nkZ8" 279 | }, 280 | "outputs": [], 281 | "source": [ 282 | "# Review the number of cases in each set\n", 283 | "print(\"Train data: {}\".format(len(X_train)))\n", 284 | "print(\"Test data: {}\".format(len(X_test)))\n" 285 | ] 286 | }, 287 | { 288 | "cell_type": "markdown", 289 | "metadata": { 290 | "colab_type": "text", 291 | "id": "b2waK5qBqanC" 292 | }, 293 | "source": [ 294 | "## Build the model" 295 | ] 296 | }, 297 | { 298 | "cell_type": "code", 299 | "execution_count": 0, 300 | "metadata": { 301 | "colab": {}, 302 | "colab_type": "code", 303 | "id": "EVoWS8HX3Sek" 304 | }, 305 | "outputs": [], 306 | "source": [ 307 | "# Create an instance of the model\n", 308 | "model = LogisticRegression(solver='lbfgs')\n" 309 | ] 310 | }, 311 | { 312 | "cell_type": "code", 313 | "execution_count": 0, 314 | "metadata": { 315 | "colab": {}, 316 | "colab_type": "code", 317 | "id": "sCWwZnc30ahA" 318 | }, 319 | "outputs": [], 320 | "source": [ 321 | "# Impute missing values and scale using a pipeline\n", 322 | "estimator = Pipeline([(\"imputer\", impute.SimpleImputer(missing_values=np.nan, strategy=\"mean\")),\n", 323 | " (\"scaler\", preprocessing.StandardScaler()),\n", 324 | " (\"logistic_regression\", model)])\n" 325 | ] 326 | }, 327 | { 328 | "cell_type": "code", 329 | "execution_count": 0, 330 | "metadata": { 331 | "colab": {}, 332 | "colab_type": "code", 333 | "id": "k_-lrq1A0rCh" 334 | }, 335 | "outputs": [], 336 | "source": [ 337 | "# Fit the model to the training data\n", 338 | "estimator.fit(X_train, y_train)" 339 | ] 340 | }, 341 | { 342 | "cell_type": "markdown", 343 | "metadata": { 344 | "colab_type": "text", 345 | "id": "NMDmhhnlzr9Z" 346 | }, 347 | "source": [ 348 | "## Testing" 349 | ] 350 | }, 351 | { 352 | "cell_type": "code", 353 | "execution_count": 0, 354 | "metadata": { 355 | "colab": {}, 356 | "colab_type": "code", 357 | "id": "Pf4G20-VGdvm" 358 | }, 359 | "outputs": [], 360 | "source": [ 361 | "y_pred = estimator.predict(X_test)\n", 362 | "print('Accuracy of logistic regression classifier on the test set: {:.2f}'.format(estimator.score(X_test, y_test)))" 363 | ] 364 | }, 365 | { 366 | "cell_type": "code", 367 | "execution_count": 0, 368 | "metadata": { 369 | "colab": {}, 370 | "colab_type": "code", 371 | "id": "akOjuNz8qgMd" 372 | }, 373 | "outputs": [], 374 | "source": [ 375 | "print(metrics.classification_report(y_test, y_pred))" 376 | ] 377 | }, 378 | { 379 | "cell_type": "code", 380 | "execution_count": 0, 381 | "metadata": { 382 | "colab": {}, 383 | "colab_type": "code", 384 | "id": "gH1w0RBH1JjT" 385 | }, 386 | "outputs": [], 387 | "source": [ 388 | "logit_roc_auc = metrics.roc_auc_score(y_test, estimator.predict(X_test))\n", 389 | "fpr, tpr, thresholds = metrics.roc_curve(y_test, estimator.predict_proba(X_test)[:,1])\n", 390 | "\n", 391 | "plt.figure()\n", 392 | "plt.plot(fpr, tpr, label='Logistic Regression (area = %0.2f)' % logit_roc_auc)\n", 393 | "plt.plot([0, 1], [0, 1],'r--')\n", 394 | "plt.xlim([0.0, 1.0])\n", 395 | "plt.ylim([0.0, 1.05])\n", 396 | "\n", 397 | "plt.xlabel('False Positives')\n", 398 | "plt.ylabel('True Positives')\n", 399 | "plt.title('Receiver operating characteristic')\n", 400 | "plt.legend(loc=\"lower right\")\n", 401 | "plt.savefig('Log_ROC')\n", 402 | "plt.show()" 403 | ] 404 | } 405 | ], 406 | "metadata": { 407 | "colab": { 408 | "collapsed_sections": [], 409 | "include_colab_link": true, 410 | "name": "05-mortality-prediction", 411 | "provenance": [], 412 | "version": "0.3.2" 413 | }, 414 | "kernelspec": { 415 | "display_name": "Python 3", 416 | "language": "python", 417 | "name": "python3" 418 | }, 419 | "language_info": { 420 | "codemirror_mode": { 421 | "name": "ipython", 422 | "version": 3 423 | }, 424 | "file_extension": ".py", 425 | "mimetype": "text/x-python", 426 | "name": "python", 427 | "nbconvert_exporter": "python", 428 | "pygments_lexer": "ipython3", 429 | "version": "3.7.4" 430 | } 431 | }, 432 | "nbformat": 4, 433 | "nbformat_minor": 1 434 | } 435 | -------------------------------------------------------------------------------- /06_aki_project.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": { 6 | "colab_type": "text", 7 | "id": "view-in-github" 8 | }, 9 | "source": [ 10 | "\"Open" 11 | ] 12 | }, 13 | { 14 | "cell_type": "markdown", 15 | "metadata": { 16 | "colab_type": "text", 17 | "id": "7HXE-dGyLHYa" 18 | }, 19 | "source": [ 20 | "# eICU Collaborative Research Database\n", 21 | "\n", 22 | "# Notebook 6: An example project\n", 23 | "\n", 24 | "This notebook introduces a project focused on acute kidney injury, quantifying differences between patients with and without the condition." 25 | ] 26 | }, 27 | { 28 | "cell_type": "markdown", 29 | "metadata": { 30 | "colab_type": "text", 31 | "id": "2hTYG_w4Lzfg" 32 | }, 33 | "source": [ 34 | "## Load libraries and connect to the database" 35 | ] 36 | }, 37 | { 38 | "cell_type": "code", 39 | "execution_count": 0, 40 | "metadata": { 41 | "colab": {}, 42 | "colab_type": "code", 43 | "id": "_Z_G2UCcLoii" 44 | }, 45 | "outputs": [], 46 | "source": [ 47 | "# Import libraries\n", 48 | "import numpy as np\n", 49 | "import os\n", 50 | "import pandas as pd\n", 51 | "import matplotlib.pyplot as plt\n", 52 | "import matplotlib.patches as patches\n", 53 | "import matplotlib.path as path\n", 54 | "\n", 55 | "# Make pandas dataframes prettier\n", 56 | "from IPython.display import display, HTML\n", 57 | "\n", 58 | "# Access data using Google BigQuery.\n", 59 | "from google.colab import auth\n", 60 | "from google.cloud import bigquery" 61 | ] 62 | }, 63 | { 64 | "cell_type": "code", 65 | "execution_count": 0, 66 | "metadata": { 67 | "colab": {}, 68 | "colab_type": "code", 69 | "id": "1f3Ahq0hL1xv" 70 | }, 71 | "outputs": [], 72 | "source": [ 73 | "# authenticate\n", 74 | "auth.authenticate_user()" 75 | ] 76 | }, 77 | { 78 | "cell_type": "code", 79 | "execution_count": 0, 80 | "metadata": { 81 | "colab": {}, 82 | "colab_type": "code", 83 | "id": "DbwAi_e2L3eO" 84 | }, 85 | "outputs": [], 86 | "source": [ 87 | "# Set up environment variables\n", 88 | "project_id='sccm-datathon'\n", 89 | "os.environ[\"GOOGLE_CLOUD_PROJECT\"]=project_id" 90 | ] 91 | }, 92 | { 93 | "cell_type": "markdown", 94 | "metadata": { 95 | "colab_type": "text", 96 | "id": "Pown2uTtL9kz" 97 | }, 98 | "source": [ 99 | "## Define the cohort\n", 100 | "\n", 101 | "Our first step is to define the patient population we are interested in. For this project, we'd like to identify those patients with any past history of renal failure and compare them with the remaining patients.\n", 102 | "\n", 103 | "First, we extract all patient unit stays from the patient table.\n" 104 | ] 105 | }, 106 | { 107 | "cell_type": "code", 108 | "execution_count": 0, 109 | "metadata": { 110 | "colab": {}, 111 | "colab_type": "code", 112 | "id": "Qa3TYl2PL7-i" 113 | }, 114 | "outputs": [], 115 | "source": [ 116 | "# Link the patient and apachepatientresult tables on patientunitstayid\n", 117 | "# using an inner join.\n", 118 | "%%bigquery patient\n", 119 | "\n", 120 | "SELECT *\n", 121 | "FROM `physionet-data.eicu_crd_demo.patient`" 122 | ] 123 | }, 124 | { 125 | "cell_type": "markdown", 126 | "metadata": { 127 | "colab_type": "text", 128 | "id": "NiJ7V6QBMUuX" 129 | }, 130 | "source": [ 131 | "Now we investigate the pasthistory table, and look at all the mentions of past history which contain the phrase 'Renal (R)' - note we use % as they are wildcard characters for SQL.\n", 132 | "\n" 133 | ] 134 | }, 135 | { 136 | "cell_type": "code", 137 | "execution_count": null, 138 | "metadata": {}, 139 | "outputs": [], 140 | "source": [ 141 | "%%bigquery ph\n", 142 | "\n", 143 | "SELECT pasthistorypath, count(*) as n\n", 144 | "FROM `physionet-data.eicu_crd_demo.pasthistory`\n", 145 | "WHERE pasthistorypath LIKE '%Renal (R)%'\n", 146 | "GROUP BY pasthistorypath\n", 147 | "ORDER BY n DESC;" 148 | ] 149 | }, 150 | { 151 | "cell_type": "code", 152 | "execution_count": 0, 153 | "metadata": { 154 | "colab": {}, 155 | "colab_type": "code", 156 | "id": "V4JrlnenMSJ-" 157 | }, 158 | "outputs": [], 159 | "source": [ 160 | "for row in ph.iterrows():\n", 161 | " r = row[1]\n", 162 | " print('{:3g} - {:20s}'.format(r['n'],r['pasthistorypath'][48:]))" 163 | ] 164 | }, 165 | { 166 | "cell_type": "markdown", 167 | "metadata": { 168 | "colab_type": "text", 169 | "id": "oLA3lat9MirI" 170 | }, 171 | "source": [ 172 | "These all seem like reasonable surrogates for renal insufficiency (note: for a real clinical study, you'd want to be a lot more thorough!).\n", 173 | "\n" 174 | ] 175 | }, 176 | { 177 | "cell_type": "code", 178 | "execution_count": 0, 179 | "metadata": { 180 | "colab": {}, 181 | "colab_type": "code", 182 | "id": "fygnwv0OMfZg" 183 | }, 184 | "outputs": [], 185 | "source": [ 186 | "# identify patients with insufficiency\n", 187 | "%%bigquery df_have_crf\n", 188 | "\n", 189 | "SELECT DISTINCT patientunitstayid\n", 190 | "FROM `physionet-data.eicu_crd_demo.pasthistory`\n", 191 | "WHERE pasthistorypath LIKE '%Renal (R)%'" 192 | ] 193 | }, 194 | { 195 | "cell_type": "code", 196 | "execution_count": null, 197 | "metadata": {}, 198 | "outputs": [], 199 | "source": [ 200 | "df_have_crf['crf'] = 1" 201 | ] 202 | }, 203 | { 204 | "cell_type": "code", 205 | "execution_count": 0, 206 | "metadata": { 207 | "colab": {}, 208 | "colab_type": "code", 209 | "id": "JUZ60JVnMpFd" 210 | }, 211 | "outputs": [], 212 | "source": [ 213 | "# merge the data above into our original dataframe\n", 214 | "df = patient.merge(df_have_crf, \n", 215 | " how='left', \n", 216 | " left_on='patientunitstayid', \n", 217 | " right_on='patientunitstayid')\n", 218 | "\n", 219 | "df.head()" 220 | ] 221 | }, 222 | { 223 | "cell_type": "code", 224 | "execution_count": 0, 225 | "metadata": { 226 | "colab": {}, 227 | "colab_type": "code", 228 | "id": "idLXqNGrMvQF" 229 | }, 230 | "outputs": [], 231 | "source": [ 232 | "# impute 0s for the missing CRF values\n", 233 | "df.fillna(value=0,inplace=True)\n", 234 | "df.head()" 235 | ] 236 | }, 237 | { 238 | "cell_type": "code", 239 | "execution_count": 0, 240 | "metadata": { 241 | "colab": {}, 242 | "colab_type": "code", 243 | "id": "dRCZ1KoTM7uw" 244 | }, 245 | "outputs": [], 246 | "source": [ 247 | "# set patientunitstayid as the index - convenient for indexing later\n", 248 | "df.set_index('patientunitstayid',inplace=True)" 249 | ] 250 | }, 251 | { 252 | "cell_type": "markdown", 253 | "metadata": { 254 | "colab_type": "text", 255 | "id": "GPDavuXVM_0G" 256 | }, 257 | "source": [ 258 | "## Load creatinine from lab table\n" 259 | ] 260 | }, 261 | { 262 | "cell_type": "code", 263 | "execution_count": 0, 264 | "metadata": { 265 | "colab": {}, 266 | "colab_type": "code", 267 | "id": "XGHj_sVJM96D" 268 | }, 269 | "outputs": [], 270 | "source": [ 271 | "%%bigquery lab\n", 272 | "\n", 273 | "SELECT patientunitstayid, labresult\n", 274 | "FROM `physionet-data.eicu_crd_demo.lab`\n", 275 | "WHERE labname = 'creatinine'" 276 | ] 277 | }, 278 | { 279 | "cell_type": "code", 280 | "execution_count": null, 281 | "metadata": {}, 282 | "outputs": [], 283 | "source": [ 284 | "# set patientunitstayid as the index\n", 285 | "lab.set_index('patientunitstayid', inplace=True)" 286 | ] 287 | }, 288 | { 289 | "cell_type": "code", 290 | "execution_count": 0, 291 | "metadata": { 292 | "colab": {}, 293 | "colab_type": "code", 294 | "id": "swgESA5TNGiS" 295 | }, 296 | "outputs": [], 297 | "source": [ 298 | "# get first creatinine by grouping by the index (level=0)\n", 299 | "cr_first = lab.groupby(level=0).first()\n", 300 | "\n", 301 | "# similarly get maximum creatinine\n", 302 | "cr_max = lab.groupby(level=0).max()" 303 | ] 304 | }, 305 | { 306 | "cell_type": "markdown", 307 | "metadata": { 308 | "colab_type": "text", 309 | "id": "PYEWT8IfNQry" 310 | }, 311 | "source": [ 312 | "## Plot distributions of creatinine in both groups\n" 313 | ] 314 | }, 315 | { 316 | "cell_type": "code", 317 | "execution_count": 0, 318 | "metadata": { 319 | "colab": {}, 320 | "colab_type": "code", 321 | "id": "5N4XEIbcNO9Q" 322 | }, 323 | "outputs": [], 324 | "source": [ 325 | "plt.figure(figsize=[10,6])\n", 326 | "\n", 327 | "xi = np.arange(0,10,0.1)\n", 328 | "\n", 329 | "# get patients who had CRF and plot a histogram\n", 330 | "idx = df.loc[df['crf']==1,:].index\n", 331 | "plt.hist( cr_first.loc[idx,'labresult'].dropna(), bins=xi, label='With CRF' )\n", 332 | "\n", 333 | "# get patients who did not have CRF\n", 334 | "idx = df.loc[df['crf']==0,:].index\n", 335 | "plt.hist( cr_first.loc[idx,'labresult'].dropna(), alpha=0.5, bins=xi, label='No CRF' )\n", 336 | "\n", 337 | "plt.legend()\n", 338 | "\n", 339 | "plt.show()" 340 | ] 341 | }, 342 | { 343 | "cell_type": "markdown", 344 | "metadata": { 345 | "colab_type": "text", 346 | "id": "UFIOPs8TNYJV" 347 | }, 348 | "source": [ 349 | "While it appears that patients in the red group have higher creatinines, we have far more patients in the blue group (no CRF) than in the red group (have CRF). To alleviate this and allow a fairer comparison, we can normalize the histogram.\n", 350 | "\n" 351 | ] 352 | }, 353 | { 354 | "cell_type": "code", 355 | "execution_count": 0, 356 | "metadata": { 357 | "colab": {}, 358 | "colab_type": "code", 359 | "id": "5P3B_uUeNUiR" 360 | }, 361 | "outputs": [], 362 | "source": [ 363 | "plt.figure(figsize=[10,6])\n", 364 | "\n", 365 | "xi = np.arange(0,10,0.1)\n", 366 | "\n", 367 | "# get patients who had CRF and plot a histogram\n", 368 | "idx = df.loc[df['crf']==1,:].index\n", 369 | "plt.hist( cr_first.loc[idx,'labresult'].dropna(), bins=xi, normed=True,\n", 370 | " label='With CRF' )\n", 371 | "\n", 372 | "# get patients who did not have CRF\n", 373 | "idx = df.loc[df['crf']==0,:].index\n", 374 | "plt.hist( cr_first.loc[idx,'labresult'].dropna(), alpha=0.5, bins=xi, normed=True,\n", 375 | " label='No CRF' )\n", 376 | "\n", 377 | "plt.legend()\n", 378 | "\n", 379 | "plt.show()" 380 | ] 381 | }, 382 | { 383 | "cell_type": "markdown", 384 | "metadata": { 385 | "colab_type": "text", 386 | "id": "oagJ1XQ8NcKg" 387 | }, 388 | "source": [ 389 | "Here we can very clearly see that the first creatinine measured is a lot higher for patients with some baseline kidney dysfunction when compared to those without. Let's try it with the highest value.\n", 390 | "\n" 391 | ] 392 | }, 393 | { 394 | "cell_type": "code", 395 | "execution_count": 0, 396 | "metadata": { 397 | "colab": {}, 398 | "colab_type": "code", 399 | "id": "-aBkodMGNZ_O" 400 | }, 401 | "outputs": [], 402 | "source": [ 403 | "plt.figure(figsize=[10,6])\n", 404 | "\n", 405 | "xi = np.arange(0,10,0.1)\n", 406 | "\n", 407 | "# get patients who had CRF and plot a histogram\n", 408 | "idx = df.loc[df['crf']==1,:].index\n", 409 | "plt.hist( cr_max.loc[idx,'labresult'].dropna(), bins=xi, normed=True,\n", 410 | " label='With CRF' )\n", 411 | "\n", 412 | "# get patients who did not have CRF\n", 413 | "idx = df.loc[df['crf']==0,:].index\n", 414 | "plt.hist( cr_max.loc[idx,'labresult'].dropna(), alpha=0.5, bins=xi, normed=True,\n", 415 | " label='No CRF' )\n", 416 | "\n", 417 | "plt.legend()\n", 418 | "\n", 419 | "plt.show()" 420 | ] 421 | }, 422 | { 423 | "cell_type": "markdown", 424 | "metadata": { 425 | "colab_type": "text", 426 | "id": "F2upj7XaNf7b" 427 | }, 428 | "source": [ 429 | "Unsuprisingly, a very similar story!" 430 | ] 431 | } 432 | ], 433 | "metadata": { 434 | "colab": { 435 | "collapsed_sections": [], 436 | "include_colab_link": true, 437 | "name": "06-aki-project.ipynb", 438 | "provenance": [], 439 | "version": "0.3.2" 440 | }, 441 | "kernelspec": { 442 | "display_name": "Python 3", 443 | "language": "python", 444 | "name": "python3" 445 | }, 446 | "language_info": { 447 | "codemirror_mode": { 448 | "name": "ipython", 449 | "version": 3 450 | }, 451 | "file_extension": ".py", 452 | "mimetype": "text/x-python", 453 | "name": "python", 454 | "nbconvert_exporter": "python", 455 | "pygments_lexer": "ipython3", 456 | "version": "3.7.4" 457 | } 458 | }, 459 | "nbformat": 4, 460 | "nbformat_minor": 1 461 | } 462 | -------------------------------------------------------------------------------- /07_project_work.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": { 6 | "colab_type": "text", 7 | "id": "view-in-github" 8 | }, 9 | "source": [ 10 | "\"Open" 11 | ] 12 | }, 13 | { 14 | "cell_type": "markdown", 15 | "metadata": { 16 | "colab_type": "text", 17 | "id": "GsWKSUPhN3es" 18 | }, 19 | "source": [ 20 | "# eICU Collaborative Research Database\n", 21 | "\n", 22 | "# Notebook 7: Project work\n", 23 | "\n", 24 | "This notebook is intended as a starting point for future projects." 25 | ] 26 | }, 27 | { 28 | "cell_type": "markdown", 29 | "metadata": { 30 | "colab_type": "text", 31 | "id": "Gbgg16I9OIKI" 32 | }, 33 | "source": [ 34 | "## Load libraries and connect to the database" 35 | ] 36 | }, 37 | { 38 | "cell_type": "code", 39 | "execution_count": 0, 40 | "metadata": { 41 | "colab": {}, 42 | "colab_type": "code", 43 | "id": "fUXc8SjTOFMJ" 44 | }, 45 | "outputs": [], 46 | "source": [ 47 | "# Import libraries\n", 48 | "import numpy as np\n", 49 | "import os\n", 50 | "import pandas as pd\n", 51 | "import matplotlib.pyplot as plt\n", 52 | "import matplotlib.patches as patches\n", 53 | "import matplotlib.path as path\n", 54 | "\n", 55 | "# Make pandas dataframes prettier\n", 56 | "from IPython.display import display, HTML\n", 57 | "\n", 58 | "# Access data using Google BigQuery.\n", 59 | "from google.colab import auth\n", 60 | "from google.cloud import bigquery" 61 | ] 62 | }, 63 | { 64 | "cell_type": "code", 65 | "execution_count": 0, 66 | "metadata": { 67 | "colab": {}, 68 | "colab_type": "code", 69 | "id": "tACn8gYaOJqc" 70 | }, 71 | "outputs": [], 72 | "source": [ 73 | "# authenticate\n", 74 | "auth.authenticate_user()" 75 | ] 76 | }, 77 | { 78 | "cell_type": "code", 79 | "execution_count": 0, 80 | "metadata": { 81 | "colab": {}, 82 | "colab_type": "code", 83 | "id": "xGzQLXJAOK-c" 84 | }, 85 | "outputs": [], 86 | "source": [ 87 | "# Set up environment variables\n", 88 | "project_id='sccm-datathon'\n", 89 | "os.environ[\"GOOGLE_CLOUD_PROJECT\"]=project_id" 90 | ] 91 | }, 92 | { 93 | "cell_type": "markdown", 94 | "metadata": { 95 | "colab_type": "text", 96 | "id": "2lQ03IAjORL8" 97 | }, 98 | "source": [ 99 | "## Choose a project!" 100 | ] 101 | }, 102 | { 103 | "cell_type": "code", 104 | "execution_count": 0, 105 | "metadata": { 106 | "colab": {}, 107 | "colab_type": "code", 108 | "id": "K7znlFcTONlT" 109 | }, 110 | "outputs": [], 111 | "source": [] 112 | } 113 | ], 114 | "metadata": { 115 | "colab": { 116 | "collapsed_sections": [], 117 | "include_colab_link": true, 118 | "name": "07-project-work", 119 | "provenance": [], 120 | "version": "0.3.2" 121 | }, 122 | "kernelspec": { 123 | "display_name": "Python 3", 124 | "language": "python", 125 | "name": "python3" 126 | }, 127 | "language_info": { 128 | "codemirror_mode": { 129 | "name": "ipython", 130 | "version": 3 131 | }, 132 | "file_extension": ".py", 133 | "mimetype": "text/x-python", 134 | "name": "python", 135 | "nbconvert_exporter": "python", 136 | "pygments_lexer": "ipython3", 137 | "version": "3.7.4" 138 | } 139 | }, 140 | "nbformat": 4, 141 | "nbformat_minor": 1 142 | } 143 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 MIT Laboratory for Computational Physiology 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Society of Critical Care Medicine (SCCM) Datathon (14-15 February) 2 | 3 | This repository contains resources for the [Society of Critical Care Medicine (SCCM) Datathon 2020](https://www.sccm.org/Education-Center/Annual-Congress/Program/Data-Science-Datathon). 4 | 5 | ## Contents 6 | 7 | 1. Getting started 8 | 2. Documentation 9 | 3. Databases on BigQuery 10 | 4. Analysing data with Google Colab 11 | 5. Python notebooks that we prepared earlier 12 | 6. An example in R 13 | 7. Sample projects 14 | 15 | ## 1. Getting started 16 | 17 | The datasets are hosted on Google Cloud, which requires a Gmail account to manage permissions. 18 | 19 | 1. Create a [Gmail account](https://www.google.com/gmail/about/), if you don't already have one. It will be used to manage your access to the resources. 20 | 2. Give your gmail address to the session hosts. 21 | 22 | ## 2. Documentation 23 | 24 | We will be working with two critical care datasets during the event: [MIMIC-III](https://mimic.physionet.org/) and the [eICU Collaborative Research Database](https://eicu-crd.mit.edu/). 25 | 26 | - MIMIC-III Clinical Database: https://mimic.physionet.org/ 27 | - eICU Collaborative Research Database: https://eicu-crd.mit.edu/ 28 | 29 | ## 3. Databases on BigQuery 30 | 31 | BigQuery is a database system that makes it easy to explore data with Structured Query Language ("SQL"). There are several datasets on BigQuery available for you to explore, including `eicu_crd` (the eICU Collaborative Research Database) and `mimiciii_clinical` (the MIMIC-III Clinical Database). 32 | 33 | You will also find "derived" databases, which include tables derived from the original data using the code in the [eICU](https://github.com/MIT-LCP/eicu-code) and [MIMIC](https://github.com/MIT-LCP/mimic-code) code repositories. These are helpful if you are looking for something like a sepsis cohort or first day vital signs. 34 | 35 | 1. [Open BigQuery](https://console.cloud.google.com/bigquery?project=sccm-datathon). 36 | 2. At the top of the console, select `sccm-datathon` as the project. This indicates the account used for billing. 37 | 3. "Pin" a project to the resources menu to view available datasets. In the Resources menu on the left, click "Add data", "Pin a project", then add the following project names: `physionet-data` and `sccm-datathon`. 38 | 4. You should be able preview the data available on these projects using the graphical interface. 39 | 5. Now try running a query. For example, try counting the number of rows in the demo eICU patient table: 40 | 41 | ```SQL 42 | SELECT count(*) 43 | FROM `physionet-data.eicu_crd_demo.patient` 44 | ``` 45 | 46 | ## 4. Analysing data with Google Colab 47 | 48 | Python is an increasingly popular programming language for analysing data. We will explore the data using Python notebooks, which allow code and text to be combined into executable documents. First, try opening a blank document using the link below: 49 | 50 | - [https://colab.research.google.com/](https://colab.research.google.com/) 51 | 52 | ## 5. Python notebooks that we prepared earlier 53 | 54 | Several tutorials are provided below. Requirements for these notebooks are: (1) you have a Gmail account and (2) your Gmail address has been added to the appropriate Google Group by the workshop hosts. 55 | 56 | Notebook 1 (eICU): Exploring the patient table. Open In Colab 57 | 58 | Notebook 2 (eICU): Severity of illness. Open In Colab 59 | 60 | Notebook 3 (eICU): Summary statistics. Open In Colab 61 | 62 | Notebook 4 (eICU): Timeseries. Open In Colab 63 | 64 | Notebook 5 (eICU): Mortality prediction. Open In Colab 65 | 66 | Notebook 6 (eICU): Acute kidney injury. Open In Colab 67 | 68 | Notebook 7 (eICU): Project work. Open In Colab 69 | 70 | Notebook 8 (MIMIC): Weekend effect on mortality. Open In Colab 71 | 72 | ## 6. An example in R 73 | 74 | If you prefer working in R, then you can connect to Google Cloud from your code in a similar way: 75 | 76 | - https://github.com/MIT-LCP/sccm-datathon/blob/master/mimic-iii-los.rmd 77 | 78 | ## 7. Sample projects 79 | 80 | These papers and repositories may be helpful for reference. They are definitely **not** perfect! Code may be untidy, poorly documented, buggy, outdated etc. Think about how they can be improved, adapted, etc. For example, you could: 81 | 82 | - replicate the study on a different dataset (e.g. MIMIC vs eICU) 83 | - improve the methodology 84 | 85 | 1. The association between mortality among patients admitted to the intensive care unit on a weekend compared to a weekday 86 | 87 | - Python Notebook: https://github.com/MIT-LCP/bhi-bsn-challenge/blob/master/challenge-demo.ipynb 88 | - R Markdown Notebook: https://github.com/MIT-LCP/bhi-bsn-challenge/blob/master/rmarkdown_example_notebook.Rmd 89 | - More reading: https://physionet.org/content/bhi-2018-challenge/1.0/ 90 | 91 | TBC... -------------------------------------------------------------------------------- /mimic-iii-los.rmd: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Length of stay in the ICU" 3 | author: "tom pollard" 4 | description: "Length of stay in the ICU for patients in MIMIC-III" 5 | output: pdf_document 6 | date: "10/10/2017" 7 | --- 8 | 9 | ```{r setup, include = FALSE} 10 | knitr::opts_chunk$set(echo = TRUE) 11 | # install.packages("ggplot2") 12 | # install.packages("bigrquery") 13 | library("ggplot2") 14 | library("bigrquery") 15 | ``` 16 | 17 | 18 | ```{r dbconnect, include=FALSE} 19 | # Load configuration settings 20 | project_id <- "sccm-datathon" 21 | options(httr_oauth_cache=TRUE) 22 | run_query <- function(query){ 23 | data <- query_exec(query, project=project_id, use_legacy_sql = FALSE) 24 | return(data) 25 | } 26 | ``` 27 | 28 | 29 | ```{r load_data, include=FALSE} 30 | sql_query <- "SELECT i.subject_id, i.hadm_id, i.los 31 | FROM `physionet-data.mimiciii_demo.icustays` i;" 32 | data <- run_query(sql_query) 33 | head(data) 34 | ``` 35 | 36 | This document shows how RMarkdown can be used to create a reproducible analysis using MIMIC-III (version 1.4). Let's calculate the median length of stay in the ICU and then include this value in our document. 37 | 38 | ```{r calculate_mean_los, include=FALSE} 39 | avg_los <- median(data$los, na.rm=TRUE) 40 | rounded_avg_los <- round(avg_los, digits = 2) 41 | ``` 42 | 43 | So the median length of stay in the ICU is `r avg_los` days. Rounded to two decimal places, this is `r rounded_avg_los` days. We can plot the distribution of length of stay using the qplot function: 44 | 45 | 46 | ```{r plot_los, echo=FALSE, include=TRUE, warning = FALSE} 47 | qplot(data$los, geom="histogram",xlim=c(0,25), binwidth = 1, 48 | xlab = "Length of stay in the ICU, days.",fill=I("#FF9999"), col=I("white")) 49 | ``` -------------------------------------------------------------------------------- /mimic-weekend-effect.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": { 6 | "colab_type": "text", 7 | "id": "Yi5bCFZBMWkj" 8 | }, 9 | "source": [ 10 | "# Python demo for the 2018 BHI & BSN Data Challenge\n", 11 | "\n", 12 | "This notebook provides a simple introduction to analysing the MIMIC-III database. It was created as a demonstrator for the [2018 BHI & BSN Data Challenge](https://mimic.physionet.org/events/bhibsn-challenge/), which explores the following question:\n", 13 | "\n", 14 | "> Are patients admitted to the intensive care unit (ICU) on a weekend more likely to die in the hospital than those admitted on a weekday?\n", 15 | "\n", 16 | "We have provided an example slide template for final presentations (`slide-template.pptx`) at: https://github.com/MIT-LCP/bhi-bsn-challenge. There is no obligation to use it!\n", 17 | "\n" 18 | ] 19 | }, 20 | { 21 | "cell_type": "markdown", 22 | "metadata": { 23 | "colab_type": "text", 24 | "id": "h9Vof4xQMWkl" 25 | }, 26 | "source": [ 27 | "## Background on MIMIC-III\n", 28 | "\n", 29 | "MIMIC-III (‘Medical Information Mart for Intensive Care’) is a large, single-center database comprising information relating to patients admitted to critical care units at a large tertiary care hospital. \n", 30 | "\n", 31 | "Data includes vital signs, medications, laboratory measurements, observations and notes charted by care providers, fluid balance, procedure codes, diagnostic codes, imaging reports, hospital length of stay, survival data, and more. \n", 32 | "\n", 33 | "For details, see: https://mimic.physionet.org/. The data is downloaded as 26 CSV files, which can then be loaded into a database system. Scripts for loading the data into Postgres are provided in the [MIMIC Code Repository](https://mimic.physionet.org/gettingstarted/dbsetup/). A demo dataset is also available: https://mimic.physionet.org/gettingstarted/demo/\n", 34 | "\n", 35 | "Points to note:\n", 36 | "\n", 37 | "- A patient-level shift has been applied to dates. Day of week is retained. \n", 38 | "- Patients aged >89 years on first admission have been reassigned an age of ~300 years.\n", 39 | "- Patients may have multiple hospital admissions. Each hospital admission may comprise multiple ICU stays (e.g. a patient may visit the ICU, leave for surgery, and then return to the ICU for recovery, all within a single hospital admission).\n", 40 | "\n", 41 | "If you need help getting set up with access to MIMIC-III, please contact `data-challenge@physionet.org`.\n" 42 | ] 43 | }, 44 | { 45 | "cell_type": "markdown", 46 | "metadata": { 47 | "colab_type": "text", 48 | "id": "cLtC2c3QMWkm" 49 | }, 50 | "source": [ 51 | "# Import libraries" 52 | ] 53 | }, 54 | { 55 | "cell_type": "code", 56 | "execution_count": 0, 57 | "metadata": { 58 | "colab": {}, 59 | "colab_type": "code", 60 | "id": "wcJaxoqLMWkn" 61 | }, 62 | "outputs": [], 63 | "source": [ 64 | "# Data processing libraries\n", 65 | "import pandas as pd\n", 66 | "import numpy as np\n", 67 | "import itertools\n", 68 | "\n", 69 | "# Stats libraries\n", 70 | "import statsmodels.api as sm\n", 71 | "import statsmodels.formula.api as smf\n", 72 | "import scipy.stats\n", 73 | "\n", 74 | "# Image libraries\n", 75 | "import matplotlib.pyplot as plt\n", 76 | "\n", 77 | "\n", 78 | "# Make pandas dataframes prettier\n", 79 | "from IPython.display import display, HTML\n", 80 | "\n", 81 | "# Access data using Google BigQuery.\n", 82 | "import os\n", 83 | "from google.colab import auth\n", 84 | "from google.cloud import bigquery" 85 | ] 86 | }, 87 | { 88 | "cell_type": "code", 89 | "execution_count": 49, 90 | "metadata": { 91 | "colab": { 92 | "base_uri": "https://localhost:8080/", 93 | "height": 187 94 | }, 95 | "colab_type": "code", 96 | "id": "GtyznQqKNe4j", 97 | "outputId": "01875e72-77d2-4106-a04c-a439b53cc5dd" 98 | }, 99 | "outputs": [ 100 | { 101 | "name": "stdout", 102 | "output_type": "stream", 103 | "text": [ 104 | "Requirement already satisfied: tableone in /usr/local/lib/python3.6/dist-packages (0.6.6)\n", 105 | "Requirement already satisfied: scipy>=0.18.1 in /usr/local/lib/python3.6/dist-packages (from tableone) (1.4.1)\n", 106 | "Requirement already satisfied: numpy>=1.12.1 in /usr/local/lib/python3.6/dist-packages (from tableone) (1.17.5)\n", 107 | "Requirement already satisfied: statsmodels>=0.8.0 in /usr/local/lib/python3.6/dist-packages (from tableone) (0.10.2)\n", 108 | "Requirement already satisfied: pandas>=0.22.0 in /usr/local/lib/python3.6/dist-packages (from tableone) (0.25.3)\n", 109 | "Requirement already satisfied: tabulate>=0.8.2 in /usr/local/lib/python3.6/dist-packages (from tableone) (0.8.6)\n", 110 | "Requirement already satisfied: patsy>=0.4.0 in /usr/local/lib/python3.6/dist-packages (from statsmodels>=0.8.0->tableone) (0.5.1)\n", 111 | "Requirement already satisfied: pytz>=2017.2 in /usr/local/lib/python3.6/dist-packages (from pandas>=0.22.0->tableone) (2018.9)\n", 112 | "Requirement already satisfied: python-dateutil>=2.6.1 in /usr/local/lib/python3.6/dist-packages (from pandas>=0.22.0->tableone) (2.6.1)\n", 113 | "Requirement already satisfied: six in /usr/local/lib/python3.6/dist-packages (from patsy>=0.4.0->statsmodels>=0.8.0->tableone) (1.12.0)\n" 114 | ] 115 | } 116 | ], 117 | "source": [ 118 | "# install and import tableone\n", 119 | "!pip install tableone\n", 120 | "from tableone import TableOne" 121 | ] 122 | }, 123 | { 124 | "cell_type": "markdown", 125 | "metadata": { 126 | "colab_type": "text", 127 | "id": "qxrVxcLdMWks" 128 | }, 129 | "source": [ 130 | "# Connect to the MIMIC-III database\n", 131 | "\n", 132 | "Before running any queries, you need to first authenticate yourself by running the following cell. If you are running it for the first time, it will ask you to follow a link to log in using your Gmail account, and accept the data access requests to your profile. Once this is done, it will generate a string of verification code, which you should paste back to the cell below and press enter." 133 | ] 134 | }, 135 | { 136 | "cell_type": "code", 137 | "execution_count": 0, 138 | "metadata": { 139 | "colab": {}, 140 | "colab_type": "code", 141 | "id": "4B6TPqBvMWks" 142 | }, 143 | "outputs": [], 144 | "source": [ 145 | "auth.authenticate_user()" 146 | ] 147 | }, 148 | { 149 | "cell_type": "code", 150 | "execution_count": 0, 151 | "metadata": { 152 | "colab": {}, 153 | "colab_type": "code", 154 | "id": "Ps3vy94mMWkx" 155 | }, 156 | "outputs": [], 157 | "source": [ 158 | "# add your project ID for billing\n", 159 | "project_id='sccm-datathon'\n", 160 | "os.environ[\"GOOGLE_CLOUD_PROJECT\"]=project_id" 161 | ] 162 | }, 163 | { 164 | "cell_type": "markdown", 165 | "metadata": { 166 | "colab_type": "text", 167 | "id": "kbS3XgD9MWkz" 168 | }, 169 | "source": [ 170 | "# Extract data from MIMIC-III and assign to a Pandas DataFrame\n", 171 | "\n", 172 | "The following query extracts a simple dataset from the MIMIC-III database, comprising demographics, hospital and ICU admission times, and a severity of illness score ([OASIS](https://www.ncbi.nlm.nih.gov/pubmed/23660729)).\n", 173 | "\n", 174 | "Before running this query, you must first build the `icustay_detail` and `oasis` materialized views. Code for building these views is available in the MIMIC Code Repository:\n", 175 | "- `icustay_detail`: https://github.com/MIT-LCP/mimic-code/tree/master/concepts/demographics\n", 176 | "- `oasis`: https://github.com/MIT-LCP/mimic-code/tree/master/concepts/severityscores\n", 177 | "\n", 178 | "You will notice that our example restricts the analysis to:\n", 179 | "\n", 180 | "- first hospital admissions \n", 181 | "- patients who were `>= 16` years at time of hospital admission.\n", 182 | "- the first ICU stay (patients may move to the ICU multiple times within a hospital stay)" 183 | ] 184 | }, 185 | { 186 | "cell_type": "code", 187 | "execution_count": 0, 188 | "metadata": { 189 | "colab": {}, 190 | "colab_type": "code", 191 | "id": "8zIFQQ8EMWkz" 192 | }, 193 | "outputs": [], 194 | "source": [ 195 | "# Run query and assign the results to a Pandas DataFrame\n", 196 | "# Requires the icustay_detail view from:\n", 197 | "# https://github.com/MIT-LCP/mimic-code/tree/master/concepts/demographics\n", 198 | "# And the OASIS score from:\n", 199 | "# https://github.com/MIT-LCP/mimic-code/tree/master/concepts/severityscores\n", 200 | "%%bigquery data\n", 201 | "\n", 202 | "WITH first_icu AS (\n", 203 | " SELECT i.subject_id, i.hadm_id, i.icustay_id, i.gender, i.admittime admittime_hospital, \n", 204 | " i.dischtime dischtime_hospital, i.los_hospital, i.admission_age, i.admission_type, \n", 205 | " i.hospital_expire_flag, i.intime intime_icu, i.outtime outtime_icu, i.los_icu, \n", 206 | " s.first_careunit\n", 207 | " FROM `physionet-data.mimiciii_derived.icustay_detail` i\n", 208 | " LEFT JOIN `physionet-data.mimiciii_clinical.icustays` s\n", 209 | " ON i.icustay_id = s.icustay_id\n", 210 | " WHERE i.hospstay_seq = 1\n", 211 | " AND i.icustay_seq = 1\n", 212 | " AND i.admission_age >= 16\n", 213 | ")\n", 214 | "SELECT f.*, o.icustay_expire_flag, o.oasis, o.oasis_prob\n", 215 | "FROM first_icu f\n", 216 | "LEFT JOIN `physionet-data.mimiciii_derived.oasis` o\n", 217 | "ON f.icustay_id = o.icustay_id;" 218 | ] 219 | }, 220 | { 221 | "cell_type": "markdown", 222 | "metadata": { 223 | "colab_type": "text", 224 | "id": "Bu442pAsMWk1" 225 | }, 226 | "source": [ 227 | "# Check the extracted data\n", 228 | "\n", 229 | "It is always a good idea to inspect the data after you have extracted it. We will look at the first six patients (rows), and then check the number of rows, and get some summary statistics of the dataset." 230 | ] 231 | }, 232 | { 233 | "cell_type": "code", 234 | "execution_count": 12, 235 | "metadata": { 236 | "colab": { 237 | "base_uri": "https://localhost:8080/", 238 | "height": 102 239 | }, 240 | "colab_type": "code", 241 | "id": "12Aqg89AMWk2", 242 | "outputId": "7cc73d71-6d77-4823-e826-c573dbad351c" 243 | }, 244 | "outputs": [ 245 | { 246 | "data": { 247 | "text/plain": [ 248 | "Index(['subject_id', 'hadm_id', 'icustay_id', 'gender', 'admittime_hospital',\n", 249 | " 'dischtime_hospital', 'los_hospital', 'admission_age', 'admission_type',\n", 250 | " 'hospital_expire_flag', 'intime_icu', 'outtime_icu', 'los_icu',\n", 251 | " 'first_careunit', 'icustay_expire_flag', 'oasis', 'oasis_prob'],\n", 252 | " dtype='object')" 253 | ] 254 | }, 255 | "execution_count": 12, 256 | "metadata": { 257 | "tags": [] 258 | }, 259 | "output_type": "execute_result" 260 | } 261 | ], 262 | "source": [ 263 | "data.columns" 264 | ] 265 | }, 266 | { 267 | "cell_type": "code", 268 | "execution_count": 13, 269 | "metadata": { 270 | "colab": { 271 | "base_uri": "https://localhost:8080/", 272 | "height": 309 273 | }, 274 | "colab_type": "code", 275 | "id": "20zN-HEUMWk4", 276 | "outputId": "e469cb69-cbc3-46af-b93c-fa898c22f97e" 277 | }, 278 | "outputs": [ 279 | { 280 | "data": { 281 | "text/html": [ 282 | "
\n", 283 | "\n", 296 | "
\n", 297 | " \n", 298 | " \n", 299 | " \n", 300 | " \n", 301 | " \n", 302 | " \n", 303 | " \n", 304 | " \n", 305 | " \n", 306 | " \n", 307 | " \n", 308 | " \n", 309 | " \n", 310 | " \n", 311 | " \n", 312 | " \n", 313 | " \n", 314 | " \n", 315 | " \n", 316 | " \n", 317 | " \n", 318 | " \n", 319 | " \n", 320 | " \n", 321 | " \n", 322 | " \n", 323 | " \n", 324 | " \n", 325 | " \n", 326 | " \n", 327 | " \n", 328 | " \n", 329 | " \n", 330 | " \n", 331 | " \n", 332 | " \n", 333 | " \n", 334 | " \n", 335 | " \n", 336 | " \n", 337 | " \n", 338 | " \n", 339 | " \n", 340 | " \n", 341 | " \n", 342 | " \n", 343 | " \n", 344 | " \n", 345 | " \n", 346 | " \n", 347 | " \n", 348 | " \n", 349 | " \n", 350 | " \n", 351 | " \n", 352 | " \n", 353 | " \n", 354 | " \n", 355 | " \n", 356 | " \n", 357 | " \n", 358 | " \n", 359 | " \n", 360 | " \n", 361 | " \n", 362 | " \n", 363 | " \n", 364 | " \n", 365 | " \n", 366 | " \n", 367 | " \n", 368 | " \n", 369 | " \n", 370 | " \n", 371 | " \n", 372 | " \n", 373 | " \n", 374 | " \n", 375 | " \n", 376 | " \n", 377 | " \n", 378 | " \n", 379 | " \n", 380 | " \n", 381 | " \n", 382 | " \n", 383 | " \n", 384 | " \n", 385 | " \n", 386 | " \n", 387 | " \n", 388 | " \n", 389 | " \n", 390 | " \n", 391 | " \n", 392 | " \n", 393 | " \n", 394 | " \n", 395 | " \n", 396 | " \n", 397 | " \n", 398 | " \n", 399 | " \n", 400 | " \n", 401 | " \n", 402 | " \n", 403 | " \n", 404 | " \n", 405 | " \n", 406 | " \n", 407 | " \n", 408 | " \n", 409 | " \n", 410 | " \n", 411 | " \n", 412 | " \n", 413 | " \n", 414 | " \n", 415 | " \n", 416 | " \n", 417 | " \n", 418 | " \n", 419 | " \n", 420 | " \n", 421 | "
subject_idhadm_idicustay_idgenderadmittime_hospitaldischtime_hospitallos_hospitaladmission_ageadmission_typehospital_expire_flagintime_icuouttime_iculos_icufirst_careuniticustay_expire_flagoasisoasis_prob
03145834211552M2101-10-20 19:08:002101-10-31 13:58:001176EMERGENCY02101-10-20 19:10:112101-10-26 20:43:096.0MICU0570.748927
16107064228232F2175-05-30 07:15:002175-06-15 16:00:001666ELECTIVE02175-05-30 21:30:542175-06-03 13:39:544.0SICU0110.008392
238185910248910M2166-08-10 00:28:002166-09-04 11:30:002576EMERGENCY02166-08-10 00:29:362166-09-04 13:39:2325.0CCU0540.670490
356181711275642F2104-01-02 02:01:002104-01-08 10:30:006300EMERGENCY12104-01-02 02:02:392104-01-03 22:25:291.0SICU0520.611922
498188606216929F2137-04-02 08:00:002137-04-09 10:38:00741ELECTIVE02137-04-02 15:15:392137-04-04 21:06:162.0SICU0110.008392
\n", 422 | "" 423 | ], 424 | "text/plain": [ 425 | " subject_id hadm_id icustay_id ... icustay_expire_flag oasis oasis_prob\n", 426 | "0 3 145834 211552 ... 0 57 0.748927\n", 427 | "1 6 107064 228232 ... 0 11 0.008392\n", 428 | "2 38 185910 248910 ... 0 54 0.670490\n", 429 | "3 56 181711 275642 ... 0 52 0.611922\n", 430 | "4 98 188606 216929 ... 0 11 0.008392\n", 431 | "\n", 432 | "[5 rows x 17 columns]" 433 | ] 434 | }, 435 | "execution_count": 13, 436 | "metadata": { 437 | "tags": [] 438 | }, 439 | "output_type": "execute_result" 440 | } 441 | ], 442 | "source": [ 443 | "data.head()" 444 | ] 445 | }, 446 | { 447 | "cell_type": "code", 448 | "execution_count": 14, 449 | "metadata": { 450 | "colab": { 451 | "base_uri": "https://localhost:8080/", 452 | "height": 359 453 | }, 454 | "colab_type": "code", 455 | "id": "4p67h2PJMWk7", 456 | "outputId": "c8ab7ef1-0630-41bd-8ade-b4f79edf8c34" 457 | }, 458 | "outputs": [ 459 | { 460 | "data": { 461 | "text/html": [ 462 | "
\n", 463 | "\n", 476 | "\n", 477 | " \n", 478 | " \n", 479 | " \n", 480 | " \n", 481 | " \n", 482 | " \n", 483 | " \n", 484 | " \n", 485 | " \n", 486 | " \n", 487 | " \n", 488 | " \n", 489 | " \n", 490 | " \n", 491 | " \n", 492 | " \n", 493 | " \n", 494 | " \n", 495 | " \n", 496 | " \n", 497 | " \n", 498 | " \n", 499 | " \n", 500 | " \n", 501 | " \n", 502 | " \n", 503 | " \n", 504 | " \n", 505 | " \n", 506 | " \n", 507 | " \n", 508 | " \n", 509 | " \n", 510 | " \n", 511 | " \n", 512 | " \n", 513 | " \n", 514 | " \n", 515 | " \n", 516 | " \n", 517 | " \n", 518 | " \n", 519 | " \n", 520 | " \n", 521 | " \n", 522 | " \n", 523 | " \n", 524 | " \n", 525 | " \n", 526 | " \n", 527 | " \n", 528 | " \n", 529 | " \n", 530 | " \n", 531 | " \n", 532 | " \n", 533 | " \n", 534 | " \n", 535 | " \n", 536 | " \n", 537 | " \n", 538 | " \n", 539 | " \n", 540 | " \n", 541 | " \n", 542 | " \n", 543 | " \n", 544 | " \n", 545 | " \n", 546 | " \n", 547 | " \n", 548 | " \n", 549 | " \n", 550 | " \n", 551 | " \n", 552 | " \n", 553 | " \n", 554 | " \n", 555 | " \n", 556 | " \n", 557 | " \n", 558 | " \n", 559 | " \n", 560 | " \n", 561 | " \n", 562 | " \n", 563 | " \n", 564 | " \n", 565 | " \n", 566 | " \n", 567 | " \n", 568 | " \n", 569 | " \n", 570 | " \n", 571 | " \n", 572 | " \n", 573 | " \n", 574 | " \n", 575 | " \n", 576 | " \n", 577 | " \n", 578 | " \n", 579 | " \n", 580 | " \n", 581 | " \n", 582 | " \n", 583 | " \n", 584 | " \n", 585 | " \n", 586 | " \n", 587 | " \n", 588 | " \n", 589 | " \n", 590 | " \n", 591 | " \n", 592 | " \n", 593 | " \n", 594 | " \n", 595 | " \n", 596 | " \n", 597 | " \n", 598 | " \n", 599 | " \n", 600 | " \n", 601 | " \n", 602 | "
countmeanstdmin25%50%75%max
subject_id38558.038266.82003729376.4314903.00000013980.25000027912.50000062963.25000099999.000000
hadm_id38558.0150037.14891928944.929045100001.000000124928.500000150092.500000175222.250000199999.000000
icustay_id38558.0250222.15721828913.703899200003.000000225240.250000250278.000000275287.000000299999.000000
los_hospital38558.09.85383110.7052330.0000004.0000007.00000012.000000295.000000
admission_age38558.074.56297055.11517616.00000052.00000066.00000078.000000310.000000
hospital_expire_flag38558.00.1147360.3187080.0000000.0000000.0000000.0000001.000000
los_icu38556.03.9873956.0185590.0000001.0000002.0000004.000000154.000000
icustay_expire_flag38558.00.0828360.2756380.0000000.0000000.0000000.0000001.000000
oasis38558.030.9040158.8107473.00000025.00000030.00000037.00000070.000000
oasis_prob38558.00.1388500.1368950.0030420.0480120.0870980.1889110.939936
\n", 603 | "
" 604 | ], 605 | "text/plain": [ 606 | " count mean ... 75% max\n", 607 | "subject_id 38558.0 38266.820037 ... 62963.250000 99999.000000\n", 608 | "hadm_id 38558.0 150037.148919 ... 175222.250000 199999.000000\n", 609 | "icustay_id 38558.0 250222.157218 ... 275287.000000 299999.000000\n", 610 | "los_hospital 38558.0 9.853831 ... 12.000000 295.000000\n", 611 | "admission_age 38558.0 74.562970 ... 78.000000 310.000000\n", 612 | "hospital_expire_flag 38558.0 0.114736 ... 0.000000 1.000000\n", 613 | "los_icu 38556.0 3.987395 ... 4.000000 154.000000\n", 614 | "icustay_expire_flag 38558.0 0.082836 ... 0.000000 1.000000\n", 615 | "oasis 38558.0 30.904015 ... 37.000000 70.000000\n", 616 | "oasis_prob 38558.0 0.138850 ... 0.188911 0.939936\n", 617 | "\n", 618 | "[10 rows x 8 columns]" 619 | ] 620 | }, 621 | "execution_count": 14, 622 | "metadata": { 623 | "tags": [] 624 | }, 625 | "output_type": "execute_result" 626 | } 627 | ], 628 | "source": [ 629 | "data.describe().T" 630 | ] 631 | }, 632 | { 633 | "cell_type": "markdown", 634 | "metadata": { 635 | "colab_type": "text", 636 | "id": "fwS3Gt-lMWk_" 637 | }, 638 | "source": [ 639 | "# Add day of week to DataFrame\n", 640 | "\n", 641 | "If we are going to examine the weekend effect, we need to pull this out of the dataset, as you can see, all we have above are dates. We will define a weekend, as anytime between Saturday (00:00:00) until Sunday (23:59:59). The dates above are shifted, and that's why they look odd, but they are matched on the day of week, so this aspect is preserved." 642 | ] 643 | }, 644 | { 645 | "cell_type": "code", 646 | "execution_count": 15, 647 | "metadata": { 648 | "colab": { 649 | "base_uri": "https://localhost:8080/", 650 | "height": 309 651 | }, 652 | "colab_type": "code", 653 | "id": "2F1Pmf5EMWlA", 654 | "outputId": "4dbe6b48-527a-446a-8e4e-caa25b6694f0" 655 | }, 656 | "outputs": [ 657 | { 658 | "data": { 659 | "text/html": [ 660 | "
\n", 661 | "\n", 674 | "\n", 675 | " \n", 676 | " \n", 677 | " \n", 678 | " \n", 679 | " \n", 680 | " \n", 681 | " \n", 682 | " \n", 683 | " \n", 684 | " \n", 685 | " \n", 686 | " \n", 687 | " \n", 688 | " \n", 689 | " \n", 690 | " \n", 691 | " \n", 692 | " \n", 693 | " \n", 694 | " \n", 695 | " \n", 696 | " \n", 697 | " \n", 698 | " \n", 699 | " \n", 700 | " \n", 701 | " \n", 702 | " \n", 703 | " \n", 704 | " \n", 705 | " \n", 706 | " \n", 707 | " \n", 708 | " \n", 709 | " \n", 710 | " \n", 711 | " \n", 712 | " \n", 713 | " \n", 714 | " \n", 715 | " \n", 716 | " \n", 717 | " \n", 718 | " \n", 719 | " \n", 720 | " \n", 721 | " \n", 722 | " \n", 723 | " \n", 724 | " \n", 725 | " \n", 726 | " \n", 727 | " \n", 728 | " \n", 729 | " \n", 730 | " \n", 731 | " \n", 732 | " \n", 733 | " \n", 734 | " \n", 735 | " \n", 736 | " \n", 737 | " \n", 738 | " \n", 739 | " \n", 740 | " \n", 741 | " \n", 742 | " \n", 743 | " \n", 744 | " \n", 745 | " \n", 746 | " \n", 747 | " \n", 748 | " \n", 749 | " \n", 750 | " \n", 751 | " \n", 752 | " \n", 753 | " \n", 754 | " \n", 755 | " \n", 756 | " \n", 757 | " \n", 758 | " \n", 759 | " \n", 760 | " \n", 761 | " \n", 762 | " \n", 763 | " \n", 764 | " \n", 765 | " \n", 766 | " \n", 767 | " \n", 768 | " \n", 769 | " \n", 770 | " \n", 771 | " \n", 772 | " \n", 773 | " \n", 774 | " \n", 775 | " \n", 776 | " \n", 777 | " \n", 778 | " \n", 779 | " \n", 780 | " \n", 781 | " \n", 782 | " \n", 783 | " \n", 784 | " \n", 785 | " \n", 786 | " \n", 787 | " \n", 788 | " \n", 789 | " \n", 790 | " \n", 791 | " \n", 792 | " \n", 793 | " \n", 794 | " \n", 795 | " \n", 796 | " \n", 797 | " \n", 798 | " \n", 799 | " \n", 800 | " \n", 801 | " \n", 802 | " \n", 803 | " \n", 804 | " \n", 805 | " \n", 806 | " \n", 807 | " \n", 808 | " \n", 809 | " \n", 810 | " \n", 811 | " \n", 812 | " \n", 813 | " \n", 814 | " \n", 815 | " \n", 816 | " \n", 817 | " \n", 818 | " \n", 819 | " \n", 820 | " \n", 821 | " \n", 822 | " \n", 823 | " \n", 824 | " \n", 825 | " \n", 826 | " \n", 827 | " \n", 828 | " \n", 829 | "
subject_idhadm_idicustay_idgenderadmittime_hospitaldischtime_hospitallos_hospitaladmission_ageadmission_typehospital_expire_flagintime_icuouttime_iculos_icufirst_careuniticustay_expire_flagoasisoasis_probadmitday_hospitaldischday_hospitalinday_icuinday_icu_seqoutday_icu
03145834211552M2101-10-20 19:08:002101-10-31 13:58:001176EMERGENCY02101-10-20 19:10:112101-10-26 20:43:096.0MICU0570.748927ThursdayMondayThursday3Wednesday
16107064228232F2175-05-30 07:15:002175-06-15 16:00:001666ELECTIVE02175-05-30 21:30:542175-06-03 13:39:544.0SICU0110.008392TuesdayThursdayTuesday1Saturday
238185910248910M2166-08-10 00:28:002166-09-04 11:30:002576EMERGENCY02166-08-10 00:29:362166-09-04 13:39:2325.0CCU0540.670490SundayThursdaySunday6Thursday
356181711275642F2104-01-02 02:01:002104-01-08 10:30:006300EMERGENCY12104-01-02 02:02:392104-01-03 22:25:291.0SICU0520.611922WednesdayTuesdayWednesday2Thursday
498188606216929F2137-04-02 08:00:002137-04-09 10:38:00741ELECTIVE02137-04-02 15:15:392137-04-04 21:06:162.0SICU0110.008392TuesdayTuesdayTuesday1Thursday
\n", 830 | "
" 831 | ], 832 | "text/plain": [ 833 | " subject_id hadm_id icustay_id ... inday_icu inday_icu_seq outday_icu\n", 834 | "0 3 145834 211552 ... Thursday 3 Wednesday\n", 835 | "1 6 107064 228232 ... Tuesday 1 Saturday\n", 836 | "2 38 185910 248910 ... Sunday 6 Thursday\n", 837 | "3 56 181711 275642 ... Wednesday 2 Thursday\n", 838 | "4 98 188606 216929 ... Tuesday 1 Thursday\n", 839 | "\n", 840 | "[5 rows x 22 columns]" 841 | ] 842 | }, 843 | "execution_count": 15, 844 | "metadata": { 845 | "tags": [] 846 | }, 847 | "output_type": "execute_result" 848 | } 849 | ], 850 | "source": [ 851 | "data['admitday_hospital'] = data.admittime_hospital.dt.weekday_name\n", 852 | "data['dischday_hospital'] = data.dischtime_hospital.dt.weekday_name\n", 853 | "data['inday_icu'] = data.intime_icu.dt.weekday_name\n", 854 | "data['inday_icu_seq'] = data.intime_icu.dt.weekday\n", 855 | "data['outday_icu'] = data.outtime_icu.dt.weekday_name\n", 856 | "data.head()" 857 | ] 858 | }, 859 | { 860 | "cell_type": "code", 861 | "execution_count": 16, 862 | "metadata": { 863 | "colab": { 864 | "base_uri": "https://localhost:8080/", 865 | "height": 153 866 | }, 867 | "colab_type": "code", 868 | "id": "8qK4ieh6MWlC", 869 | "outputId": "dd2fb58e-43f2-41dc-bf2e-b084ecc7e563" 870 | }, 871 | "outputs": [ 872 | { 873 | "data": { 874 | "text/plain": [ 875 | "Friday 6263\n", 876 | "Tuesday 6141\n", 877 | "Monday 6097\n", 878 | "Wednesday 5985\n", 879 | "Thursday 5877\n", 880 | "Saturday 4235\n", 881 | "Sunday 3960\n", 882 | "Name: inday_icu, dtype: int64" 883 | ] 884 | }, 885 | "execution_count": 16, 886 | "metadata": { 887 | "tags": [] 888 | }, 889 | "output_type": "execute_result" 890 | } 891 | ], 892 | "source": [ 893 | "data['inday_icu'].value_counts()" 894 | ] 895 | }, 896 | { 897 | "cell_type": "code", 898 | "execution_count": 17, 899 | "metadata": { 900 | "colab": { 901 | "base_uri": "https://localhost:8080/", 902 | "height": 68 903 | }, 904 | "colab_type": "code", 905 | "id": "jx2E-tWzMWlE", 906 | "outputId": "254879c9-357a-4633-c1e1-d9fcf9d91412" 907 | }, 908 | "outputs": [ 909 | { 910 | "data": { 911 | "text/plain": [ 912 | "weekday 30363\n", 913 | "weekend 8195\n", 914 | "Name: inday_icu_wkd, dtype: int64" 915 | ] 916 | }, 917 | "execution_count": 17, 918 | "metadata": { 919 | "tags": [] 920 | }, 921 | "output_type": "execute_result" 922 | } 923 | ], 924 | "source": [ 925 | "# create weekday vs weekend column for icu_intime \n", 926 | "data['inday_icu_wkd'] = np.where(data.intime_icu.dt.weekday <= 4, \n", 927 | " 'weekday','weekend')\n", 928 | "data['inday_icu_wkd'].value_counts()" 929 | ] 930 | }, 931 | { 932 | "cell_type": "markdown", 933 | "metadata": { 934 | "colab_type": "text", 935 | "collapsed": true, 936 | "id": "bnvClxjQMWlG" 937 | }, 938 | "source": [ 939 | "# Produce some Summary Statistics by DOW and Weekday vs. Weekend\n", 940 | "\n", 941 | "Next, it's good to look at some basic summaries of the data. We will compute simple averages and percentages/counts for each of the variables we have extracted, and look at it by day of week and weekend." 942 | ] 943 | }, 944 | { 945 | "cell_type": "code", 946 | "execution_count": 18, 947 | "metadata": { 948 | "colab": { 949 | "base_uri": "https://localhost:8080/", 950 | "height": 136 951 | }, 952 | "colab_type": "code", 953 | "id": "SIik2OotMWlH", 954 | "outputId": "01da588b-015c-4510-e3af-31f285bdc901" 955 | }, 956 | "outputs": [ 957 | { 958 | "data": { 959 | "text/plain": [ 960 | "Index(['subject_id', 'hadm_id', 'icustay_id', 'gender', 'admittime_hospital',\n", 961 | " 'dischtime_hospital', 'los_hospital', 'admission_age', 'admission_type',\n", 962 | " 'hospital_expire_flag', 'intime_icu', 'outtime_icu', 'los_icu',\n", 963 | " 'first_careunit', 'icustay_expire_flag', 'oasis', 'oasis_prob',\n", 964 | " 'admitday_hospital', 'dischday_hospital', 'inday_icu', 'inday_icu_seq',\n", 965 | " 'outday_icu', 'inday_icu_wkd'],\n", 966 | " dtype='object')" 967 | ] 968 | }, 969 | "execution_count": 18, 970 | "metadata": { 971 | "tags": [] 972 | }, 973 | "output_type": "execute_result" 974 | } 975 | ], 976 | "source": [ 977 | "data.columns" 978 | ] 979 | }, 980 | { 981 | "cell_type": "code", 982 | "execution_count": 19, 983 | "metadata": { 984 | "colab": { 985 | "base_uri": "https://localhost:8080/", 986 | "height": 762 987 | }, 988 | "colab_type": "code", 989 | "id": "ALKoIYjaMWlJ", 990 | "outputId": "4662f8ca-9688-41e5-cccf-4f3af7327557" 991 | }, 992 | "outputs": [ 993 | { 994 | "data": { 995 | "text/html": [ 996 | "
\n", 997 | "\n", 1010 | "\n", 1011 | " \n", 1012 | " \n", 1013 | " \n", 1014 | " \n", 1015 | " \n", 1016 | " \n", 1017 | " \n", 1018 | " \n", 1019 | " \n", 1020 | " \n", 1021 | " \n", 1022 | " \n", 1023 | " \n", 1024 | " \n", 1025 | " \n", 1026 | " \n", 1027 | " \n", 1028 | " \n", 1029 | " \n", 1030 | " \n", 1031 | " \n", 1032 | " \n", 1033 | " \n", 1034 | " \n", 1035 | " \n", 1036 | " \n", 1037 | " \n", 1038 | " \n", 1039 | " \n", 1040 | " \n", 1041 | " \n", 1042 | " \n", 1043 | " \n", 1044 | " \n", 1045 | " \n", 1046 | " \n", 1047 | " \n", 1048 | " \n", 1049 | " \n", 1050 | " \n", 1051 | " \n", 1052 | " \n", 1053 | " \n", 1054 | " \n", 1055 | " \n", 1056 | " \n", 1057 | " \n", 1058 | " \n", 1059 | " \n", 1060 | " \n", 1061 | " \n", 1062 | " \n", 1063 | " \n", 1064 | " \n", 1065 | " \n", 1066 | " \n", 1067 | " \n", 1068 | " \n", 1069 | " \n", 1070 | " \n", 1071 | " \n", 1072 | " \n", 1073 | " \n", 1074 | " \n", 1075 | " \n", 1076 | " \n", 1077 | " \n", 1078 | " \n", 1079 | " \n", 1080 | " \n", 1081 | " \n", 1082 | " \n", 1083 | " \n", 1084 | " \n", 1085 | " \n", 1086 | " \n", 1087 | " \n", 1088 | " \n", 1089 | " \n", 1090 | " \n", 1091 | " \n", 1092 | " \n", 1093 | " \n", 1094 | " \n", 1095 | " \n", 1096 | " \n", 1097 | " \n", 1098 | " \n", 1099 | " \n", 1100 | " \n", 1101 | " \n", 1102 | " \n", 1103 | " \n", 1104 | " \n", 1105 | " \n", 1106 | " \n", 1107 | " \n", 1108 | " \n", 1109 | " \n", 1110 | " \n", 1111 | " \n", 1112 | " \n", 1113 | " \n", 1114 | " \n", 1115 | " \n", 1116 | " \n", 1117 | " \n", 1118 | " \n", 1119 | " \n", 1120 | " \n", 1121 | " \n", 1122 | " \n", 1123 | " \n", 1124 | " \n", 1125 | " \n", 1126 | " \n", 1127 | " \n", 1128 | " \n", 1129 | " \n", 1130 | " \n", 1131 | " \n", 1132 | " \n", 1133 | " \n", 1134 | " \n", 1135 | " \n", 1136 | " \n", 1137 | " \n", 1138 | " \n", 1139 | " \n", 1140 | " \n", 1141 | " \n", 1142 | " \n", 1143 | " \n", 1144 | " \n", 1145 | " \n", 1146 | " \n", 1147 | " \n", 1148 | " \n", 1149 | " \n", 1150 | " \n", 1151 | " \n", 1152 | " \n", 1153 | " \n", 1154 | " \n", 1155 | " \n", 1156 | " \n", 1157 | " \n", 1158 | " \n", 1159 | " \n", 1160 | " \n", 1161 | " \n", 1162 | " \n", 1163 | " \n", 1164 | " \n", 1165 | " \n", 1166 | " \n", 1167 | " \n", 1168 | " \n", 1169 | " \n", 1170 | " \n", 1171 | " \n", 1172 | " \n", 1173 | " \n", 1174 | " \n", 1175 | " \n", 1176 | " \n", 1177 | " \n", 1178 | " \n", 1179 | " \n", 1180 | " \n", 1181 | " \n", 1182 | " \n", 1183 | " \n", 1184 | " \n", 1185 | " \n", 1186 | " \n", 1187 | " \n", 1188 | " \n", 1189 | " \n", 1190 | " \n", 1191 | " \n", 1192 | " \n", 1193 | " \n", 1194 | " \n", 1195 | " \n", 1196 | " \n", 1197 | " \n", 1198 | " \n", 1199 | " \n", 1200 | " \n", 1201 | " \n", 1202 | " \n", 1203 | " \n", 1204 | " \n", 1205 | " \n", 1206 | " \n", 1207 | " \n", 1208 | " \n", 1209 | " \n", 1210 | " \n", 1211 | " \n", 1212 | " \n", 1213 | " \n", 1214 | " \n", 1215 | " \n", 1216 | " \n", 1217 | " \n", 1218 | " \n", 1219 | " \n", 1220 | " \n", 1221 | " \n", 1222 | " \n", 1223 | " \n", 1224 | " \n", 1225 | " \n", 1226 | " \n", 1227 | " \n", 1228 | " \n", 1229 | " \n", 1230 | " \n", 1231 | " \n", 1232 | " \n", 1233 | " \n", 1234 | " \n", 1235 | " \n", 1236 | " \n", 1237 | " \n", 1238 | " \n", 1239 | " \n", 1240 | " \n", 1241 | " \n", 1242 | " \n", 1243 | " \n", 1244 | " \n", 1245 | " \n", 1246 | " \n", 1247 | " \n", 1248 | " \n", 1249 | " \n", 1250 | " \n", 1251 | " \n", 1252 | " \n", 1253 | " \n", 1254 | " \n", 1255 | " \n", 1256 | " \n", 1257 | " \n", 1258 | " \n", 1259 | " \n", 1260 | " \n", 1261 | " \n", 1262 | " \n", 1263 | " \n", 1264 | " \n", 1265 | " \n", 1266 | " \n", 1267 | " \n", 1268 | " \n", 1269 | " \n", 1270 | " \n", 1271 | " \n", 1272 | " \n", 1273 | " \n", 1274 | " \n", 1275 | " \n", 1276 | " \n", 1277 | " \n", 1278 | " \n", 1279 | " \n", 1280 | " \n", 1281 | " \n", 1282 | " \n", 1283 | " \n", 1284 | " \n", 1285 | " \n", 1286 | "
Grouped by inday_icu
MissingFridayMondaySaturdaySundayThursdayTuesdayWednesday
n6263609742353960587761415985
genderF02662 (42.5)2559 (42.0)1857 (43.8)1736 (43.8)2603 (44.3)2671 (43.5)2636 (44.0)
M3601 (57.5)3538 (58.0)2378 (56.2)2224 (56.2)3274 (55.7)3470 (56.5)3349 (56.0)
los_hospital010.2 (11.6)9.7 (9.9)10.0 (10.9)9.8 (10.7)9.8 (10.9)9.8 (10.6)9.7 (10.2)
admission_age074.6 (53.2)73.1 (51.4)73.9 (58.6)75.3 (60.7)75.5 (55.5)75.5 (55.2)74.2 (53.9)
admission_typeELECTIVE01016 (16.2)1265 (20.7)162 (3.8)101 (2.6)999 (17.0)1292 (21.0)1243 (20.8)
EMERGENCY5118 (81.7)4687 (76.9)3852 (91.0)3681 (93.0)4747 (80.8)4704 (76.6)4600 (76.9)
URGENT129 (2.1)145 (2.4)221 (5.2)178 (4.5)131 (2.2)145 (2.4)142 (2.4)
hospital_expire_flag005576 (89.0)5468 (89.7)3658 (86.4)3388 (85.6)5203 (88.5)5491 (89.4)5350 (89.4)
1687 (11.0)629 (10.3)577 (13.6)572 (14.4)674 (11.5)650 (10.6)635 (10.6)
los_icu24.1 (6.2)3.8 (5.5)4.3 (6.6)4.3 (6.3)3.9 (6.1)3.7 (5.7)4.0 (5.9)
icustay_expire_flag005768 (92.1)5650 (92.7)3811 (90.0)3548 (89.6)5400 (91.9)5673 (92.4)5514 (92.1)
1495 (7.9)447 (7.3)424 (10.0)412 (10.4)477 (8.1)468 (7.6)471 (7.9)
oasis030.9 (8.9)30.9 (8.6)31.3 (9.0)31.8 (8.8)30.8 (8.7)30.7 (8.6)30.3 (9.0)
oasis_prob00.1 (0.1)0.1 (0.1)0.1 (0.1)0.2 (0.1)0.1 (0.1)0.1 (0.1)0.1 (0.1)
first_careunitCCU0838 (13.4)918 (15.1)695 (16.4)621 (15.7)850 (14.5)919 (15.0)851 (14.2)
CSRU1416 (22.6)1632 (26.8)237 (5.6)194 (4.9)1282 (21.8)1575 (25.6)1268 (21.2)
MICU2139 (34.2)1940 (31.8)1765 (41.7)1706 (43.1)2020 (34.4)2019 (32.9)2020 (33.8)
SICU1044 (16.7)865 (14.2)743 (17.5)743 (18.8)996 (16.9)933 (15.2)1038 (17.3)
TSICU826 (13.2)742 (12.2)795 (18.8)696 (17.6)729 (12.4)695 (11.3)808 (13.5)
inday_icu_wkdweekday06263 (100.0)6097 (100.0)5877 (100.0)6141 (100.0)5985 (100.0)
weekend4235 (100.0)3960 (100.0)
\n", 1287 | "
" 1288 | ], 1289 | "text/plain": [ 1290 | " Grouped by inday_icu ... \n", 1291 | " Missing ... Wednesday\n", 1292 | "n ... 5985\n", 1293 | "gender F 0 ... 2636 (44.0)\n", 1294 | " M ... 3349 (56.0)\n", 1295 | "los_hospital 0 ... 9.7 (10.2)\n", 1296 | "admission_age 0 ... 74.2 (53.9)\n", 1297 | "admission_type ELECTIVE 0 ... 1243 (20.8)\n", 1298 | " EMERGENCY ... 4600 (76.9)\n", 1299 | " URGENT ... 142 (2.4)\n", 1300 | "hospital_expire_flag 0 0 ... 5350 (89.4)\n", 1301 | " 1 ... 635 (10.6)\n", 1302 | "los_icu 2 ... 4.0 (5.9)\n", 1303 | "icustay_expire_flag 0 0 ... 5514 (92.1)\n", 1304 | " 1 ... 471 (7.9)\n", 1305 | "oasis 0 ... 30.3 (9.0)\n", 1306 | "oasis_prob 0 ... 0.1 (0.1)\n", 1307 | "first_careunit CCU 0 ... 851 (14.2)\n", 1308 | " CSRU ... 1268 (21.2)\n", 1309 | " MICU ... 2020 (33.8)\n", 1310 | " SICU ... 1038 (17.3)\n", 1311 | " TSICU ... 808 (13.5)\n", 1312 | "inday_icu_wkd weekday 0 ... 5985 (100.0)\n", 1313 | " weekend ... \n", 1314 | "\n", 1315 | "[22 rows x 8 columns]" 1316 | ] 1317 | }, 1318 | "execution_count": 19, 1319 | "metadata": { 1320 | "tags": [] 1321 | }, 1322 | "output_type": "execute_result" 1323 | } 1324 | ], 1325 | "source": [ 1326 | "columns = ['gender', 'los_hospital', 'admission_age', 'admission_type', 'hospital_expire_flag', \n", 1327 | " 'los_icu','icustay_expire_flag', 'oasis', 'oasis_prob', 'first_careunit',\n", 1328 | " 'inday_icu_wkd']\n", 1329 | "\n", 1330 | "groupby = 'inday_icu'\n", 1331 | "\n", 1332 | "pval = False\n", 1333 | "\n", 1334 | "categorical = ['gender','admission_type','hospital_expire_flag','icustay_expire_flag',\n", 1335 | " 'first_careunit','inday_icu_wkd']\n", 1336 | "\n", 1337 | "t = TableOne(data, columns=columns, categorical=categorical, groupby=groupby, pval=pval)\n", 1338 | "t.tableone" 1339 | ] 1340 | }, 1341 | { 1342 | "cell_type": "code", 1343 | "execution_count": 20, 1344 | "metadata": { 1345 | "colab": { 1346 | "base_uri": "https://localhost:8080/", 1347 | "height": 700 1348 | }, 1349 | "colab_type": "code", 1350 | "id": "aYoHIgdQMWlL", 1351 | "outputId": "384afb73-07a4-4ab9-a66c-b95a027348b7" 1352 | }, 1353 | "outputs": [ 1354 | { 1355 | "data": { 1356 | "text/html": [ 1357 | "
\n", 1358 | "\n", 1371 | "\n", 1372 | " \n", 1373 | " \n", 1374 | " \n", 1375 | " \n", 1376 | " \n", 1377 | " \n", 1378 | " \n", 1379 | " \n", 1380 | " \n", 1381 | " \n", 1382 | " \n", 1383 | " \n", 1384 | " \n", 1385 | " \n", 1386 | " \n", 1387 | " \n", 1388 | " \n", 1389 | " \n", 1390 | " \n", 1391 | " \n", 1392 | " \n", 1393 | " \n", 1394 | " \n", 1395 | " \n", 1396 | " \n", 1397 | " \n", 1398 | " \n", 1399 | " \n", 1400 | " \n", 1401 | " \n", 1402 | " \n", 1403 | " \n", 1404 | " \n", 1405 | " \n", 1406 | " \n", 1407 | " \n", 1408 | " \n", 1409 | " \n", 1410 | " \n", 1411 | " \n", 1412 | " \n", 1413 | " \n", 1414 | " \n", 1415 | " \n", 1416 | " \n", 1417 | " \n", 1418 | " \n", 1419 | " \n", 1420 | " \n", 1421 | " \n", 1422 | " \n", 1423 | " \n", 1424 | " \n", 1425 | " \n", 1426 | " \n", 1427 | " \n", 1428 | " \n", 1429 | " \n", 1430 | " \n", 1431 | " \n", 1432 | " \n", 1433 | " \n", 1434 | " \n", 1435 | " \n", 1436 | " \n", 1437 | " \n", 1438 | " \n", 1439 | " \n", 1440 | " \n", 1441 | " \n", 1442 | " \n", 1443 | " \n", 1444 | " \n", 1445 | " \n", 1446 | " \n", 1447 | " \n", 1448 | " \n", 1449 | " \n", 1450 | " \n", 1451 | " \n", 1452 | " \n", 1453 | " \n", 1454 | " \n", 1455 | " \n", 1456 | " \n", 1457 | " \n", 1458 | " \n", 1459 | " \n", 1460 | " \n", 1461 | " \n", 1462 | " \n", 1463 | " \n", 1464 | " \n", 1465 | " \n", 1466 | " \n", 1467 | " \n", 1468 | " \n", 1469 | " \n", 1470 | " \n", 1471 | " \n", 1472 | " \n", 1473 | " \n", 1474 | " \n", 1475 | " \n", 1476 | " \n", 1477 | " \n", 1478 | " \n", 1479 | " \n", 1480 | " \n", 1481 | " \n", 1482 | " \n", 1483 | " \n", 1484 | " \n", 1485 | " \n", 1486 | " \n", 1487 | " \n", 1488 | " \n", 1489 | " \n", 1490 | " \n", 1491 | " \n", 1492 | " \n", 1493 | " \n", 1494 | " \n", 1495 | " \n", 1496 | " \n", 1497 | " \n", 1498 | " \n", 1499 | " \n", 1500 | " \n", 1501 | " \n", 1502 | " \n", 1503 | " \n", 1504 | " \n", 1505 | " \n", 1506 | " \n", 1507 | " \n", 1508 | " \n", 1509 | " \n", 1510 | " \n", 1511 | " \n", 1512 | " \n", 1513 | " \n", 1514 | " \n", 1515 | " \n", 1516 | " \n", 1517 | " \n", 1518 | " \n", 1519 | "
Grouped by inday_icu_wkd
Missingweekdayweekend
n303638195
genderF013131 (43.2)3593 (43.8)
M17232 (56.8)4602 (56.2)
los_hospital09.9 (10.7)9.9 (10.8)
admission_age074.6 (53.8)74.6 (59.6)
admission_typeELECTIVE05815 (19.2)263 (3.2)
EMERGENCY23856 (78.6)7533 (91.9)
URGENT692 (2.3)399 (4.9)
hospital_expire_flag0027088 (89.2)7046 (86.0)
13275 (10.8)1149 (14.0)
los_icu23.9 (5.9)4.3 (6.4)
icustay_expire_flag0028005 (92.2)7359 (89.8)
12358 (7.8)836 (10.2)
oasis030.7 (8.8)31.5 (8.9)
oasis_prob00.1 (0.1)0.1 (0.1)
first_careunitCCU04376 (14.4)1316 (16.1)
CSRU7173 (23.6)431 (5.3)
MICU10138 (33.4)3471 (42.4)
SICU4876 (16.1)1486 (18.1)
TSICU3800 (12.5)1491 (18.2)
\n", 1520 | "
" 1521 | ], 1522 | "text/plain": [ 1523 | " Grouped by inday_icu_wkd ... \n", 1524 | " Missing ... weekend\n", 1525 | "n ... 8195\n", 1526 | "gender F 0 ... 3593 (43.8)\n", 1527 | " M ... 4602 (56.2)\n", 1528 | "los_hospital 0 ... 9.9 (10.8)\n", 1529 | "admission_age 0 ... 74.6 (59.6)\n", 1530 | "admission_type ELECTIVE 0 ... 263 (3.2)\n", 1531 | " EMERGENCY ... 7533 (91.9)\n", 1532 | " URGENT ... 399 (4.9)\n", 1533 | "hospital_expire_flag 0 0 ... 7046 (86.0)\n", 1534 | " 1 ... 1149 (14.0)\n", 1535 | "los_icu 2 ... 4.3 (6.4)\n", 1536 | "icustay_expire_flag 0 0 ... 7359 (89.8)\n", 1537 | " 1 ... 836 (10.2)\n", 1538 | "oasis 0 ... 31.5 (8.9)\n", 1539 | "oasis_prob 0 ... 0.1 (0.1)\n", 1540 | "first_careunit CCU 0 ... 1316 (16.1)\n", 1541 | " CSRU ... 431 (5.3)\n", 1542 | " MICU ... 3471 (42.4)\n", 1543 | " SICU ... 1486 (18.1)\n", 1544 | " TSICU ... 1491 (18.2)\n", 1545 | "\n", 1546 | "[20 rows x 3 columns]" 1547 | ] 1548 | }, 1549 | "execution_count": 20, 1550 | "metadata": { 1551 | "tags": [] 1552 | }, 1553 | "output_type": "execute_result" 1554 | } 1555 | ], 1556 | "source": [ 1557 | "columns = ['gender', 'los_hospital', 'admission_age', 'admission_type', 'hospital_expire_flag', \n", 1558 | " 'los_icu','icustay_expire_flag', 'oasis', 'oasis_prob', 'first_careunit']\n", 1559 | "\n", 1560 | "groupby = 'inday_icu_wkd'\n", 1561 | "\n", 1562 | "pval = False\n", 1563 | "\n", 1564 | "categorical = ['gender','admission_type','hospital_expire_flag','icustay_expire_flag',\n", 1565 | " 'first_careunit']\n", 1566 | "\n", 1567 | "t = TableOne(data, columns=columns, categorical=categorical, groupby=groupby, pval=pval)\n", 1568 | "t.tableone" 1569 | ] 1570 | }, 1571 | { 1572 | "cell_type": "markdown", 1573 | "metadata": { 1574 | "colab_type": "text", 1575 | "id": "3CF_ROxeMWlN" 1576 | }, 1577 | "source": [ 1578 | "It looks like there's a higher rate of hospital mortality (14.0% vs 10.8%) and ICU mortality (10.2% vs 7.8%) on weekends when compared to weekdays. There are also statistically significant differences between several other important variables, including: admission type, disease severity (OASIS), and the patient's first care unit, suggesting that these groups may be fundamentally different in some way. Let's explore this a little further." 1579 | ] 1580 | }, 1581 | { 1582 | "cell_type": "markdown", 1583 | "metadata": { 1584 | "colab_type": "text", 1585 | "id": "VxCQFro3MWlO" 1586 | }, 1587 | "source": [ 1588 | "# Plot the data\n" 1589 | ] 1590 | }, 1591 | { 1592 | "cell_type": "code", 1593 | "execution_count": 21, 1594 | "metadata": { 1595 | "colab": { 1596 | "base_uri": "https://localhost:8080/", 1597 | "height": 297 1598 | }, 1599 | "colab_type": "code", 1600 | "id": "Ouamegr7MWlP", 1601 | "outputId": "044fac04-a13e-4ffd-a0ec-14c73ea57dbc" 1602 | }, 1603 | "outputs": [ 1604 | { 1605 | "data": { 1606 | "text/html": [ 1607 | "
\n", 1608 | "\n", 1621 | "\n", 1622 | " \n", 1623 | " \n", 1624 | " \n", 1625 | " \n", 1626 | " \n", 1627 | " \n", 1628 | " \n", 1629 | " \n", 1630 | " \n", 1631 | " \n", 1632 | " \n", 1633 | " \n", 1634 | " \n", 1635 | " \n", 1636 | " \n", 1637 | " \n", 1638 | " \n", 1639 | " \n", 1640 | " \n", 1641 | " \n", 1642 | " \n", 1643 | " \n", 1644 | " \n", 1645 | " \n", 1646 | " \n", 1647 | " \n", 1648 | " \n", 1649 | " \n", 1650 | " \n", 1651 | " \n", 1652 | " \n", 1653 | " \n", 1654 | " \n", 1655 | " \n", 1656 | " \n", 1657 | " \n", 1658 | " \n", 1659 | " \n", 1660 | " \n", 1661 | " \n", 1662 | " \n", 1663 | " \n", 1664 | " \n", 1665 | " \n", 1666 | " \n", 1667 | " \n", 1668 | " \n", 1669 | " \n", 1670 | " \n", 1671 | " \n", 1672 | " \n", 1673 | " \n", 1674 | " \n", 1675 | " \n", 1676 | " \n", 1677 | " \n", 1678 | " \n", 1679 | " \n", 1680 | "
admission_typeELECTIVEEMERGENCYURGENT
inday_icu_seq
00.0205530.1243870.137931
10.0193500.1303150.082759
20.0265490.1273910.112676
30.0270270.1331370.114504
40.0265750.1266120.093023
50.0802470.1370720.162896
60.0891090.1469710.123596
\n", 1681 | "
" 1682 | ], 1683 | "text/plain": [ 1684 | "admission_type ELECTIVE EMERGENCY URGENT\n", 1685 | "inday_icu_seq \n", 1686 | "0 0.020553 0.124387 0.137931\n", 1687 | "1 0.019350 0.130315 0.082759\n", 1688 | "2 0.026549 0.127391 0.112676\n", 1689 | "3 0.027027 0.133137 0.114504\n", 1690 | "4 0.026575 0.126612 0.093023\n", 1691 | "5 0.080247 0.137072 0.162896\n", 1692 | "6 0.089109 0.146971 0.123596" 1693 | ] 1694 | }, 1695 | "execution_count": 21, 1696 | "metadata": { 1697 | "tags": [] 1698 | }, 1699 | "output_type": "execute_result" 1700 | } 1701 | ], 1702 | "source": [ 1703 | "# Pivot data to summarise by day\n", 1704 | "dat_dow = data.groupby(['admission_type',\n", 1705 | " 'inday_icu_seq'])['hospital_expire_flag'].mean().reset_index()\n", 1706 | "\n", 1707 | "dat_dow = dat_dow.pivot(index='inday_icu_seq', \n", 1708 | " columns='admission_type', values='hospital_expire_flag')\n", 1709 | "\n", 1710 | "dat_dow" 1711 | ] 1712 | }, 1713 | { 1714 | "cell_type": "code", 1715 | "execution_count": 39, 1716 | "metadata": { 1717 | "colab": { 1718 | "base_uri": "https://localhost:8080/", 1719 | "height": 297 1720 | }, 1721 | "colab_type": "code", 1722 | "id": "woeoHXJ3MWlR", 1723 | "outputId": "eb553a96-b901-4af2-f997-071931b9105a" 1724 | }, 1725 | "outputs": [ 1726 | { 1727 | "data": { 1728 | "text/plain": [ 1729 | "Text(0, 0.5, 'Hospital mortality rate')" 1730 | ] 1731 | }, 1732 | "execution_count": 39, 1733 | "metadata": { 1734 | "tags": [] 1735 | }, 1736 | "output_type": "execute_result" 1737 | }, 1738 | { 1739 | "data": { 1740 | "image/png": "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\nWv8PL+fifEWYbacAAAAASUVORK5CYII=\n", 1741 | "text/plain": [ 1742 | "
" 1743 | ] 1744 | }, 1745 | "metadata": { 1746 | "tags": [] 1747 | }, 1748 | "output_type": "display_data" 1749 | } 1750 | ], 1751 | "source": [ 1752 | "# day_map = {0:'Mon', 1:'Tue', 2:'Wed', 3:'Thu', 4:'Fri', 5:'Sat', 6:'Sun'}\n", 1753 | "ax = dat_dow.plot()\n", 1754 | "ax.set_ylabel(\"Hospital mortality rate\")" 1755 | ] 1756 | }, 1757 | { 1758 | "cell_type": "code", 1759 | "execution_count": 23, 1760 | "metadata": { 1761 | "colab": { 1762 | "base_uri": "https://localhost:8080/", 1763 | "height": 142 1764 | }, 1765 | "colab_type": "code", 1766 | "id": "YWARmoRoMWlT", 1767 | "outputId": "10bd0a9e-1d1b-4d15-b902-c3baf7ffc35a" 1768 | }, 1769 | "outputs": [ 1770 | { 1771 | "data": { 1772 | "text/html": [ 1773 | "
\n", 1774 | "\n", 1787 | "\n", 1788 | " \n", 1789 | " \n", 1790 | " \n", 1791 | " \n", 1792 | " \n", 1793 | " \n", 1794 | " \n", 1795 | " \n", 1796 | " \n", 1797 | " \n", 1798 | " \n", 1799 | " \n", 1800 | " \n", 1801 | " \n", 1802 | " \n", 1803 | " \n", 1804 | " \n", 1805 | " \n", 1806 | " \n", 1807 | " \n", 1808 | " \n", 1809 | " \n", 1810 | " \n", 1811 | " \n", 1812 | " \n", 1813 | " \n", 1814 | " \n", 1815 | " \n", 1816 | "
admission_typeELECTIVEEMERGENCYURGENT
inday_icu_wkd
weekday0.0237320.1283530.108382
weekend0.0836500.1419090.145363
\n", 1817 | "
" 1818 | ], 1819 | "text/plain": [ 1820 | "admission_type ELECTIVE EMERGENCY URGENT\n", 1821 | "inday_icu_wkd \n", 1822 | "weekday 0.023732 0.128353 0.108382\n", 1823 | "weekend 0.083650 0.141909 0.145363" 1824 | ] 1825 | }, 1826 | "execution_count": 23, 1827 | "metadata": { 1828 | "tags": [] 1829 | }, 1830 | "output_type": "execute_result" 1831 | } 1832 | ], 1833 | "source": [ 1834 | "dat_wkd = data.groupby(['admission_type','inday_icu_wkd'])['hospital_expire_flag'].mean().reset_index()\n", 1835 | "dat_wkd = dat_wkd.pivot(index='inday_icu_wkd', columns='admission_type', values='hospital_expire_flag')\n", 1836 | "dat_wkd.head()" 1837 | ] 1838 | }, 1839 | { 1840 | "cell_type": "code", 1841 | "execution_count": 41, 1842 | "metadata": { 1843 | "colab": { 1844 | "base_uri": "https://localhost:8080/", 1845 | "height": 297 1846 | }, 1847 | "colab_type": "code", 1848 | "id": "Vd8xKa_qMWlV", 1849 | "outputId": "4934c6db-6689-4c55-8dde-d00305c12443" 1850 | }, 1851 | "outputs": [ 1852 | { 1853 | "data": { 1854 | "text/plain": [ 1855 | "Text(0, 0.5, 'Hospital mortality rate')" 1856 | ] 1857 | }, 1858 | "execution_count": 41, 1859 | "metadata": { 1860 | "tags": [] 1861 | }, 1862 | "output_type": "execute_result" 1863 | }, 1864 | { 1865 | "data": { 1866 | "image/png": "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\n", 1867 | "text/plain": [ 1868 | "
" 1869 | ] 1870 | }, 1871 | "metadata": { 1872 | "tags": [] 1873 | }, 1874 | "output_type": "display_data" 1875 | } 1876 | ], 1877 | "source": [ 1878 | "ax = dat_wkd.plot()\n", 1879 | "ax.set_ylabel(\"Hospital mortality rate\")" 1880 | ] 1881 | }, 1882 | { 1883 | "cell_type": "markdown", 1884 | "metadata": { 1885 | "colab_type": "text", 1886 | "id": "otYP7AWBMWlX" 1887 | }, 1888 | "source": [ 1889 | "# Model building\n", 1890 | "\n", 1891 | "Let's try to incorporate what we saw above into a very simple model. We will use logistic regression with hospital mortality as our outcome. First an unadjusted estimate, and then we will try to adjust for admission type.\n", 1892 | "\n", 1893 | "The unadjusted analysis should mirror pretty closely what we saw in the one of the tables above. The odds ratio corresponding with 14.0% and 10.8% mortality in the the weekend and weekday groups, respectively, is about 1.35. Performing logistic regression on the same data:" 1894 | ] 1895 | }, 1896 | { 1897 | "cell_type": "code", 1898 | "execution_count": 42, 1899 | "metadata": { 1900 | "colab": { 1901 | "base_uri": "https://localhost:8080/", 1902 | "height": 252 1903 | }, 1904 | "colab_type": "code", 1905 | "id": "UoUx0qm3MWlb", 1906 | "outputId": "6ecdeb0e-fcee-421f-b540-d69360be3f37" 1907 | }, 1908 | "outputs": [ 1909 | { 1910 | "data": { 1911 | "text/html": [ 1912 | "\n", 1913 | "\n", 1914 | " \n", 1915 | "\n", 1916 | "\n", 1917 | " \n", 1918 | "\n", 1919 | "\n", 1920 | " \n", 1921 | "\n", 1922 | "\n", 1923 | " \n", 1924 | "\n", 1925 | "\n", 1926 | " \n", 1927 | "\n", 1928 | "\n", 1929 | " \n", 1930 | "\n", 1931 | "\n", 1932 | " \n", 1933 | "\n", 1934 | "\n", 1935 | " \n", 1936 | "\n", 1937 | "
Model: GLM AIC: 27417.0809
Link Function: logit BIC: -379735.1515
Dependent Variable: hospital_expire_flag Log-Likelihood: -13707.
Date: 2020-01-17 20:53 LL-Null: -13738.
No. Observations: 38558 Deviance: 27413.
Df Model: 1 Pearson chi2: 3.86e+04
Df Residuals: 38556 Scale: 1.0000
Method: IRLS
\n", 1938 | "\n", 1939 | "\n", 1940 | " \n", 1941 | "\n", 1942 | "\n", 1943 | " \n", 1944 | "\n", 1945 | "\n", 1946 | " \n", 1947 | "\n", 1948 | "
Coef. Std.Err. z P>|z| [0.025 0.975]
Intercept -2.1128 0.0185 -114.2022 0.0000 -2.1490 -2.0765
C(inday_icu_wkd)[T.weekend] 0.2992 0.0368 8.1298 0.0000 0.2271 0.3713
" 1949 | ], 1950 | "text/plain": [ 1951 | "\n", 1952 | "\"\"\"\n", 1953 | " Results: Generalized linear model\n", 1954 | "=============================================================================\n", 1955 | "Model: GLM AIC: 27417.0809 \n", 1956 | "Link Function: logit BIC: -379735.1515\n", 1957 | "Dependent Variable: hospital_expire_flag Log-Likelihood: -13707. \n", 1958 | "Date: 2020-01-17 20:53 LL-Null: -13738. \n", 1959 | "No. Observations: 38558 Deviance: 27413. \n", 1960 | "Df Model: 1 Pearson chi2: 3.86e+04 \n", 1961 | "Df Residuals: 38556 Scale: 1.0000 \n", 1962 | "Method: IRLS \n", 1963 | "-----------------------------------------------------------------------------\n", 1964 | " Coef. Std.Err. z P>|z| [0.025 0.975]\n", 1965 | "-----------------------------------------------------------------------------\n", 1966 | "Intercept -2.1128 0.0185 -114.2022 0.0000 -2.1490 -2.0765\n", 1967 | "C(inday_icu_wkd)[T.weekend] 0.2992 0.0368 8.1298 0.0000 0.2271 0.3713\n", 1968 | "=============================================================================\n", 1969 | "\n", 1970 | "\"\"\"" 1971 | ] 1972 | }, 1973 | "execution_count": 42, 1974 | "metadata": { 1975 | "tags": [] 1976 | }, 1977 | "output_type": "execute_result" 1978 | } 1979 | ], 1980 | "source": [ 1981 | "# R style syntax\n", 1982 | "simple_glm = smf.glm('hospital_expire_flag ~ C(inday_icu_wkd)', \n", 1983 | " data=data, family=sm.families.Binomial()).fit()\n", 1984 | "simple_glm.summary2()\n", 1985 | "\n", 1986 | "# Alternative syntax\n", 1987 | "# y = data.hospital_expire_flag\n", 1988 | "# X = sm.tools.add_constant(data.inday_icu_wkd.factorize()[0])\n", 1989 | "# simple_glm = sm.GLM(y, X, family=sm.families.Binomial()).fit()\n", 1990 | "# simple_glm.summary2()" 1991 | ] 1992 | }, 1993 | { 1994 | "cell_type": "markdown", 1995 | "metadata": { 1996 | "colab_type": "text", 1997 | "id": "5NcJqsAMMWle" 1998 | }, 1999 | "source": [ 2000 | "...yields the same results. The coefficient shown above for weekend is on the log scale, so when we exponentiate it, we get the odds-ratio: `exp(0.2992) = 1.35`. So, looking at these crude rates and odds ratios, we can see that patients admitted on a weekend have about a 35% increase in the odds of dying in the hospital when compared to those on a weekday. This effect is statistically significant (p<0.001). \n", 2001 | "\n", 2002 | "Are we done?\n", 2003 | "\n", 2004 | "I hope not. We saw from the tables and figures above, there is likely some confounding and maybe even effect modification happening. Next let''s look at admission type and weekend ICU admission in the same model. There are two such models we could consider. \n", 2005 | "\n", 2006 | "The first adjusts for admission type, but assumes that the effect of weekend admission is the same regardless if the patient is of any of the admission types. The second one adjusts for admission type, but then allows the effect of weekend ICU admission to vary across the different levels of admission type. \n", 2007 | "\n", 2008 | "The first type of model would be able to account for confounding (when a nuisance variable is associated with both the outcome and the exposure/variable of interest), while the second permits what is called effect modification or a statistical interaction. \n", 2009 | "\n", 2010 | "Interactions are sometimes difficult to understand, but if ignored, can lead to incorrect conclusions about the effect of one or more of the variables. In this example, we fit both models, output estimates of the log-odds ratios, and perform a hypothesis test which evaluates the statistical significance of dropping one of the variables. Below is the resulting output:" 2011 | ] 2012 | }, 2013 | { 2014 | "cell_type": "code", 2015 | "execution_count": 43, 2016 | "metadata": { 2017 | "colab": { 2018 | "base_uri": "https://localhost:8080/", 2019 | "height": 294 2020 | }, 2021 | "colab_type": "code", 2022 | "id": "mhHdvAN2MWlf", 2023 | "outputId": "a0016b22-f1c9-41da-ced4-b524e1fe266e" 2024 | }, 2025 | "outputs": [ 2026 | { 2027 | "data": { 2028 | "text/html": [ 2029 | "\n", 2030 | "\n", 2031 | " \n", 2032 | "\n", 2033 | "\n", 2034 | " \n", 2035 | "\n", 2036 | "\n", 2037 | " \n", 2038 | "\n", 2039 | "\n", 2040 | " \n", 2041 | "\n", 2042 | "\n", 2043 | " \n", 2044 | "\n", 2045 | "\n", 2046 | " \n", 2047 | "\n", 2048 | "\n", 2049 | " \n", 2050 | "\n", 2051 | "\n", 2052 | " \n", 2053 | "\n", 2054 | "
Model: GLM AIC: 26729.2870
Link Function: logit BIC: -380405.8255
Dependent Variable: hospital_expire_flag Log-Likelihood: -13361.
Date: 2020-01-17 20:53 LL-Null: -13738.
No. Observations: 38558 Deviance: 26721.
Df Model: 3 Pearson chi2: 3.85e+04
Df Residuals: 38554 Scale: 1.0000
Method: IRLS
\n", 2055 | "\n", 2056 | "\n", 2057 | " \n", 2058 | "\n", 2059 | "\n", 2060 | " \n", 2061 | "\n", 2062 | "\n", 2063 | " \n", 2064 | "\n", 2065 | "\n", 2066 | " \n", 2067 | "\n", 2068 | "\n", 2069 | " \n", 2070 | "\n", 2071 | "
Coef. Std.Err. z P>|z| [0.025 0.975]
Intercept -3.6173 0.0801 -45.1365 0.0000 -3.7743 -3.4602
C(inday_icu_wkd)[T.weekend] 0.1445 0.0372 3.8883 0.0001 0.0716 0.2173
C(admission_type)[T.EMERGENCY] 1.6943 0.0822 20.6089 0.0000 1.5332 1.8555
C(admission_type)[T.URGENT] 1.5881 0.1231 12.9032 0.0000 1.3469 1.8293
" 2072 | ], 2073 | "text/plain": [ 2074 | "\n", 2075 | "\"\"\"\n", 2076 | " Results: Generalized linear model\n", 2077 | "===============================================================================\n", 2078 | "Model: GLM AIC: 26729.2870 \n", 2079 | "Link Function: logit BIC: -380405.8255\n", 2080 | "Dependent Variable: hospital_expire_flag Log-Likelihood: -13361. \n", 2081 | "Date: 2020-01-17 20:53 LL-Null: -13738. \n", 2082 | "No. Observations: 38558 Deviance: 26721. \n", 2083 | "Df Model: 3 Pearson chi2: 3.85e+04 \n", 2084 | "Df Residuals: 38554 Scale: 1.0000 \n", 2085 | "Method: IRLS \n", 2086 | "-------------------------------------------------------------------------------\n", 2087 | " Coef. Std.Err. z P>|z| [0.025 0.975]\n", 2088 | "-------------------------------------------------------------------------------\n", 2089 | "Intercept -3.6173 0.0801 -45.1365 0.0000 -3.7743 -3.4602\n", 2090 | "C(inday_icu_wkd)[T.weekend] 0.1445 0.0372 3.8883 0.0001 0.0716 0.2173\n", 2091 | "C(admission_type)[T.EMERGENCY] 1.6943 0.0822 20.6089 0.0000 1.5332 1.8555\n", 2092 | "C(admission_type)[T.URGENT] 1.5881 0.1231 12.9032 0.0000 1.3469 1.8293\n", 2093 | "===============================================================================\n", 2094 | "\n", 2095 | "\"\"\"" 2096 | ] 2097 | }, 2098 | "execution_count": 43, 2099 | "metadata": { 2100 | "tags": [] 2101 | }, 2102 | "output_type": "execute_result" 2103 | } 2104 | ], 2105 | "source": [ 2106 | "# Without effect modification\n", 2107 | "adj_glm = smf.glm('hospital_expire_flag ~ C(inday_icu_wkd) + C(admission_type)', \n", 2108 | " data=data, family=sm.families.Binomial()).fit()\n", 2109 | "adj_glm.summary2()\n", 2110 | "# drop1(adj.glm,test=\"Chisq\")" 2111 | ] 2112 | }, 2113 | { 2114 | "cell_type": "code", 2115 | "execution_count": 44, 2116 | "metadata": { 2117 | "colab": { 2118 | "base_uri": "https://localhost:8080/", 2119 | "height": 336 2120 | }, 2121 | "colab_type": "code", 2122 | "id": "FC4bS99HMWlh", 2123 | "outputId": "605a7d66-8389-4f98-cffa-2e0319f74bde" 2124 | }, 2125 | "outputs": [ 2126 | { 2127 | "data": { 2128 | "text/html": [ 2129 | "\n", 2130 | "\n", 2131 | " \n", 2132 | "\n", 2133 | "\n", 2134 | " \n", 2135 | "\n", 2136 | "\n", 2137 | " \n", 2138 | "\n", 2139 | "\n", 2140 | " \n", 2141 | "\n", 2142 | "\n", 2143 | " \n", 2144 | "\n", 2145 | "\n", 2146 | " \n", 2147 | "\n", 2148 | "\n", 2149 | " \n", 2150 | "\n", 2151 | "\n", 2152 | " \n", 2153 | "\n", 2154 | "
Model: GLM AIC: 26712.7150
Link Function: logit BIC: -380405.2776
Dependent Variable: hospital_expire_flag Log-Likelihood: -13350.
Date: 2020-01-17 20:54 LL-Null: -13738.
No. Observations: 38558 Deviance: 26701.
Df Model: 5 Pearson chi2: 3.86e+04
Df Residuals: 38552 Scale: 1.0000
Method: IRLS
\n", 2155 | "\n", 2156 | "\n", 2157 | " \n", 2158 | "\n", 2159 | "\n", 2160 | " \n", 2161 | "\n", 2162 | "\n", 2163 | " \n", 2164 | "\n", 2165 | "\n", 2166 | " \n", 2167 | "\n", 2168 | "\n", 2169 | " \n", 2170 | "\n", 2171 | "\n", 2172 | " \n", 2173 | "\n", 2174 | "\n", 2175 | " \n", 2176 | "\n", 2177 | "
Coef. Std.Err. z P>|z| [0.025 0.975]
Intercept -3.7169 0.0862 -43.1428 0.0000 -3.8858 -3.5481
C(inday_icu_wkd)[T.weekend] 1.3232 0.2388 5.5409 0.0000 0.8551 1.7912
C(admission_type)[T.EMERGENCY] 1.8013 0.0883 20.3997 0.0000 1.6283 1.9744
C(admission_type)[T.URGENT] 1.6095 0.1496 10.7598 0.0000 1.3164 1.9027
C(inday_icu_wkd)[T.weekend]:C(admission_type)[T.EMERGENCY] -1.2071 0.2418 -4.9911 0.0000 -1.6811 -0.7331
C(inday_icu_wkd)[T.weekend]:C(admission_type)[T.URGENT] -0.9872 0.3036 -3.2521 0.0011 -1.5822 -0.3922
" 2178 | ], 2179 | "text/plain": [ 2180 | "\n", 2181 | "\"\"\"\n", 2182 | " Results: Generalized linear model\n", 2183 | "===========================================================================================================\n", 2184 | "Model: GLM AIC: 26712.7150 \n", 2185 | "Link Function: logit BIC: -380405.2776\n", 2186 | "Dependent Variable: hospital_expire_flag Log-Likelihood: -13350. \n", 2187 | "Date: 2020-01-17 20:54 LL-Null: -13738. \n", 2188 | "No. Observations: 38558 Deviance: 26701. \n", 2189 | "Df Model: 5 Pearson chi2: 3.86e+04 \n", 2190 | "Df Residuals: 38552 Scale: 1.0000 \n", 2191 | "Method: IRLS \n", 2192 | "-----------------------------------------------------------------------------------------------------------\n", 2193 | " Coef. Std.Err. z P>|z| [0.025 0.975]\n", 2194 | "-----------------------------------------------------------------------------------------------------------\n", 2195 | "Intercept -3.7169 0.0862 -43.1428 0.0000 -3.8858 -3.5481\n", 2196 | "C(inday_icu_wkd)[T.weekend] 1.3232 0.2388 5.5409 0.0000 0.8551 1.7912\n", 2197 | "C(admission_type)[T.EMERGENCY] 1.8013 0.0883 20.3997 0.0000 1.6283 1.9744\n", 2198 | "C(admission_type)[T.URGENT] 1.6095 0.1496 10.7598 0.0000 1.3164 1.9027\n", 2199 | "C(inday_icu_wkd)[T.weekend]:C(admission_type)[T.EMERGENCY] -1.2071 0.2418 -4.9911 0.0000 -1.6811 -0.7331\n", 2200 | "C(inday_icu_wkd)[T.weekend]:C(admission_type)[T.URGENT] -0.9872 0.3036 -3.2521 0.0011 -1.5822 -0.3922\n", 2201 | "===========================================================================================================\n", 2202 | "\n", 2203 | "\"\"\"" 2204 | ] 2205 | }, 2206 | "execution_count": 44, 2207 | "metadata": { 2208 | "tags": [] 2209 | }, 2210 | "output_type": "execute_result" 2211 | } 2212 | ], 2213 | "source": [ 2214 | "# With effect modification\n", 2215 | "adj_glm_int = smf.glm('hospital_expire_flag ~ C(inday_icu_wkd) * C(admission_type)', \n", 2216 | " data=data, family=sm.families.Binomial()).fit()\n", 2217 | "adj_glm_int.summary2()\n", 2218 | "# drop1(adj.glm,test=\"Chisq\")" 2219 | ] 2220 | }, 2221 | { 2222 | "cell_type": "code", 2223 | "execution_count": 45, 2224 | "metadata": { 2225 | "colab": { 2226 | "base_uri": "https://localhost:8080/", 2227 | "height": 235 2228 | }, 2229 | "colab_type": "code", 2230 | "id": "s5IkTbBnMWlj", 2231 | "outputId": "3cef75bb-3084-439c-cd23-269bb49ae8c4" 2232 | }, 2233 | "outputs": [ 2234 | { 2235 | "data": { 2236 | "text/html": [ 2237 | "
\n", 2238 | "\n", 2251 | "\n", 2252 | " \n", 2253 | " \n", 2254 | " \n", 2255 | " \n", 2256 | " \n", 2257 | " \n", 2258 | " \n", 2259 | " \n", 2260 | " \n", 2261 | " \n", 2262 | " \n", 2263 | " \n", 2264 | " \n", 2265 | " \n", 2266 | " \n", 2267 | " \n", 2268 | " \n", 2269 | " \n", 2270 | " \n", 2271 | " \n", 2272 | " \n", 2273 | " \n", 2274 | " \n", 2275 | " \n", 2276 | " \n", 2277 | " \n", 2278 | " \n", 2279 | " \n", 2280 | " \n", 2281 | " \n", 2282 | " \n", 2283 | " \n", 2284 | " \n", 2285 | " \n", 2286 | " \n", 2287 | " \n", 2288 | " \n", 2289 | " \n", 2290 | " \n", 2291 | "
inday_icu_wkdadmission_type
0weekdayELECTIVE
1weekdayEMERGENCY
2weekdayURGENT
3weekendELECTIVE
4weekendEMERGENCY
5weekendURGENT
\n", 2292 | "
" 2293 | ], 2294 | "text/plain": [ 2295 | " inday_icu_wkd admission_type\n", 2296 | "0 weekday ELECTIVE\n", 2297 | "1 weekday EMERGENCY\n", 2298 | "2 weekday URGENT\n", 2299 | "3 weekend ELECTIVE\n", 2300 | "4 weekend EMERGENCY\n", 2301 | "5 weekend URGENT" 2302 | ] 2303 | }, 2304 | "execution_count": 45, 2305 | "metadata": { 2306 | "tags": [] 2307 | }, 2308 | "output_type": "execute_result" 2309 | } 2310 | ], 2311 | "source": [ 2312 | "# Create data structure to hold odds of hospital death\n", 2313 | "def expand_grid(data_dict):\n", 2314 | " rows = itertools.product(*data_dict.values())\n", 2315 | " return pd.DataFrame.from_records(rows, columns=data_dict.keys())\n", 2316 | "\n", 2317 | "weekend_grid = expand_grid({'inday_icu_wkd': ['weekday', 'weekend'],\n", 2318 | " 'admission_type': ['ELECTIVE', 'EMERGENCY', 'URGENT']})\n", 2319 | "\n", 2320 | "weekend_grid" 2321 | ] 2322 | }, 2323 | { 2324 | "cell_type": "markdown", 2325 | "metadata": { 2326 | "colab_type": "text", 2327 | "id": "HBvyZbBXMWll" 2328 | }, 2329 | "source": [ 2330 | "In the first model (no interaction), we see that although the effect of weekend is almost halved, it remains statistically significant, after adjusting for admission type (p<0.001).\n", 2331 | "\n", 2332 | "In the second model, we are primarily interested in the significance of the interaction. We can see when assessed with the `drop1` function, the interaction (`weekend:admission_type`) is statistically significant (p<0.001), suggesting that the effect of weekend may be different depending on which hospital admission type you are. How exactly to interpret this:\n", 2333 | "\n", 2334 | "One way of looking at this complexity is by computing the odds ratio in each of the levels of admission type. We can do this using the `predict` function, which by default outputs the log-odds of death. If for each hospital admission type, we calculate the log odds of death for each of the levels of weekend," 2335 | ] 2336 | }, 2337 | { 2338 | "cell_type": "code", 2339 | "execution_count": 0, 2340 | "metadata": { 2341 | "colab": {}, 2342 | "colab_type": "code", 2343 | "id": "ucLxfa4KMWlm" 2344 | }, 2345 | "outputs": [], 2346 | "source": [ 2347 | "def prob2logodds(prob):\n", 2348 | " odds = prob / (1 - prob)\n", 2349 | " logodds = np.log(odds)\n", 2350 | " return logodds" 2351 | ] 2352 | }, 2353 | { 2354 | "cell_type": "code", 2355 | "execution_count": 47, 2356 | "metadata": { 2357 | "colab": { 2358 | "base_uri": "https://localhost:8080/", 2359 | "height": 266 2360 | }, 2361 | "colab_type": "code", 2362 | "id": "wEPXVNtFMWlo", 2363 | "outputId": "65ef31df-5d7a-48a2-e1c5-1dd0f132c3d0", 2364 | "scrolled": true 2365 | }, 2366 | "outputs": [ 2367 | { 2368 | "data": { 2369 | "text/html": [ 2370 | "
\n", 2371 | "\n", 2384 | "\n", 2385 | " \n", 2386 | " \n", 2387 | " \n", 2388 | " \n", 2389 | " \n", 2390 | " \n", 2391 | " \n", 2392 | " \n", 2393 | " \n", 2394 | " \n", 2395 | " \n", 2396 | " \n", 2397 | " \n", 2398 | " \n", 2399 | " \n", 2400 | " \n", 2401 | " \n", 2402 | " \n", 2403 | " \n", 2404 | " \n", 2405 | " \n", 2406 | " \n", 2407 | " \n", 2408 | " \n", 2409 | " \n", 2410 | " \n", 2411 | " \n", 2412 | " \n", 2413 | " \n", 2414 | " \n", 2415 | " \n", 2416 | " \n", 2417 | " \n", 2418 | " \n", 2419 | " \n", 2420 | " \n", 2421 | " \n", 2422 | " \n", 2423 | " \n", 2424 | " \n", 2425 | " \n", 2426 | " \n", 2427 | " \n", 2428 | " \n", 2429 | " \n", 2430 | " \n", 2431 | " \n", 2432 | " \n", 2433 | "
predictlog_odds
inday_icu_wkdadmission_type
weekdayELECTIVE0.023732-3.716925
EMERGENCY0.128353-1.915596
URGENT0.108382-2.107381
weekendELECTIVE0.083650-2.393754
EMERGENCY0.141909-1.799525
URGENT0.145363-1.771439
\n", 2434 | "
" 2435 | ], 2436 | "text/plain": [ 2437 | " predict log_odds\n", 2438 | "inday_icu_wkd admission_type \n", 2439 | "weekday ELECTIVE 0.023732 -3.716925\n", 2440 | " EMERGENCY 0.128353 -1.915596\n", 2441 | " URGENT 0.108382 -2.107381\n", 2442 | "weekend ELECTIVE 0.083650 -2.393754\n", 2443 | " EMERGENCY 0.141909 -1.799525\n", 2444 | " URGENT 0.145363 -1.771439" 2445 | ] 2446 | }, 2447 | "execution_count": 47, 2448 | "metadata": { 2449 | "tags": [] 2450 | }, 2451 | "output_type": "execute_result" 2452 | } 2453 | ], 2454 | "source": [ 2455 | "weekend_grid['predict'] = adj_glm_int.predict(weekend_grid[['inday_icu_wkd','admission_type']])\n", 2456 | "weekend_grid['log_odds'] = prob2logodds(weekend_grid['predict'])\n", 2457 | "weekend_grid.set_index(['inday_icu_wkd','admission_type'], inplace=True)\n", 2458 | "weekend_grid" 2459 | ] 2460 | }, 2461 | { 2462 | "cell_type": "markdown", 2463 | "metadata": { 2464 | "colab_type": "text", 2465 | "id": "mGmTCA6TMWlq" 2466 | }, 2467 | "source": [ 2468 | "We can now compute the log odds ratio ($log(OR) = logOdds_{weekend} - logOdds_{weekday}$), and exponentiate to get the odds ratio:" 2469 | ] 2470 | }, 2471 | { 2472 | "cell_type": "code", 2473 | "execution_count": 48, 2474 | "metadata": { 2475 | "colab": { 2476 | "base_uri": "https://localhost:8080/", 2477 | "height": 102 2478 | }, 2479 | "colab_type": "code", 2480 | "id": "1iIeZmheMWlr", 2481 | "outputId": "51fce423-a1e7-473e-a9c1-81ddb4754b85" 2482 | }, 2483 | "outputs": [ 2484 | { 2485 | "data": { 2486 | "text/plain": [ 2487 | "admission_type\n", 2488 | "ELECTIVE 3.755307\n", 2489 | "EMERGENCY 1.123076\n", 2490 | "URGENT 1.399257\n", 2491 | "Name: log_odds, dtype: float64" 2492 | ] 2493 | }, 2494 | "execution_count": 48, 2495 | "metadata": { 2496 | "tags": [] 2497 | }, 2498 | "output_type": "execute_result" 2499 | } 2500 | ], 2501 | "source": [ 2502 | "diff_grid = weekend_grid.loc['weekend']['log_odds'] - weekend_grid.loc['weekday']['log_odds']\n", 2503 | "np.exp(diff_grid)" 2504 | ] 2505 | }, 2506 | { 2507 | "cell_type": "markdown", 2508 | "metadata": { 2509 | "colab_type": "text", 2510 | "id": "nxlSkP2XMWlt" 2511 | }, 2512 | "source": [ 2513 | "So, this mirrors what we saw above. While there may be differences between EMERGENCY and URGENT admission types, an ELECTIVE admission occurring on a weekend has an odds of mortality almost four times that of an ELECTIVE admission on a weekday. This seems particularly odd -- patients usually do not get admitted to a hospital electively on a weekend.\n", 2514 | "\n", 2515 | "What do you think?\n", 2516 | "\n", 2517 | "- Do patients admitted on a weekend have a higher rate of mortality than those admitted during the week?\n", 2518 | "- Who is most affected, if at all?\n", 2519 | "- What factors can you rule out might be causing this effect? e.g., is it because the patients are simply sicker on a weekend? Are they more likely to have complications?\n", 2520 | "\n", 2521 | "Looking forward to see what you guys come up with!" 2522 | ] 2523 | }, 2524 | { 2525 | "cell_type": "code", 2526 | "execution_count": 0, 2527 | "metadata": { 2528 | "colab": {}, 2529 | "colab_type": "code", 2530 | "id": "SWW22eBvMWlt" 2531 | }, 2532 | "outputs": [], 2533 | "source": [] 2534 | } 2535 | ], 2536 | "metadata": { 2537 | "colab": { 2538 | "name": "challenge-demo.ipynb", 2539 | "provenance": [] 2540 | }, 2541 | "kernelspec": { 2542 | "display_name": "Python 3", 2543 | "language": "python", 2544 | "name": "python3" 2545 | }, 2546 | "language_info": { 2547 | "codemirror_mode": { 2548 | "name": "ipython", 2549 | "version": 3 2550 | }, 2551 | "file_extension": ".py", 2552 | "mimetype": "text/x-python", 2553 | "name": "python", 2554 | "nbconvert_exporter": "python", 2555 | "pygments_lexer": "ipython3", 2556 | "version": "3.7.4" 2557 | } 2558 | }, 2559 | "nbformat": 4, 2560 | "nbformat_minor": 1 2561 | } 2562 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | numpy==1.18.1 2 | pandas==0.25.1 3 | scikit-learn==0.22.1 4 | matplotlib==3.1.0 5 | tableone==0.6.6 --------------------------------------------------------------------------------