{ "cells": [ { "cell_type": "markdown", "id": "c9f3ba8d-da52-4038-8f63-2b513fd51fe4", "metadata": {}, "source": [ "# MIMIC-II IAC Survival Analysis" ] }, { "cell_type": "markdown", "id": "28605891-5073-4ef9-9cbc-1adbbe99d604", "metadata": {}, "source": [ "This tutorial explores the MIMIC-II IAC dataset. It was created for the purpose of a case study in the book: Secondary Analysis of Electronic Health Records, published by Springer in 2016. In particular, the dataset was used throughout Chapter 16 (Data Analysis) by Raffa J. et al. to investigate the effectiveness of indwelling arterial catheters in hemodynamically stable patients with respiratory failure for mortality outcomes. The dataset is derived from MIMIC-II, the publicly-accessible critical care database. It contains summary clinical data and outcomes for 1,776 patients.\n", "\n", "Reference: \n", "\n", "[1] Critical Data, M.I.T., 2016. Secondary analysis of electronic health records (p. 427). Springer Nature. (https://link.springer.com/book/10.1007/978-3-319-43742-2)\n", "\n", "[2] https://github.com/MIT-LCP/critical-data-book/tree/master/part_ii/chapter_16/jupyter\n", "\n", "[3] https://stackoverflow.com/questions/27328623/anova-test-for-glm-in-python/60769343#60769343" ] }, { "cell_type": "markdown", "id": "e77910ed-82d4-4b4c-93a6-7f3fae8b2cb1", "metadata": {}, "source": [ "More details on the dataset can be found here: https://physionet.org/content/mimic2-iaccd/1.0/." ] }, { "cell_type": "markdown", "id": "8bd31bd3-c945-4314-be00-985be720d6e9", "metadata": {}, "source": [ "## Importing ehrapy and setting plotting parameters" ] }, { "cell_type": "code", "execution_count": 1, "id": "ea172c3a-e8aa-469a-ba7c-5d4730fee1e0", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
Installed version 0.3.0 of ehrapy is newer than the latest release 0.2.0! You are running a nightly version and \n",
       "features may break!\n",
       "
\n" ], "text/plain": [ "\u001b[1;33mInstalled version \u001b[0m\u001b[1;33m0.3\u001b[0m\u001b[1;33m.\u001b[0m\u001b[1;33m0\u001b[0m\u001b[1;33m of ehrapy is newer than the latest release \u001b[0m\u001b[1;33m0.2\u001b[0m\u001b[1;33m.\u001b[0m\u001b[1;33m0\u001b[0m\u001b[1;33m! You are running a nightly version and \u001b[0m\n", "\u001b[1;33mfeatures may break!\u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import ehrapy as ep\n", "import pandas as pd\n", "import numpy as np\n", "from statsmodels.stats.anova import anova_lm\n", "from itertools import product\n", "from lifelines import CoxPHFitter" ] }, { "cell_type": "code", "execution_count": 2, "id": "d845678f-4473-48c1-9a9d-8dcc03ed41b6", "metadata": {}, "outputs": [], "source": [ "import warnings\n", "\n", "warnings.filterwarnings(\"ignore\")" ] }, { "cell_type": "code", "execution_count": 3, "id": "3f45a5f8-409f-4c0d-802d-616473ae2810", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
-----\n",
       "ehrapy              0.3.0\n",
       "rich                NA\n",
       "scanpy              1.9.1\n",
       "session_info        1.0.0\n",
       "-----\n",
       "PIL                 9.2.0\n",
       "PyPDF2              2.6.0\n",
       "anndata             0.8.0\n",
       "appnope             0.1.3\n",
       "astor               0.8.1\n",
       "asttokens           NA\n",
       "attr                21.4.0\n",
       "autograd            NA\n",
       "autograd_gamma      NA\n",
       "backcall            0.2.0\n",
       "backports           NA\n",
       "bs4                 4.11.1\n",
       "camelot             0.10.1\n",
       "category_encoders   2.5.0\n",
       "certifi             2022.06.15\n",
       "cffi                1.15.1\n",
       "chardet             5.0.0\n",
       "charset_normalizer  2.1.0\n",
       "colorama            0.4.5\n",
       "cryptography        37.0.4\n",
       "cv2                 4.6.0\n",
       "cvxopt              1.3.0\n",
       "cycler              0.10.0\n",
       "cython_runtime      NA\n",
       "dateutil            2.8.2\n",
       "debugpy             1.6.2\n",
       "decorator           5.1.1\n",
       "deep_translator     1.8.0\n",
       "deepl               1.9.0\n",
       "defusedxml          0.7.1\n",
       "entrypoints         0.4\n",
       "executing           0.8.3\n",
       "formulaic           0.3.4\n",
       "future              0.18.2\n",
       "h5py                3.7.0\n",
       "idna                3.3\n",
       "igraph              0.9.11\n",
       "interface_meta      1.3.0\n",
       "ipykernel           6.15.1\n",
       "jedi                0.18.1\n",
       "joblib              1.1.0\n",
       "kiwisolver          1.4.4\n",
       "leidenalg           0.8.10\n",
       "lifelines           0.27.1\n",
       "llvmlite            0.34.0\n",
       "matplotlib          3.5.2\n",
       "mpl_toolkits        NA\n",
       "mudata              0.2.0\n",
       "natsort             8.1.0\n",
       "numba               0.51.2\n",
       "numpy               1.23.1\n",
       "packaging           21.3\n",
       "pandas              1.4.2\n",
       "parso               0.8.3\n",
       "patsy               0.5.2\n",
       "pdfminer            20220524\n",
       "pexpect             4.8.0\n",
       "pickleshare         0.7.5\n",
       "pkg_resources       NA\n",
       "prompt_toolkit      3.0.30\n",
       "psutil              5.9.1\n",
       "ptyprocess          0.7.0\n",
       "pure_eval           0.2.2\n",
       "pydantic            NA\n",
       "pydev_ipython       NA\n",
       "pydevconsole        NA\n",
       "pydevd              2.8.0\n",
       "pydevd_file_utils   NA\n",
       "pydevd_plugins      NA\n",
       "pydevd_tracing      NA\n",
       "pygments            2.12.0\n",
       "pyhpo               3.1.2\n",
       "pyparsing           3.0.9\n",
       "pypi_latest         0.1.2\n",
       "pytz                2022.1\n",
       "questionary         1.10.0\n",
       "requests            2.28.1\n",
       "ruamel              NA\n",
       "scipy               1.6.1\n",
       "setuptools          63.1.0\n",
       "setuptools_scm      NA\n",
       "six                 1.16.0\n",
       "sklearn             1.1.1\n",
       "soupsieve           2.3.2.post1\n",
       "sphinxcontrib       NA\n",
       "stack_data          0.3.0\n",
       "statsmodels         0.13.2\n",
       "tabulate            0.8.10\n",
       "texttable           1.6.4\n",
       "threadpoolctl       3.1.0\n",
       "tornado             6.2\n",
       "traitlets           5.3.0\n",
       "typing_extensions   NA\n",
       "urllib3             1.26.10\n",
       "wcwidth             0.2.5\n",
       "wrapt               1.14.1\n",
       "yaml                6.0\n",
       "zipp                NA\n",
       "zmq                 23.2.0\n",
       "-----\n",
       "IPython             8.4.0\n",
       "jupyter_client      7.3.4\n",
       "jupyter_core        4.11.1\n",
       "-----\n",
       "Python 3.8.2 (default, Apr  8 2021, 23:19:18) [Clang 12.0.5 (clang-1205.0.22.9)]\n",
       "macOS-12.5-x86_64-i386-64bit\n",
       "-----\n",
       "Session information updated at 2022-08-09 12:04\n",
       "\n",
       "
\n" ], "text/plain": [ "-----\n", "ehrapy \u001b[1;36m0.3\u001b[0m.\u001b[1;36m0\u001b[0m\n", "rich NA\n", "scanpy \u001b[1;36m1.9\u001b[0m.\u001b[1;36m1\u001b[0m\n", "session_info \u001b[1;36m1.0\u001b[0m.\u001b[1;36m0\u001b[0m\n", "-----\n", "PIL \u001b[1;36m9.2\u001b[0m.\u001b[1;36m0\u001b[0m\n", "PyPDF2 \u001b[1;36m2.6\u001b[0m.\u001b[1;36m0\u001b[0m\n", "anndata \u001b[1;36m0.8\u001b[0m.\u001b[1;36m0\u001b[0m\n", "appnope \u001b[1;36m0.1\u001b[0m.\u001b[1;36m3\u001b[0m\n", "astor \u001b[1;36m0.8\u001b[0m.\u001b[1;36m1\u001b[0m\n", "asttokens NA\n", "attr \u001b[1;36m21.4\u001b[0m.\u001b[1;36m0\u001b[0m\n", "autograd NA\n", "autograd_gamma NA\n", "backcall \u001b[1;36m0.2\u001b[0m.\u001b[1;36m0\u001b[0m\n", "backports NA\n", "bs4 \u001b[1;36m4.11\u001b[0m.\u001b[1;36m1\u001b[0m\n", "camelot \u001b[1;36m0.10\u001b[0m.\u001b[1;36m1\u001b[0m\n", "category_encoders \u001b[1;36m2.5\u001b[0m.\u001b[1;36m0\u001b[0m\n", "certifi \u001b[1;36m2022.06\u001b[0m.\u001b[1;36m15\u001b[0m\n", "cffi \u001b[1;36m1.15\u001b[0m.\u001b[1;36m1\u001b[0m\n", "chardet \u001b[1;36m5.0\u001b[0m.\u001b[1;36m0\u001b[0m\n", "charset_normalizer \u001b[1;36m2.1\u001b[0m.\u001b[1;36m0\u001b[0m\n", "colorama \u001b[1;36m0.4\u001b[0m.\u001b[1;36m5\u001b[0m\n", "cryptography \u001b[1;36m37.0\u001b[0m.\u001b[1;36m4\u001b[0m\n", "cv2 \u001b[1;36m4.6\u001b[0m.\u001b[1;36m0\u001b[0m\n", "cvxopt \u001b[1;36m1.3\u001b[0m.\u001b[1;36m0\u001b[0m\n", "cycler \u001b[1;36m0.10\u001b[0m.\u001b[1;36m0\u001b[0m\n", "cython_runtime NA\n", "dateutil \u001b[1;36m2.8\u001b[0m.\u001b[1;36m2\u001b[0m\n", "debugpy \u001b[1;36m1.6\u001b[0m.\u001b[1;36m2\u001b[0m\n", "decorator \u001b[1;36m5.1\u001b[0m.\u001b[1;36m1\u001b[0m\n", "deep_translator \u001b[1;36m1.8\u001b[0m.\u001b[1;36m0\u001b[0m\n", "deepl \u001b[1;36m1.9\u001b[0m.\u001b[1;36m0\u001b[0m\n", "defusedxml \u001b[1;36m0.7\u001b[0m.\u001b[1;36m1\u001b[0m\n", "entrypoints \u001b[1;36m0.4\u001b[0m\n", "executing \u001b[1;36m0.8\u001b[0m.\u001b[1;36m3\u001b[0m\n", "formulaic \u001b[1;36m0.3\u001b[0m.\u001b[1;36m4\u001b[0m\n", "future \u001b[1;36m0.18\u001b[0m.\u001b[1;36m2\u001b[0m\n", "h5py \u001b[1;36m3.7\u001b[0m.\u001b[1;36m0\u001b[0m\n", "idna \u001b[1;36m3.3\u001b[0m\n", "igraph \u001b[1;36m0.9\u001b[0m.\u001b[1;36m11\u001b[0m\n", "interface_meta \u001b[1;36m1.3\u001b[0m.\u001b[1;36m0\u001b[0m\n", "ipykernel \u001b[1;36m6.15\u001b[0m.\u001b[1;36m1\u001b[0m\n", "jedi \u001b[1;36m0.18\u001b[0m.\u001b[1;36m1\u001b[0m\n", "joblib \u001b[1;36m1.1\u001b[0m.\u001b[1;36m0\u001b[0m\n", "kiwisolver \u001b[1;36m1.4\u001b[0m.\u001b[1;36m4\u001b[0m\n", "leidenalg \u001b[1;36m0.8\u001b[0m.\u001b[1;36m10\u001b[0m\n", "lifelines \u001b[1;36m0.27\u001b[0m.\u001b[1;36m1\u001b[0m\n", "llvmlite \u001b[1;36m0.34\u001b[0m.\u001b[1;36m0\u001b[0m\n", "matplotlib \u001b[1;36m3.5\u001b[0m.\u001b[1;36m2\u001b[0m\n", "mpl_toolkits NA\n", "mudata \u001b[1;36m0.2\u001b[0m.\u001b[1;36m0\u001b[0m\n", "natsort \u001b[1;36m8.1\u001b[0m.\u001b[1;36m0\u001b[0m\n", "numba \u001b[1;36m0.51\u001b[0m.\u001b[1;36m2\u001b[0m\n", "numpy \u001b[1;36m1.23\u001b[0m.\u001b[1;36m1\u001b[0m\n", "packaging \u001b[1;36m21.3\u001b[0m\n", "pandas \u001b[1;36m1.4\u001b[0m.\u001b[1;36m2\u001b[0m\n", "parso \u001b[1;36m0.8\u001b[0m.\u001b[1;36m3\u001b[0m\n", "patsy \u001b[1;36m0.5\u001b[0m.\u001b[1;36m2\u001b[0m\n", "pdfminer \u001b[1;36m20220524\u001b[0m\n", "pexpect \u001b[1;36m4.8\u001b[0m.\u001b[1;36m0\u001b[0m\n", "pickleshare \u001b[1;36m0.7\u001b[0m.\u001b[1;36m5\u001b[0m\n", "pkg_resources NA\n", "prompt_toolkit \u001b[1;36m3.0\u001b[0m.\u001b[1;36m30\u001b[0m\n", "psutil \u001b[1;36m5.9\u001b[0m.\u001b[1;36m1\u001b[0m\n", "ptyprocess \u001b[1;36m0.7\u001b[0m.\u001b[1;36m0\u001b[0m\n", "pure_eval \u001b[1;36m0.2\u001b[0m.\u001b[1;36m2\u001b[0m\n", "pydantic NA\n", "pydev_ipython NA\n", "pydevconsole NA\n", "pydevd \u001b[1;36m2.8\u001b[0m.\u001b[1;36m0\u001b[0m\n", "pydevd_file_utils NA\n", "pydevd_plugins NA\n", "pydevd_tracing NA\n", "pygments \u001b[1;36m2.12\u001b[0m.\u001b[1;36m0\u001b[0m\n", "pyhpo \u001b[1;36m3.1\u001b[0m.\u001b[1;36m2\u001b[0m\n", "pyparsing \u001b[1;36m3.0\u001b[0m.\u001b[1;36m9\u001b[0m\n", "pypi_latest \u001b[1;36m0.1\u001b[0m.\u001b[1;36m2\u001b[0m\n", "pytz \u001b[1;36m2022.1\u001b[0m\n", "questionary \u001b[1;36m1.10\u001b[0m.\u001b[1;36m0\u001b[0m\n", "requests \u001b[1;36m2.28\u001b[0m.\u001b[1;36m1\u001b[0m\n", "ruamel NA\n", "scipy \u001b[1;36m1.6\u001b[0m.\u001b[1;36m1\u001b[0m\n", "setuptools \u001b[1;36m63.1\u001b[0m.\u001b[1;36m0\u001b[0m\n", "setuptools_scm NA\n", "six \u001b[1;36m1.16\u001b[0m.\u001b[1;36m0\u001b[0m\n", "sklearn \u001b[1;36m1.1\u001b[0m.\u001b[1;36m1\u001b[0m\n", "soupsieve \u001b[1;36m2.3\u001b[0m.\u001b[1;36m2.\u001b[0mpost1\n", "sphinxcontrib NA\n", "stack_data \u001b[1;36m0.3\u001b[0m.\u001b[1;36m0\u001b[0m\n", "statsmodels \u001b[1;36m0.13\u001b[0m.\u001b[1;36m2\u001b[0m\n", "tabulate \u001b[1;36m0.8\u001b[0m.\u001b[1;36m10\u001b[0m\n", "texttable \u001b[1;36m1.6\u001b[0m.\u001b[1;36m4\u001b[0m\n", "threadpoolctl \u001b[1;36m3.1\u001b[0m.\u001b[1;36m0\u001b[0m\n", "tornado \u001b[1;36m6.2\u001b[0m\n", "traitlets \u001b[1;36m5.3\u001b[0m.\u001b[1;36m0\u001b[0m\n", "typing_extensions NA\n", "urllib3 \u001b[1;36m1.26\u001b[0m.\u001b[1;36m10\u001b[0m\n", "wcwidth \u001b[1;36m0.2\u001b[0m.\u001b[1;36m5\u001b[0m\n", "wrapt \u001b[1;36m1.14\u001b[0m.\u001b[1;36m1\u001b[0m\n", "yaml \u001b[1;36m6.0\u001b[0m\n", "zipp NA\n", "zmq \u001b[1;36m23.2\u001b[0m.\u001b[1;36m0\u001b[0m\n", "-----\n", "IPython \u001b[1;36m8.4\u001b[0m.\u001b[1;36m0\u001b[0m\n", "jupyter_client \u001b[1;36m7.3\u001b[0m.\u001b[1;36m4\u001b[0m\n", "jupyter_core \u001b[1;36m4.11\u001b[0m.\u001b[1;36m1\u001b[0m\n", "-----\n", "Python \u001b[1;36m3.8\u001b[0m.\u001b[1;36m2\u001b[0m \u001b[1m(\u001b[0mdefault, Apr \u001b[1;36m8\u001b[0m \u001b[1;36m2021\u001b[0m, \u001b[1;92m23:19:18\u001b[0m\u001b[1m)\u001b[0m \u001b[1m[\u001b[0mClang \u001b[1;36m12.0\u001b[0m.\u001b[1;36m5\u001b[0m \u001b[1m(\u001b[0mclang-\u001b[1;36m1205.0\u001b[0m.\u001b[1;36m22.9\u001b[0m\u001b[1m)\u001b[0m\u001b[1m]\u001b[0m\n", "macOS-\u001b[1;36m12.5\u001b[0m-x86_64-i386-64bit\n", "-----\n", "Session information updated at \u001b[1;36m2022\u001b[0m-\u001b[1;36m08\u001b[0m-\u001b[1;36m09\u001b[0m \u001b[1;92m12:04\u001b[0m\n", "\n" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "ep.print_versions()" ] }, { "cell_type": "markdown", "id": "7d01b06d-cd7a-4caf-8a41-e9ee2202e897", "metadata": {}, "source": [ "## MIMIC-II dataset preparation" ] }, { "cell_type": "code", "execution_count": 4, "id": "95a30585-8194-4dc6-986d-e27c21a124c3", "metadata": { "tags": [] }, "outputs": [], "source": [ "adata = ep.dt.mimic_2(encoded=False)" ] }, { "cell_type": "markdown", "id": "4b8c9f2c-817b-4366-8764-2ae64785b2dd", "metadata": {}, "source": [ "It is also possible to get the MIMIC-II dataset already pre-encoded by setting the encoded flag to 'True'. ehrapy's default encoding is a simple label encoding in this case." ] }, { "cell_type": "markdown", "id": "2cd9592a-ef02-47d7-8576-e73aac96b8ae", "metadata": {}, "source": [ "The MIMIC-II dataset has 1776 patients as described above with 46 features." ] }, { "cell_type": "code", "execution_count": 5, "id": "29f0bda7-471c-4387-b259-7bb1535093a2", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "AnnData object with n_obs × n_vars = 1776 × 46\n", " uns: 'numerical_columns', 'non_numerical_columns'\n", " layers: 'original'" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "adata" ] }, { "cell_type": "markdown", "id": "21ffeab3-d1e6-4c91-a6c3-b6d641a9f4af", "metadata": {}, "source": [ "After one-hot encoding the two columns we've expanded our matrix from 46 to 54 features.\n", "Let's verify that we've indeed encoded all columns and are ready to proceed." ] }, { "cell_type": "markdown", "id": "9df205a5", "metadata": {}, "source": [ "## Linear Regression" ] }, { "cell_type": "markdown", "id": "c54d865e", "metadata": {}, "source": [ "### Introduction" ] }, { "cell_type": "markdown", "id": "04daa32c", "metadata": {}, "source": [ "Linear regression provides the foundation for many types of analyses we perform on health data. In the simplest scenario, we try to relate one continuous outcome, $y$, to a single continuous covariate, $x$, by trying to find values for $\\beta_0$ and $\\beta_1$ so that the following equation describes our observations:\n", "$y=\\beta_0 + \\beta_1 \\times x$" ] }, { "cell_type": "markdown", "id": "86ec200c", "metadata": {}, "source": [ "It is always a good idea to visualize the data when you can, which allows one to assess if the subsequent analysis corresponds to what you could see with your eyes. In this case, a scatter plot has been used, producing the scattered points:" ] }, { "cell_type": "code", "execution_count": 6, "id": "ed85cc55", "metadata": {}, "outputs": [ { "data": { "image/png": "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rbhcLmOYLt9m+N7XkZGRtLe3Y7FYBlyXEx0djdPpxGq10tTUBLj/KLtcLsaPH09bWxtKKWPUfZvNRktLC0lJSTidTmJjY9myZQsxMTEcP36cS5cukZSURF1dHWazmfLychobG41pgeLj46mpqUEpxerVq4mPj6ekpIT8/HySkpJYsmSJX8KrrKzk8OHDxMbGsnz5cqMv3WA5dOgQV65cITc3l7lz53a7r9aagwcPUl1dTWJiojHtzg033BAwSbe0tPD555/T2trK8uXLGTNmzKDGLkQ4CNmUN8r9FfWPwHWt9V/7rP9XoFpr/VOl1I+BZK3133d3rnBJblprnn76aaqrq7vcJykpiZiYmE7FlkNh5syZnD9/vs9DfW3YsIHz589z4cIFY919993Hu+++2+0I+wsWLOAb3/hGl9vLysr4/e9/byTp9evXs3TpUsDdreLXv/61EevKlStZu3Yt4E4Ov/rVr4wiwHnz5nHnnXf26T0Npl27dhndOywWC9///vdJSho1jYSFCIpQ1rndADwIrFFKHfP8bAB+CtyqlCoAbvEsjwotLS3dJjZwNzoIVTFsYWFhv8awLCkpoby83G/dhQsXepw65urVq91uv3btml/dmm/Cr6io8IvV91w1NTV+dVs9XSfYfON2OByd7pUQYnAFNblprfdorZXWeo7Wep7n50OtdbXWeq3WerLW+hat9fVgxjGcREdHM27cuG73SU9PJycnZ2gC6mDWrFn9moF60qRJ5ObmdjpXfHx8j8d1Z8KECX71kL77jx071q/foHfCUoDU1FS/J6OerhNsvtfvzWdACDEwg1sJIXqklOLBBx/k2LFjAJw7d46amhrsdrvRDy0iIoL29nYiIyNpbW0lISGBMWPG4HK5uHTpkt8IH2az2ehH1trait1uN+reepKTk0NERASFhYW0tbWRkJDA+vXrSUhI4NNPP+3xeG+jkfj4eKZMmcLUqVOpqKigpqaG2bNnk5OTww9+8APef/992tvbmTVrFrW1tWRkZFBeXo7NZjOawe/evZtLly6RkJBAQ0MDkZGRrFu3jpSUFJYtW8aJEydIT09nxowZxvVtNhuPPfYYZ86cISkpienTpxvbIiIiePTRR8nPz/e7TqgsW7aMxMREqqurmT59ujQQESLIZGzJEPrwww/56quverXvjTfeyBdffDHozd8nTZrk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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "ax = ep.pl.scatter(adata, x=\"pco2_first\", y=\"tco2_first\")" ] }, { "cell_type": "markdown", "id": "2966db28", "metadata": {}, "source": [ "Finding the best fit line for the scatter plot above using `ep.tl.ols (ehrapy.tools.ols)` is relatively straightforward:" ] }, { "cell_type": "code", "execution_count": 7, "id": "1b0b2d2e", "metadata": {}, "outputs": [], "source": [ "var_names = [\"pco2_first\", \"tco2_first\", \"gender_num\"]\n", "formula = \"tco2_first ~ pco2_first\"\n", "co2_lm = ep.tl.ols(adata, var_names, formula, missing=\"drop\")" ] }, { "cell_type": "markdown", "id": "c8697fa9", "metadata": {}, "source": [ "Dissecting this command from left to right: The `co2_lm =` part assigns the right part of the command to a new variable called `co2_lm`. The right side of this command runs the `OLS` function in `Python`. The basic `OLS` command has two parts. The first is the formula which has the general syntax `outcome ~ covariates`. Here, our outcome variable is called `tco2_first` and we are just fitting one covariate, `pco2_first`, so our formula is `tco2_first ~ pco2_first`. The second argument is separated by a comma and is specifying the data frame to use. In our case, the data frame is called `dat`, so we pass `data=dat`, noting that both `tco2_first` and `pco2_first` are columns in the dataframe `dat`. The overall procedure of specifying a model formula (`tco2_first ~ pco2_first`), a data frame (`data=dat`) and passing it an appropriate `Python` function (`OLS`) will be used throughout this chapter, and is the foundation for many types of statistical modeling in `Python`.\n", "\n", "We would like to see some information about the model we just fit, and often a good way of doing this is to run the `summary` command on the object we created:" ] }, { "cell_type": "code", "execution_count": 8, "id": "0bcd26ef", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "
OLS Regression Results
Dep. Variable: tco2_first R-squared: 0.265
Model: OLS Adj. R-squared: 0.264
Method: Least Squares F-statistic: 571.8
Date: Tue, 09 Aug 2022 Prob (F-statistic): 3.52e-108
Time: 12:04:16 Log-Likelihood: -4609.1
No. Observations: 1590 AIC: 9222.
Df Residuals: 1588 BIC: 9233.
Df Model: 1
Covariance Type: nonrobust
\n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "
coef std err t P>|t| [0.025 0.975]
Intercept 16.2109 0.360 45.071 0.000 15.505 16.916
pco2_first 0.1886 0.008 23.912 0.000 0.173 0.204
\n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "
Omnibus: 94.233 Durbin-Watson: 1.963
Prob(Omnibus): 0.000 Jarque-Bera (JB): 195.722
Skew: -0.389 Prob(JB): 3.16e-43
Kurtosis: 4.532 Cond. No. 149.


Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified." ], "text/plain": [ "\n", "\"\"\"\n", " OLS Regression Results \n", "==============================================================================\n", "Dep. Variable: tco2_first R-squared: 0.265\n", "Model: OLS Adj. R-squared: 0.264\n", "Method: Least Squares F-statistic: 571.8\n", "Date: Tue, 09 Aug 2022 Prob (F-statistic): 3.52e-108\n", "Time: 12:04:16 Log-Likelihood: -4609.1\n", "No. Observations: 1590 AIC: 9222.\n", "Df Residuals: 1588 BIC: 9233.\n", "Df Model: 1 \n", "Covariance Type: nonrobust \n", "==============================================================================\n", " coef std err t P>|t| [0.025 0.975]\n", "------------------------------------------------------------------------------\n", "Intercept 16.2109 0.360 45.071 0.000 15.505 16.916\n", "pco2_first 0.1886 0.008 23.912 0.000 0.173 0.204\n", "==============================================================================\n", "Omnibus: 94.233 Durbin-Watson: 1.963\n", "Prob(Omnibus): 0.000 Jarque-Bera (JB): 195.722\n", "Skew: -0.389 Prob(JB): 3.16e-43\n", "Kurtosis: 4.532 Cond. No. 149.\n", "==============================================================================\n", "\n", "Notes:\n", "[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.\n", "\"\"\"" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "co2_lm_result = co2_lm.fit()\n", "co2_lm_result.summary()" ] }, { "cell_type": "markdown", "id": "f724fd7c", "metadata": {}, "source": [ "This outputs information about the `OLS` object we created in the previous step. The first part recalls the model we fit, which is useful when we have fit many models, and are trying to compare them. The second part lists some summary information about what are called residuals -- a topic we will cover later on in this book (Chapter 2.6). Next lists the coefficient estimates -- these are the $\\hat{\\beta}_0$, `(Intercept)`, and $\\hat{\\beta}_1$, `pco2_first`, parameters in the best fit line we are trying to estimate. This output is telling us that the best fit equation for the data is:\n", "\n", "`tco2_first` = 16.21 + 0.189 $\\times$ `pco2_first`." ] }, { "cell_type": "markdown", "id": "04927b2d", "metadata": {}, "source": [ "### Model Selection" ] }, { "cell_type": "markdown", "id": "eed7bbaa", "metadata": {}, "source": [ "Model selection is the procedure to select the best model from a list (perhaps rather large list) of candidate models. Different approaches and techniques exist for this procedure. We will cover some basics here, as more complicated techniques will be covered in a later chapter. In the simplest case, we have two models, and we want to know which one we should use.\n", "\n", "We will begin by examining if the relationship between TCO2 and PCO2 is more complicated than the model we fit in the previous section. If you recall, we fit a model where we considered a linear `pco2_first` term: `tco2_first` = $\\beta_0 + \\beta_1 \\times$ `pco2_first`. One may wonder if including a quadratic term would fit the data better, i.e. whether:\n", "\n", "`tco2_first` = $\\beta_0 + \\beta_1 \\times$ `pco2_first` + $\\beta_2 \\times$ `pco2_first`$^2$,\n", "\n", "is a better model." ] }, { "cell_type": "markdown", "id": "408a42c0", "metadata": {}, "source": [ "Adding a quadratic term (or any other function) is quite easy using the `OLS` function. Fitting this model, and running the `summary` function for the model:" ] }, { "cell_type": "code", "execution_count": 9, "id": "ea0bf4f2", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "
OLS Regression Results
Dep. Variable: tco2_first R-squared: 0.265
Model: OLS Adj. R-squared: 0.264
Method: Least Squares F-statistic: 285.7
Date: Tue, 09 Aug 2022 Prob (F-statistic): 1.04e-106
Time: 12:04:16 Log-Likelihood: -4609.1
No. Observations: 1590 AIC: 9224.
Df Residuals: 1587 BIC: 9240.
Df Model: 2
Covariance Type: nonrobust
\n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "
coef std err t P>|t| [0.025 0.975]
Intercept 16.0916 0.771 20.862 0.000 14.579 17.605
pco2_first 0.1930 0.027 7.231 0.000 0.141 0.245
np.square(pco2_first) -3.569e-05 0.000 -0.175 0.861 -0.000 0.000
\n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "
Omnibus: 93.522 Durbin-Watson: 1.963
Prob(Omnibus): 0.000 Jarque-Bera (JB): 194.937
Skew: -0.385 Prob(JB): 4.68e-43
Kurtosis: 4.533 Cond. No. 1.94e+04


Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
[2] The condition number is large, 1.94e+04. This might indicate that there are
strong multicollinearity or other numerical problems." ], "text/plain": [ "\n", "\"\"\"\n", " OLS Regression Results \n", "==============================================================================\n", "Dep. Variable: tco2_first R-squared: 0.265\n", "Model: OLS Adj. R-squared: 0.264\n", "Method: Least Squares F-statistic: 285.7\n", "Date: Tue, 09 Aug 2022 Prob (F-statistic): 1.04e-106\n", "Time: 12:04:16 Log-Likelihood: -4609.1\n", "No. Observations: 1590 AIC: 9224.\n", "Df Residuals: 1587 BIC: 9240.\n", "Df Model: 2 \n", "Covariance Type: nonrobust \n", "=========================================================================================\n", " coef std err t P>|t| [0.025 0.975]\n", "-----------------------------------------------------------------------------------------\n", "Intercept 16.0916 0.771 20.862 0.000 14.579 17.605\n", "pco2_first 0.1930 0.027 7.231 0.000 0.141 0.245\n", "np.square(pco2_first) -3.569e-05 0.000 -0.175 0.861 -0.000 0.000\n", "==============================================================================\n", "Omnibus: 93.522 Durbin-Watson: 1.963\n", "Prob(Omnibus): 0.000 Jarque-Bera (JB): 194.937\n", "Skew: -0.385 Prob(JB): 4.68e-43\n", "Kurtosis: 4.533 Cond. No. 1.94e+04\n", "==============================================================================\n", "\n", "Notes:\n", "[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.\n", "[2] The condition number is large, 1.94e+04. This might indicate that there are\n", "strong multicollinearity or other numerical problems.\n", "\"\"\"" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "formula = \"tco2_first ~ pco2_first + np.square(pco2_first)\"\n", "\n", "o2_quad_lm = ep.tl.ols(adata, var_names, formula, missing=\"drop\")\n", "co2_quad_lm_result = o2_quad_lm.fit()\n", "co2_quad_lm_result.summary()" ] }, { "cell_type": "markdown", "id": "44a6bec8", "metadata": {}, "source": [ "Looking first at the coefficients estimates, we see the best fit line is estimated as:\n", "\n", "`tco2_first` = 16.09 + 0.19 $\\times$ `pco2_first` + 0.00004 $\\times$ `pco2_first`$^2$.\n" ] }, { "cell_type": "markdown", "id": "13aab529", "metadata": {}, "source": [ "We can add both best fit lines to the former scattered points." ] }, { "cell_type": "code", "execution_count": 10, "id": "baf67f71", "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "ep.pl.ols(\n", " adata,\n", " x=\"pco2_first\",\n", " y=\"tco2_first\",\n", " ols_results=[co2_lm_result, co2_quad_lm_result],\n", " ols_color=[\"red\", \"blue\"],\n", " xlabel=\"PCO2\",\n", " ylabel=\"TCO2\",\n", " show=True,\n", ")" ] }, { "cell_type": "markdown", "id": "443ce7eb", "metadata": {}, "source": [ "Figure Scatterplot of PCO2 (x-axis) and TCO2 (y-axis) along with linear regression estimates from the quadratic model (co2_quad_lm) and linear only model (co2_lm)" ] }, { "cell_type": "markdown", "id": "75c15fac", "metadata": {}, "source": [ "And one can see that the red (linear term only) and blue (linear and quadratic terms) fits are nearly identical. This corresponds with the relatively small coefficient estimate for the `(pco2_first^2)` term. The p-value for this coefficient is about 0.86, and at the 0.05 significance level we would likely conclude that a quadratic term is not necessary in our model to fit the data, as the linear term only model fits the data nearly as well." ] }, { "cell_type": "markdown", "id": "4d83a8b2", "metadata": {}, "source": [ "#### Statistical Interactions and Testing Nested Models" ] }, { "cell_type": "markdown", "id": "4a7024e1", "metadata": {}, "source": [ "We can also consider additional features in our model. For this, we can start with e.g. gender as a covariate, but no interaction. We can do this by simply adding the variable `gender_num` to the previous formula for our `co2_lm` model fit." ] }, { "cell_type": "code", "execution_count": 11, "id": "d867ac3d", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "
OLS Regression Results
Dep. Variable: tco2_first R-squared: 0.265
Model: OLS Adj. R-squared: 0.264
Method: Least Squares F-statistic: 286.1
Date: Tue, 09 Aug 2022 Prob (F-statistic): 7.60e-107
Time: 12:04:17 Log-Likelihood: -4608.7
No. Observations: 1590 AIC: 9223.
Df Residuals: 1587 BIC: 9240.
Df Model: 2
Covariance Type: nonrobust
\n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "
coef std err t P>|t| [0.025 0.975]
Intercept 16.3044 0.378 43.166 0.000 15.564 17.045
pco2_first 0.1889 0.008 23.922 0.000 0.173 0.204
gender_num -0.1817 0.224 -0.812 0.417 -0.621 0.257
\n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "
Omnibus: 94.658 Durbin-Watson: 1.964
Prob(Omnibus): 0.000 Jarque-Bera (JB): 194.982
Skew: -0.394 Prob(JB): 4.57e-43
Kurtosis: 4.524 Cond. No. 160.


Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified." ], "text/plain": [ "\n", "\"\"\"\n", " OLS Regression Results \n", "==============================================================================\n", "Dep. Variable: tco2_first R-squared: 0.265\n", "Model: OLS Adj. R-squared: 0.264\n", "Method: Least Squares F-statistic: 286.1\n", "Date: Tue, 09 Aug 2022 Prob (F-statistic): 7.60e-107\n", "Time: 12:04:17 Log-Likelihood: -4608.7\n", "No. Observations: 1590 AIC: 9223.\n", "Df Residuals: 1587 BIC: 9240.\n", "Df Model: 2 \n", "Covariance Type: nonrobust \n", "==============================================================================\n", " coef std err t P>|t| [0.025 0.975]\n", "------------------------------------------------------------------------------\n", "Intercept 16.3044 0.378 43.166 0.000 15.564 17.045\n", "pco2_first 0.1889 0.008 23.922 0.000 0.173 0.204\n", "gender_num -0.1817 0.224 -0.812 0.417 -0.621 0.257\n", "==============================================================================\n", "Omnibus: 94.658 Durbin-Watson: 1.964\n", "Prob(Omnibus): 0.000 Jarque-Bera (JB): 194.982\n", "Skew: -0.394 Prob(JB): 4.57e-43\n", "Kurtosis: 4.524 Cond. No. 160.\n", "==============================================================================\n", "\n", "Notes:\n", "[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.\n", "\"\"\"" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "formula = \"tco2_first ~ pco2_first + gender_num\"\n", "var_names = [\"tco2_first\", \"pco2_first\", \"gender_num\"]\n", "co2_gender_lm = ep.tl.ols(adata, var_names, formula, missing=\"drop\")\n", "co2_gender_lm_result = co2_gender_lm.fit()\n", "co2_gender_lm_result.summary()" ] }, { "cell_type": "markdown", "id": "8eeb520f", "metadata": {}, "source": [ "This output is very similar to what we had before, but now there's a `gender_num` term as well. The `1` is present in the first column after `gender_num`, and it tells us who this coefficient is relevant to (subjects with `1` for the `gender_num` -- men). This is always relative to the baseline group, and in this case this is women. The estimate is negative, meaning that the line fit for males will be below the line for females. Plotting this fit curve:" ] }, { "cell_type": "code", "execution_count": 12, "id": "0bad1e7d", "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# s stands for slope of the line, i stands for intercept of the line\n", "s_female = co2_gender_lm_result.params[1]\n", "i_female = co2_gender_lm_result.params[0]\n", "s_male = co2_gender_lm_result.params[1]\n", "i_male = co2_gender_lm_result.params[0] + co2_gender_lm_result.params[2]\n", "ep.pl.ols(\n", " lines=[(s_female, i_female), (s_male, i_male)],\n", " lines_color=[\"k\", \"r\"],\n", " lines_label=[\"Female\", \"Male\"],\n", " xlabel=\"PCO2\",\n", " ylabel=\"TCO2\",\n", " xlim=(0, 40),\n", " ylim=(15, 25),\n", " show=True,\n", ")" ] }, { "cell_type": "markdown", "id": "767dd36e", "metadata": {}, "source": [ "We see that the lines are parallel, but almost indistinguishable. In fact, this plot has been cropped in order to see any difference at all. From the estimate from the `summary` output above, the difference between the two lines is -0.182 mmol/L, which is quite small, so perhaps this isn't too surprising. We can also see in the above `summary` output that the p-value is about 0.42, and we would likely *not* reject the null hypothesis that the true value of the `gender_num` coefficient is zero." ] }, { "cell_type": "markdown", "id": "41b6181f", "metadata": {}, "source": [ "Next, we can explore our model with an interaction between `pco2_first` and `gender_num`. To add an interaction between two variables use the `*` operator within a model formula. By default, `Python` will add all of the main effects (variables contained in the interaction) to the model as well, so simply adding `pco2_first*gender_num` will add effects for `pco2_first` and `gender_num` in addition to the interaction between them to the model fit.\n" ] }, { "cell_type": "code", "execution_count": 13, "id": "e498860e", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "
OLS Regression Results
Dep. Variable: tco2_first R-squared: 0.266
Model: OLS Adj. R-squared: 0.265
Method: Least Squares F-statistic: 191.6
Date: Tue, 09 Aug 2022 Prob (F-statistic): 5.09e-106
Time: 12:04:17 Log-Likelihood: -4607.7
No. Observations: 1590 AIC: 9223.
Df Residuals: 1586 BIC: 9245.
Df Model: 3
Covariance Type: nonrobust
\n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "
coef std err t P>|t| [0.025 0.975]
Intercept 15.8544 0.489 32.443 0.000 14.896 16.813
pco2_first 0.1994 0.011 18.585 0.000 0.178 0.220
gender_num 0.8144 0.722 1.128 0.260 -0.602 2.231
pco2_first:gender_num -0.0230 0.016 -1.450 0.147 -0.054 0.008
\n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "
Omnibus: 97.108 Durbin-Watson: 1.964
Prob(Omnibus): 0.000 Jarque-Bera (JB): 200.324
Skew: -0.403 Prob(JB): 3.16e-44
Kurtosis: 4.541 Cond. No. 399.


Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified." ], "text/plain": [ "\n", "\"\"\"\n", " OLS Regression Results \n", "==============================================================================\n", "Dep. Variable: tco2_first R-squared: 0.266\n", "Model: OLS Adj. R-squared: 0.265\n", "Method: Least Squares F-statistic: 191.6\n", "Date: Tue, 09 Aug 2022 Prob (F-statistic): 5.09e-106\n", "Time: 12:04:17 Log-Likelihood: -4607.7\n", "No. Observations: 1590 AIC: 9223.\n", "Df Residuals: 1586 BIC: 9245.\n", "Df Model: 3 \n", "Covariance Type: nonrobust \n", "=========================================================================================\n", " coef std err t P>|t| [0.025 0.975]\n", "-----------------------------------------------------------------------------------------\n", "Intercept 15.8544 0.489 32.443 0.000 14.896 16.813\n", "pco2_first 0.1994 0.011 18.585 0.000 0.178 0.220\n", "gender_num 0.8144 0.722 1.128 0.260 -0.602 2.231\n", "pco2_first:gender_num -0.0230 0.016 -1.450 0.147 -0.054 0.008\n", "==============================================================================\n", "Omnibus: 97.108 Durbin-Watson: 1.964\n", "Prob(Omnibus): 0.000 Jarque-Bera (JB): 200.324\n", "Skew: -0.403 Prob(JB): 3.16e-44\n", "Kurtosis: 4.541 Cond. No. 399.\n", "==============================================================================\n", "\n", "Notes:\n", "[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.\n", "\"\"\"" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "formula = \"tco2_first ~ pco2_first * gender_num\"\n", "var_names = [\"tco2_first\", \"pco2_first\", \"gender_num\"]\n", "\n", "co2_gender_interaction_lm = ep.tl.ols(adata, var_names, formula, missing=\"drop\")\n", "co2_gender_interaction_lm_result = co2_gender_interaction_lm.fit()\n", "co2_gender_interaction_lm_result.summary()" ] }, { "cell_type": "markdown", "id": "07b0ee86", "metadata": {}, "source": [ "The estimated coefficients are $\\hat{\\beta}_0, \\hat{\\beta}_1, \\hat{\\beta}_2$ and $\\hat{\\beta}_3$, respectively, and we can determine the best fit lines for men:\n", "\n", "\n", "`tco2_first` = $(15.85 + 0.81)$ + $(0.20 - 0.023)$ $\\times$ `pco2_first` = $16.67$ + $0.18$ $\\times$ `pco2_first`,\n", "\n", "and for women:\n", "\n", "`tco2_first` = $15.85$ + $0.20$ $\\times$ `pco2_first`.\n", "\n", "Based on this, the men's intercept should be higher, but their slope should be not as steep, relative to the women. Let's check this and add the new model fits as dotted lines and add a legend to the above figure.\n" ] }, { "cell_type": "code", "execution_count": 14, "id": "10e22ae3", "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# s stands for slope of the line, i stands for intercept of the line\n", "s_female_interaction = co2_gender_interaction_lm_result.params[1]\n", "i_female_interaction = co2_gender_interaction_lm_result.params[0]\n", "s_male_interaction = (\n", " co2_gender_interaction_lm_result.params[1]\n", " + co2_gender_interaction_lm_result.params[3]\n", ")\n", "i_male_interaction = (\n", " co2_gender_interaction_lm_result.params[0]\n", " + co2_gender_interaction_lm_result.params[2]\n", ")\n", "\n", "lines = [\n", " (s_female, i_female),\n", " (s_male, i_male),\n", " (s_female_interaction, i_female_interaction),\n", " (s_male_interaction, i_male_interaction),\n", "]\n", "lines_color = [\"k\", \"r\", \"k\", \"r\"]\n", "lines_style = [\"-\", \"-\", \":\", \":\"]\n", "lines_label = [\n", " \"Female\",\n", " \"Male\",\n", " \"Female (Interaction Model)\",\n", " \"Male (Interaction Model)\",\n", "]\n", "ep.pl.ols(\n", " lines=lines,\n", " lines_color=lines_color,\n", " lines_style=lines_style,\n", " lines_label=lines_label,\n", " xlabel=\"PCO2\",\n", " ylabel=\"TCO2\",\n", " xlim=(0, 40),\n", " ylim=(15, 25),\n", " show=True,\n", ")" ] }, { "cell_type": "markdown", "id": "b6314674", "metadata": {}, "source": [ "Regression fits of PCO2 on TCO2 with gender (black female; red male; solid no interaction; dotted with interaction). Note both axes are cropped for illustration purposes" ] }, { "cell_type": "markdown", "id": "381b9481", "metadata": {}, "source": [ "We can see that the fits generated from this plot are a little different than the one generated for a model without the interaction. The biggest difference is that the dotted lines are no longer parallel. This has some serious implications, particularly when it comes to interpreting our result. First note that the estimated coefficient for the `gender_num` variable is now positive. This means that at `pco2_first=0`, men (red) have higher `tco2_first` levels than women (black). If you recall in the previous model fit, women had higher levels of `tco2_first` at all levels of `pco2_first`. At some point around `pco2_first=35` this changes and women (black) have higher `tco2_first` levels than men (red). This means that the effect of `gender_num` *may* vary as you change the level of `pco2_first`, and is why interactions are often referred to as effect modification in the epidemiological literature. The effect need not change signs (i.e., the lines do not need to cross) over the observed range of values for an interaction to be present.\n", "\n", "The question remains, is the variable `gender_num` important? We looked at this briefly when we examined the `t value` column in the no interaction model which included `gender_num`. What if we wanted to test (simultaneously) the null hypothesis: $\\beta_2$ *and* $\\beta_3=0$ There is a useful test known as the F-test which can help us in this exact scenario where we want to look at if we should use a larger model (more covariates) or use a smaller model (fewer covariates). The F-test applies only to *nested models* -- the larger model *must* contain each covariate that is used in the smaller model, and the smaller model *cannot* contain covariates which are not in the larger model. The interaction model and the model with gender are nested models since all the covariates in the model with gender are also in the larger interaction model. An example of a non-nested model would be the quadratic model and the interaction model: the smaller (quadratic) model has a term (`pco2_first`$^2$) which is not in the larger (interaction) model. An F-test would not be appropriate for this latter case.\n", "\n", "To perform an F-test, first fit the two models you wish to consider, and then run the `anova_lm` command passing the two model objects.\n", "\n" ] }, { "cell_type": "code", "execution_count": 15, "id": "4ab389ae", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
df_residssrdf_diffss_diffFPr(>F)
01588.030674.4313820.0NaNNaNNaN
11586.030621.0828042.053.3485781.3815780.251484
\n", "
" ], "text/plain": [ " df_resid ssr df_diff ss_diff F Pr(>F)\n", "0 1588.0 30674.431382 0.0 NaN NaN NaN\n", "1 1586.0 30621.082804 2.0 53.348578 1.381578 0.251484" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "anova_lm(co2_lm_result, co2_gender_interaction_lm_result)" ] }, { "cell_type": "markdown", "id": "0bc66237", "metadata": {}, "source": [ "As you can see, the `anova_lm` command first lists the models it is considering. Much of the rest of the information is beyond the scope of this chapter, but we will highlight the reported F-test p-value (`Pr(>F)`), which in this case is 0.2515. In nested models, the null hypothesis is that all coefficients in the larger model and not in the smaller model are zero. In the case we are testing, our null hypothesis is $\\beta_2$ *and* $\\beta_3=0$. Since the p-value exceeds the typically used significance level ($\\alpha=0.05$), we would not reject the null hypothesis, and likely say the smaller model explains the data just as well as the larger model. If these were the only models we were considering, we would use the smaller model as our final model and report the final model in our results. We will now discuss what exactly you should report and how you can interpret the results." ] }, { "cell_type": "markdown", "id": "1280d993", "metadata": {}, "source": [ "### Reporting and Interpreting Linear Regression" ] }, { "cell_type": "markdown", "id": "a4a3e3d5", "metadata": {}, "source": [ "Confidence and Prediction Intervals\n", "\n", "As mentioned above, one method to quantify the uncertainty around coefficient estimates is by reporting the standard error. Another commonly used method is to report a confidence interval, most commonly a 95\\% confidence interval. A 95\\% confidence interval for $\\beta$ is an interval for which if the data were collected repeatedly, about 95\\% of the *intervals* would contain the *true value* of the parameter, $\\beta$, assuming the modeling assumptions are correct.\n", "\n", "To get 95\\% confidence intervals of coefficients, `Python` has a `confint` function, which you pass an `lm` object to. It will then output 2.5\\% and 97.5\\% confidence interval limits for each coefficient.\n" ] }, { "cell_type": "code", "execution_count": 16, "id": "4078d57f", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
01
Intercept15.50536916.916349
pco2_first0.1731030.204040
\n", "
" ], "text/plain": [ " 0 1\n", "Intercept 15.505369 16.916349\n", "pco2_first 0.173103 0.204040" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "co2_lm_result.conf_int()" ] }, { "cell_type": "markdown", "id": "4c138abc", "metadata": {}, "source": [ "The 95\\% confidence interval for `pco2_first` is about 0.17-0.20, which may be slightly more informative than reporting the standard error. Often people will look at if the confidence interval includes zero (no effect). Since it does not, and in fact since the interval is quite narrow and not very close to zero, this provides some additional evidence of its importance. There is a well known link between hypothesis testing and confidence intervals which we will not get into detail here." ] }, { "cell_type": "markdown", "id": "eb7d5656", "metadata": {}, "source": [ "When plotting the data with the model fit, similar to Figure 16.2, it is a good idea to include some sort of assessment of uncertainty as well. To do this in `Python`, we will first create a data frame with PCO2 levels which we would like to predict. In this case, we would like to predict the outcome (TCO2) over the range of observed covariate (PCO2) values. We do this by creating a data frame, where the variable names in the data frame must match the covariates used in the model. In our case, we have only one covariate (`pco2_first`), and we predict the outcome over the range of covariate values we observed determined by the `min` and `max` functions." ] }, { "cell_type": "code", "execution_count": 17, "id": "2d4a1566", "metadata": {}, "outputs": [], "source": [ "pco2_first = pd.DataFrame(adata[:, \"pco2_first\"].X).dropna().astype(int)\n", "data = {\"pco2_first\": [i for i in range(pco2_first.min()[0], pco2_first.max()[0])]}\n", "grid_pred = pd.DataFrame(data)" ] }, { "cell_type": "code", "execution_count": 18, "id": "2f507975", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
meanobs_ci_lowerobs_ci_upper
017.7194349.07864726.360220
117.9080059.26818626.547825
\n", "
" ], "text/plain": [ " mean obs_ci_lower obs_ci_upper\n", "0 17.719434 9.078647 26.360220\n", "1 17.908005 9.268186 26.547825" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "preds = co2_lm_result.get_prediction(grid_pred).summary_frame()[\n", " [\"mean\", \"obs_ci_lower\", \"obs_ci_upper\"]\n", "]\n", "preds[0:2]" ] }, { "cell_type": "markdown", "id": "128de6d2", "metadata": {}, "source": [ "We have printed out the first two rows of our predictions, preds, which are the model’s predictions for PCO2 at 8 and 9. We can see that our predictions (mean) are about 0.18 apart, which make sense given our estimate of the slope (0.18). We also see that our 95 % prediction intervals are very wide, spanning about 9 (obs_ci_lower) to 26 (obs_ci_upper). This indicates that, despite coming up with a model which is very statisti- cally significant, we still have a lot of uncertainty about the predictions generated from such a model. It is a good idea to capture this quality when plotting how well your model fits by adding the interval lines as dotted lines. Let’s plot our final model fit, co2.lm, along with the scatterplot and prediction interval in the figure below." ] }, { "cell_type": "code", "execution_count": 19, "id": "1f9ae924", "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "ep.pl.ols(\n", " adata,\n", " x=\"pco2_first\",\n", " y=\"tco2_first\",\n", " ols_results=[co2_lm_result],\n", " ols_color=[\"red\"],\n", " lines=[\n", " (grid_pred[\"pco2_first\"], preds[\"obs_ci_upper\"]),\n", " (grid_pred[\"pco2_first\"], preds[\"obs_ci_lower\"]),\n", " ],\n", " lines_color=[\"k\", \"k\"],\n", " lines_style=[\"--\", \"--\"],\n", " xlabel=\"PCO2\",\n", " ylabel=\"TCO2\",\n", " show=True,\n", ")" ] }, { "cell_type": "markdown", "id": "2eaf2cb4", "metadata": {}, "source": [ "Scatterplot of PCO2 (x-axis) and TCO2 (y-axis) along with linear regression estimates from the linear only model (co2_lm). The dotted line represents 95 % prediction intervals for the model" ] }, { "cell_type": "markdown", "id": "19f2299a", "metadata": {}, "source": [ "## Logistic Regression\n", "So far, we have considered how a _continuous_ variable can be modeled using our features. Another very common modelling task is the one of classification. Here, we are interested to model a _discrete_ label using our features. A very common scenario is to have a binary class label, for example whether a patient survived a 28-day observation window or not." ] }, { "cell_type": "markdown", "id": "bb180b89", "metadata": {}, "source": [ "### 2 * 2 Tables" ] }, { "cell_type": "code", "execution_count": 20, "id": "50d436a3", "metadata": {}, "outputs": [], "source": [ "var_names = [\"age\", \"day_28_flg\", \"service_unit\"]\n", "dat = pd.DataFrame(adata[:, var_names].X, columns=var_names)\n", "dat[\"age\"] = dat[\"age\"].astype(\"float\").dropna(axis=0)" ] }, { "cell_type": "markdown", "id": "abcc4ce5", "metadata": {}, "source": [ "Contingency tables are the best way to start to think about binary data. A contingency table cross-tabulates the outcome across two or more levels of a covariate. Let's begin by creating a new variable (`age.cat`) which dichotomizes `age` into two age categories: $\\le55$ and $>55$. Note, because we are making age a discrete variable, we also change the data type to a factor. This is similar to what we did for the `gender_num` variable when discussing linear regression in the previous subchapter." ] }, { "cell_type": "code", "execution_count": 21, "id": "e3d29bbd", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "<=55 923\n", ">55 853\n", "Name: age_cat, dtype: int64" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dat[\"age_cat\"] = np.where(dat[\"age\"] <= 55, \"<=55\", \">55\")\n", "dat[\"age_cat\"] = dat[\"age_cat\"].astype(\"category\")\n", "dat[\"age_cat\"].value_counts()" ] }, { "cell_type": "markdown", "id": "e9165bb3", "metadata": {}, "source": [ "We would like to see how 28 day mortality is distributed among the age categories. We can do so by constructing a contingency table, or in this case what is commonly referred to as a 2x2 table." ] }, { "cell_type": "code", "execution_count": 22, "id": "71ec4e6a", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
01
<=5588340
>55610243
\n", "
" ], "text/plain": [ " 0 1\n", "<=55 883 40\n", ">55 610 243" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "age_cat_day_28_flg = pd.crosstab(index=dat[\"age_cat\"], columns=dat[\"day_28_flg\"])\n", "age_cat_day_28_flg.columns = [\"0\", \"1\"]\n", "age_cat_day_28_flg.index = [\"<=55\", \">55\"]\n", "age_cat_day_28_flg" ] }, { "cell_type": "markdown", "id": "f97cccf5", "metadata": {}, "source": [ "Now let us look at a slightly different case -- when the covariate takes on more than two values. Such a variable is the `service_unit`. Let's see how the deaths are distributed among the different units:" ] }, { "cell_type": "code", "execution_count": 23, "id": "b5c9a6b5", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
01
FICU593
MICU605127
SICU829153
\n", "
" ], "text/plain": [ " 0 1\n", "FICU 59 3\n", "MICU 605 127\n", "SICU 829 153" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "deathbyservice = pd.crosstab(index=dat[\"service_unit\"], columns=dat[\"day_28_flg\"])\n", "deathbyservice.columns = [\"0\", \"1\"]\n", "deathbyservice.index = [\"FICU\", \"MICU\", \"SICU\"]\n", "deathbyservice" ] }, { "cell_type": "markdown", "id": "a1f1c652", "metadata": {}, "source": [ "we can get frequencies of these service units by applying the `prop.table` function to our cross-tabulated table." ] }, { "cell_type": "code", "execution_count": 24, "id": "c43a435a", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
01
FICU0.9516130.048387
MICU0.8265030.173497
SICU0.8441960.155804
\n", "
" ], "text/plain": [ " 0 1\n", "FICU 0.951613 0.048387\n", "MICU 0.826503 0.173497\n", "SICU 0.844196 0.155804" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "deathbyservice.div(deathbyservice[\"0\"] + deathbyservice[\"1\"], axis=0)" ] }, { "cell_type": "markdown", "id": "27ba200f", "metadata": {}, "source": [ "It appears as though the `FICU` may have a lower rate of death than either the `MICU` or `SICU`. To compute an odds ratios, first compute the odds:\n" ] }, { "cell_type": "code", "execution_count": 25, "id": "662a6bb4", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "FICU 0.050847\n", "MICU 0.209917\n", "SICU 0.184560\n", "dtype: float64" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "deathbyservice[\"1\"].div(deathbyservice[\"0\"], axis=0)" ] }, { "cell_type": "markdown", "id": "df251fad", "metadata": {}, "source": [ "And then we need to pick which of `FICU`, `MICU` or `SICU` will serve as the reference or baseline group. This is the group which the other two groups will be compared to. Again the choice is arbitrary, but should be dictated by the study objective. If this were a clinical trial with two drug arms and a placebo arm, it would be foolish to use one of the treatments as the reference group, particularly if you wanted to compare the efficacy of the treatments. In this particular case, there is no clear reference group, but since the FICU is so much smaller than the other two units, we will use it as the reference group. Computing the odds ratio for MICU and SICU we get 4.13 and 3.63, respectively. These are also very strong associations, meaning that the odds of dying in the SICU and MICU are around 4 times higher than in the FICU, but relatively similar.\n", "\n", "Contingency tables and 2x2 tables in particular are the building blocks of working with binary data, and it's often a good way to begin looking at the data." ] }, { "cell_type": "markdown", "id": "df860924", "metadata": {}, "source": [ "### Introducing Logistic Regression" ] }, { "cell_type": "markdown", "id": "078cf641", "metadata": {}, "source": [ "Let's fit this model, and see how this works using a real example. We fit logistic regression very similarly to how we fit linear regression models, with a few exceptions. First, we will use a new function called `glm`, which allows one to fit a class of models known as generalized linear models or GLMs. The `glm` function works in much the same way the `lm` function does. We need to specify a formula of the form: `outcome ~ covariates`, specify what dataset to use (in our case the `dat` data frame), and then specify the family. For logistic regression `family='binomial'` will be our choice. You can run the `summary` function, just like you did for `lm` and it produces output very similar to what `lm` did.\n" ] }, { "cell_type": "code", "execution_count": 26, "id": "01e25f8b", "metadata": {}, "outputs": [], "source": [ "dat[\"day_28_flg\"] = np.where(dat[\"day_28_flg\"] == 0, 1, 0)" ] }, { "cell_type": "code", "execution_count": 27, "id": "92f22537", "metadata": {}, "outputs": [], "source": [ "adata_new = ep.ad.df_to_anndata(dat)" ] }, { "cell_type": "code", "execution_count": 28, "id": "d53e3a07", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " Generalized Linear Model Regression Results \n", "==============================================================================================\n", "Dep. Variable: ['day_28_flg[0]', 'day_28_flg[1]'] No. Observations: 1776\n", "Model: GLM Df Residuals: 1774\n", "Model Family: Binomial Df Model: 1\n", "Link Function: Logit Scale: 1.0000\n", "Method: IRLS Log-Likelihood: -674.34\n", "Date: Tue, 09 Aug 2022 Deviance: 1348.7\n", "Time: 12:04:20 Pearson chi2: 1.78e+03\n", "No. Iterations: 6 Pseudo R-squ. (CS): 0.1111\n", "Covariance Type: nonrobust \n", "==================================================================================\n", " coef std err z P>|z| [0.025 0.975]\n", "----------------------------------------------------------------------------------\n", "Intercept -3.0944 0.162 -19.142 0.000 -3.411 -2.778\n", "age_cat[T.>55] 2.1740 0.179 12.175 0.000 1.824 2.524\n", "==================================================================================\n" ] } ], "source": [ "formula = \"day_28_flg ~ age_cat\"\n", "var_names = [\"day_28_flg\", \"age_cat\"]\n", "\n", "age_glm = ep.tl.glm(adata_new, var_names, formula, family=\"Binomial\", missing=\"drop\")\n", "age_glm_result = age_glm.fit()\n", "print(age_glm_result.summary())" ] }, { "cell_type": "markdown", "id": "0ced2f21", "metadata": {}, "source": [ "As you can see, we get a coefficients table that is similar to the `lm` table we used earlier. Instead of a `t value`, we get a `z value`, but this can be interpreted similarly. The rightmost column is a p-value, for testing the null hypothesis $\\beta=0$. If you recall, the non-intercept coefficients are log-odds ratios, so testing if they are zero is equivalent to testing if the odds ratios are one. If an odds ratio is one the odds are equal in the numerator group and denominator group, indicating the probabilities of the outcome are equal in each group. So, assessing if the coefficients are zero will be an important aspect of doing this type of analysis." ] }, { "cell_type": "markdown", "id": "80414830", "metadata": {}, "source": [ "#### Beyond a Single Binary Covariate" ] }, { "cell_type": "markdown", "id": "eb0bb1a4", "metadata": {}, "source": [ "While the above analysis is useful for illustration, it does not readily demonstrate anything we could not do with our 2x2 table example above. Logistic regression allows us to extend the basic idea to at least two very relevant areas. The first is the case where we have more than one covariate of interest. Perhaps we have a confounder we are concerned about, and want to adjust for it. Alternatively, maybe there are two covariates of interest. Secondly, it allows use to use covariates as continuous quantities, instead of discretizing them into categories. For example, instead of dividing age up into exhaustive strata (as we did very simply by just dividing the patients into two groups, $\\le55$ and $>55$ ), we could instead use age as a continuous covariate.\n", "\n", "First, having more than one covariate is simple. For example, if we wanted to add `service_unit` to our previous model, we could just add it as we did when using the `lm` function for linear regression. Here we specify `day_28_flg ~ age.cat + service_unit` and run the `summary` function." ] }, { "cell_type": "code", "execution_count": 29, "id": "d16bb7cc", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " Generalized Linear Model Regression Results \n", "==============================================================================================\n", "Dep. Variable: ['day_28_flg[0]', 'day_28_flg[1]'] No. Observations: 1776\n", "Model: GLM Df Residuals: 1772\n", "Model Family: Binomial Df Model: 3\n", "Link Function: Logit Scale: 1.0000\n", "Method: IRLS Log-Likelihood: -671.87\n", "Date: Tue, 09 Aug 2022 Deviance: 1343.7\n", "Time: 12:04:20 Pearson chi2: 1.74e+03\n", "No. Iterations: 6 Pseudo R-squ. (CS): 0.1136\n", "Covariance Type: nonrobust \n", "========================================================================================\n", " coef std err z P>|z| [0.025 0.975]\n", "----------------------------------------------------------------------------------------\n", "Intercept -4.2090 0.623 -6.761 0.000 -5.429 -2.989\n", "age_cat[T.>55] 2.1611 0.179 12.088 0.000 1.811 2.512\n", "service_unit[T.MICU] 1.1789 0.615 1.915 0.055 -0.027 2.385\n", "service_unit[T.SICU] 1.1234 0.614 1.830 0.067 -0.080 2.326\n", "========================================================================================\n" ] } ], "source": [ "formula = \"day_28_flg ~ age_cat + service_unit\"\n", "var_names = [\"day_28_flg\", \"age_cat\", \"service_unit\"]\n", "\n", "ageunit_glm = ep.tl.glm(\n", " adata_new, var_names, formula, family=\"Binomial\", missing=\"drop\"\n", ")\n", "ageunit_glm_result = ageunit_glm.fit()\n", "print(ageunit_glm_result.summary())" ] }, { "cell_type": "markdown", "id": "67e140ed", "metadata": {}, "source": [ "A coefficient table is produced, and now we have four estimated coefficients. The same two, `(Intercept)` and `age_cat[T.>55]` which were estimated in the unadjusted model, but also we have `service_unit[T.MICU]` and `service_unit[T.SICU]` which correspond to the log odds ratios for the MICU and SICU relative to the FICU. Taking the exponential of these will result in an odds ratio for each variable, adjusted for the other variables in the model. In this case the adjusted odds ratios for Age>55, MICU and SICU are 8.68, 3.25, and 3.08, respectively. We would conclude that there is an almost 9-fold increase in the odds of 28 day mortality for those in the $>55$ year age group relative to the younger $\\le55$ group while holding service unit constant. This adjustment becomes important in many scenarios where groups of patients may be more or less likely to receive treatment, but also more or less likely to have better outcomes, where one effect is confounded by possibly many others. Such is almost always the case with observational data, and this is why logistic regression is such a powerful data analysis tool in this setting.\n", "\n", "Another case we would like to be able to deal with is when we have a continuous covariate we would like to include in the model. One can always break the continuous covariate into mutually exclusive categories by selecting break or cut points, but selecting the number and location of these points can be arbitrary, and in many cases unnecessary or inefficient. Recall that in logistic regression we are fitting a model:\n", "\n", "\n", "$logit(p_x) = log(Odds_x) = log(\\frac{p_x}{1-p_x}) = \\beta_0 + \\beta_1 \\times x$,\n", "\n", "\n", "but now assume $x$ is continuous. Imagine a hypothetical scenario where you know $\\beta_0$ and $\\beta_1$ and have a group of 50 year olds, and a group of 51 year olds. The difference in the log Odds between the two groups is:\n", "\n", "\n", "$log(Odds_{51}) -log(Odds_{50}) = (\\beta_0 + \\beta_1 \\times 51) - (\\beta_0 + \\beta_1 \\times 50) = \\beta_1(51-50) = \\beta_1$.\n", "\n", "Hence, the odds ratio for 51 year olds versus 50 year olds is $\\exp{(\\beta_1)}$. This is actually true for any group of patients which are 1 year apart, and this gives a useful way to interpret and use these estimated coefficients for continuous covariates. Let's work with an example. Again fitting the 28 day mortality outcome as a function of age, but treating age as it was originally recorded in the dataset, a continuous variable called `age`." ] }, { "cell_type": "code", "execution_count": 30, "id": "ca2d894c", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " Generalized Linear Model Regression Results \n", "==============================================================================================\n", "Dep. Variable: ['day_28_flg[0]', 'day_28_flg[1]'] No. Observations: 1776\n", "Model: GLM Df Residuals: 1774\n", "Model Family: Binomial Df Model: 1\n", "Link Function: Logit Scale: 1.0000\n", "Method: IRLS Log-Likelihood: -625.49\n", "Date: Tue, 09 Aug 2022 Deviance: 1251.0\n", "Time: 12:04:20 Pearson chi2: 1.81e+03\n", "No. Iterations: 6 Pseudo R-squ. (CS): 0.1587\n", "Covariance Type: nonrobust \n", "==============================================================================\n", " coef std err z P>|z| [0.025 0.975]\n", "------------------------------------------------------------------------------\n", "Intercept -5.7780 0.321 -18.013 0.000 -6.407 -5.149\n", "age 0.0652 0.004 14.595 0.000 0.056 0.074\n", "==============================================================================\n" ] } ], "source": [ "formula = \"day_28_flg ~ age\"\n", "var_names = [\"day_28_flg\", \"age\"]\n", "agects_glm = ep.tl.glm(\n", " adata_new,\n", " var_names,\n", " formula,\n", " family=\"Binomial\",\n", " missing=\"drop\",\n", " as_continuous=[\"age\"],\n", ")\n", "agects_glm_result = agects_glm.fit()\n", "print(agects_glm_result.summary())" ] }, { "cell_type": "markdown", "id": "b5120994", "metadata": {}, "source": [ "We see the estimated coefficient is 0.07 and still very statistically significant. Exponentiating the log odds ratio for age, we get an estimated odds ratio of 1.07, which is per 1 year increase in age. What if the age difference of interest is ten years instead of one year? There are at least two ways of doing this. One is to replace `age` with `I(age/10)`, which uses a new covariate which is `age` divided by ten. The second is to use the `agects.glm` estimated log odds ratio, and multiple by ten prior to exponentiating. They will yield equivalent estimates of 1.92, but it is now per 10 year increases in age. This is useful when the estimated odds ratios (or log odds ratios) are close to one (or zero). When this is done, one unit of the covariate is 10 years, so the generic interpretation of the coefficients remains the same, but the units (per 10 years instead of per 1 year) changes.\n", "\n", "This of course assumes that the form of our equation relating the log odds of the outcome to the covariate is correct. In cases where odds of the outcome decreases and increases as a function of the covariate, it is possible to estimate a relatively small effect of the linear covariate, when the outcome may be strongly affected by the covariate, but not in the way the model is specified. Assessing the linearity of the log odds of the outcome and some discretized form of the covariate can be done graphically. For instance, we can break age into 5 groups, and estimate the log odds of 28 day mortality in each group." ] }, { "cell_type": "markdown", "id": "47037805", "metadata": {}, "source": [ "### Hypothesis Testing and Model Selection" ] }, { "cell_type": "markdown", "id": "a6361a01", "metadata": {}, "source": [ "As was the case when using `lm`, we first fit the two competing models, a larger (alternative model), and a smaller (null model). Provided that the models are nested, our larger model is the one which contained `service_unit` and `age.cat`, and the smaller only contains `age.cat`, so they are nested. We are then testing if the log odds ratios for the two coefficients associated with `service_unit` are zero. Let's call these coefficients $\\beta_{MICU}$ and $\\beta_{SICU}$. To test if $\\beta_{MICU}$ and $\\beta_{SICU} = 0$, we can perform the following test:\n" ] }, { "cell_type": "code", "execution_count": 31, "id": "d4220ae6", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ModelformulaDf Resid.Dev.Df_diffPr(>Chi)
01day_28_flg ~ age17741348.676905NaNNaN
12day_28_flg ~ age + service_unit17721343.7454162.00.085237
\n", "
" ], "text/plain": [ " Model formula Df Resid. Dev. Df_diff \\\n", "0 1 day_28_flg ~ age 1774 1348.676905 NaN \n", "1 2 day_28_flg ~ age + service_unit 1772 1343.745416 2.0 \n", "\n", " Pr(>Chi) \n", "0 NaN \n", "1 0.085237 " ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ep.tl.anova_glm(\n", " age_glm_result,\n", " ageunit_glm_result,\n", " \"day_28_flg ~ age\",\n", " \"day_28_flg ~ age + service_unit\",\n", ")" ] }, { "cell_type": "markdown", "id": "14b7e397", "metadata": {}, "source": [ "A couple good practices to get in a habit are to first make sure the two competing models are correctly specified. Here we are are testing `~ age.cat` versus `age.cat + service_unit`. Next, the difference between the residual degrees of freedom (`Resid. Df`) in the two models tell us how many more parameters the larger model has when compared to the smaller model. Here we see `1774 - 1772 = 2` which means that there are two more coefficients estimated in the larger model than the smaller one, which corresponds with the output from the `summary` table above. Next looking at the p-value (`Pr(>Chi)`), we see a test for $\\beta_{MICU}$ and $\\beta_{SICU} = 0$ has a p-value of around 0.08. At the typical 0.05 significance level, we would not reject the null, and use the simpler model without the service unit. In logistic regression, this is a common way of testing whether a categorical covariate should be retained in the model, as it can be difficult to assess using the `z value` in the `summary` table, particularly when one is very statistically significant, and one is not." ] }, { "cell_type": "markdown", "id": "52486768", "metadata": {}, "source": [ "### Confidence Intervals" ] }, { "cell_type": "markdown", "id": "759ae2de", "metadata": {}, "source": [ "Generating confidence intervals for either the log-odds ratios or the odds ratios are relatively straightforward. To get the log-odds ratios and respective confidence intervals for the `ageunit_glm` model which includes both age and service unit:" ] }, { "cell_type": "code", "execution_count": 32, "id": "f44164f7", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Intercept -4.209014\n", "age_cat[T.>55] 2.161142\n", "service_unit[T.MICU] 1.178866\n", "service_unit[T.SICU] 1.123443\n", "dtype: float64" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ageunit_glm_result.params" ] }, { "cell_type": "code", "execution_count": 33, "id": "eb4e3804", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
01
Intercept-5.429257-2.988771
age_cat[T.>55]1.8107332.511552
service_unit[T.MICU]-0.0274522.385184
service_unit[T.SICU]-0.0796112.326497
\n", "
" ], "text/plain": [ " 0 1\n", "Intercept -5.429257 -2.988771\n", "age_cat[T.>55] 1.810733 2.511552\n", "service_unit[T.MICU] -0.027452 2.385184\n", "service_unit[T.SICU] -0.079611 2.326497" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ageunit_glm_result.conf_int(alpha=0.05)" ] }, { "cell_type": "markdown", "id": "089cef49", "metadata": {}, "source": [ "Here the coefficient estimates and confidence intervals are presented in much the same way as for a linear regression. In logistic regression, it is often convenient to exponentiate these quantities to get it on a more interpretable scale." ] }, { "cell_type": "code", "execution_count": 34, "id": "13f46ac9", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Intercept 0.014861\n", "age_cat[T.>55] 8.681049\n", "service_unit[T.MICU] 3.250686\n", "service_unit[T.SICU] 3.075425\n", "dtype: float64" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.exp(ageunit_glm_result.params)" ] }, { "cell_type": "code", "execution_count": 35, "id": "e5ae8a60", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
01
Intercept0.0036810.059992
age_cat[T.>55]5.81485712.960011
service_unit[T.MICU]0.81818112.915179
service_unit[T.SICU]0.77696412.173333
\n", "
" ], "text/plain": [ " 0 1\n", "Intercept 0.003681 0.059992\n", "age_cat[T.>55] 5.814857 12.960011\n", "service_unit[T.MICU] 0.818181 12.915179\n", "service_unit[T.SICU] 0.776964 12.173333" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.exp(ageunit_glm_result.conf_int(alpha=0.025))" ] }, { "cell_type": "markdown", "id": "4774540e", "metadata": {}, "source": [ "Similar to linear regression, we will check whether the confidence intervals for the log odds ratios include zero. This is equivalent to seeing if the intervals for the odds ratios include 1. Since the odds ratios are more directly interpretable it is often more convenient to report them instead of the coefficients on the log odds ratio scale." ] }, { "cell_type": "markdown", "id": "55fac1de", "metadata": {}, "source": [ "### Prediction" ] }, { "cell_type": "markdown", "id": "85064f03", "metadata": {}, "source": [ "Let's first create a new data frame called `newdat` which computes all combinations of the values of variables passed to it." ] }, { "cell_type": "code", "execution_count": 36, "id": "1bae70f7", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
age_catservice_unit
0<=55FICU
1<=55MICU
2<=55SICU
3>55FICU
4>55MICU
5>55SICU
\n", "
" ], "text/plain": [ " age_cat service_unit\n", "0 <=55 FICU\n", "1 <=55 MICU\n", "2 <=55 SICU\n", "3 >55 FICU\n", "4 >55 MICU\n", "5 >55 SICU" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "def expand_grid(dictionary):\n", " return pd.DataFrame(\n", " [row for row in product(*dictionary.values())], columns=dictionary.keys()\n", " )\n", "\n", "\n", "dictionary = {\"age_cat\": [\"<=55\", \">55\"], \"service_unit\": [\"FICU\", \"MICU\", \"SICU\"]}\n", "\n", "newdat = expand_grid(dictionary)\n", "newdat" ] }, { "cell_type": "code", "execution_count": 37, "id": "2113471e", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
age_catservice_unitpred
0<=55FICU0.014643
1<=55MICU0.046082
2<=55SICU0.043706
3>55FICU0.114268
4>55MICU0.295461
5>55SICU0.284056
\n", "
" ], "text/plain": [ " age_cat service_unit pred\n", "0 <=55 FICU 0.014643\n", "1 <=55 MICU 0.046082\n", "2 <=55 SICU 0.043706\n", "3 >55 FICU 0.114268\n", "4 >55 MICU 0.295461\n", "5 >55 SICU 0.284056" ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "newdat[\"pred\"] = ageunit_glm_result.predict(newdat)\n", "newdat" ] }, { "cell_type": "markdown", "id": "01abab1b", "metadata": {}, "source": [ "## Survival Analysis" ] }, { "cell_type": "markdown", "id": "a45af782", "metadata": {}, "source": [ "### correct the observation" ] }, { "cell_type": "code", "execution_count": 38, "id": "d76f007b", "metadata": {}, "outputs": [], "source": [ "adata_subset = adata[\n", " :, [\"mort_day_censored\", \"censor_flg\", \"gender_num\", \"service_unit\"]\n", "]" ] }, { "cell_type": "markdown", "id": "9d84b1ef", "metadata": {}, "source": [ "Normally, you can skip the next step, but since this dataset was used to analyze\n", "the data in a slightly different way, we need to correct the observation times for a\n", "subset of the subjects in the dataset." ] }, { "cell_type": "code", "execution_count": 39, "id": "fc657322", "metadata": {}, "outputs": [], "source": [ "adata_subset[:, [\"mort_day_censored\"]].X[adata_subset[:, [\"censor_flg\"]].X == 1] = 731" ] }, { "cell_type": "markdown", "id": "3bebcb14", "metadata": {}, "source": [ "### Kaplan-Meier Survival Curves" ] }, { "cell_type": "markdown", "id": "40c21c9f", "metadata": {}, "source": [ "Kaplan-Meier plots are one of the most widely used plots in medical research. We can use `ehrapy.tools.kmp` (`ep.tl.kmp`), which internally calls KaplanMeierFitter, to fit the Kaplan-Meier estimate for the survival function. The function normally takes two arguments: a vector of times, and some kind of indicator for which patients had an event (death in our case). In our case, the vector of death and censoring times are the mort_day_censored, and deaths are coded with a zero in the censor_flg variable." ] }, { "cell_type": "markdown", "id": "7b370373", "metadata": {}, "source": [ "Note that in the MIMIC-II database, `censor_fl` is censored or death (binary: 0 = death, 1 = censored).
In KaplanMeierFitter, `event_observed` is True if the the death was observed, False if the event was lost (right-censored).
So we need to flip `censor_fl` when pass `censor_fl` to KaplanMeierFitter:" ] }, { "cell_type": "code", "execution_count": 40, "id": "78ad7e16", "metadata": {}, "outputs": [], "source": [ "adata_subset[:, [\"censor_flg\"]].X = np.where(\n", " adata_subset[:, [\"censor_flg\"]].X == 0, 1, 0\n", ")" ] }, { "cell_type": "markdown", "id": "d5b3e5f8", "metadata": {}, "source": [ "Fitting a Kaplan-Meier curve is quite easy, and we want to ‘fit’ by gender (gender_num). The default alpha value of KaplanMeierFitter is 0.05, which is 95 % confidence intervals for the survival functions. Lastly we add a legend, coding black for the women and red for the men." ] }, { "cell_type": "code", "execution_count": 41, "id": "29f39b88", "metadata": {}, "outputs": [], "source": [ "T = adata_subset[:, [\"mort_day_censored\"]].X\n", "E = adata_subset[:, [\"censor_flg\"]].X\n", "groups = adata_subset[:, [\"gender_num\"]].X\n", "ix1 = groups == 0\n", "ix2 = groups == 1\n", "kmf_1 = ep.tl.kmf(T[ix1], E[ix1], label=\"Women\")\n", "kmf_2 = ep.tl.kmf(T[ix2], E[ix2], label=\"Men\")" ] }, { "cell_type": "code", "execution_count": 42, "id": "0a56f14b", "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "ep.pl.kmf(\n", " [kmf_1, kmf_2],\n", " color=[\"k\", \"r\"],\n", " xlim=[0, 750],\n", " ylim=[0, 1],\n", " xlabel=\"Days\",\n", " ylabel=\"Proportion Who Survived\",\n", " show=True,\n", ")" ] }, { "cell_type": "markdown", "id": "a9deba3f", "metadata": {}, "source": [ "As the above figure shows, there appears to be a difference between the survival function between the two gender groups, with again the male group (red) dying at slightly slower rate than the female group (black). We have included 95 % point-wise confidence bands for the survival function estimate, which assesses how much certain we are about the estimated survivorship at each point in time.\n", "\n", "We can do the same for `service_unit`, but since it has three groups, we need to change the color argument and legend to ensure the plot is properly labelled. " ] }, { "cell_type": "code", "execution_count": 43, "id": "dce0678e", "metadata": {}, "outputs": [], "source": [ "groups = adata_subset[:, [\"service_unit\"]].X\n", "ix1 = groups == \"FICU\"\n", "ix2 = groups == \"MICU\"\n", "ix3 = groups == \"SICU\"\n", "kmf_1 = ep.tl.kmf(T[ix1], E[ix1], label=\"FICU\")\n", "kmf_2 = ep.tl.kmf(T[ix2], E[ix2], label=\"MICU\")\n", "kmf_3 = ep.tl.kmf(T[ix3], E[ix3], label=\"SICU\")" ] }, { "cell_type": "code", "execution_count": 44, "id": "5b90b2fe", "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "ep.pl.kmf(\n", " [kmf_1, kmf_2, kmf_3],\n", " ci_show=[False, False, False],\n", " color=[\"k\", \"r\", \"g\"],\n", " xlim=[0, 750],\n", " ylim=[0, 1],\n", " xlabel=\"Days\",\n", " ylabel=\"Proportion Who Survived\",\n", " show=True,\n", ")" ] }, { "cell_type": "markdown", "id": "ed1926ff", "metadata": {}, "source": [ "### Cox Proportional Hazards Models" ] }, { "cell_type": "markdown", "id": "7c529cf1", "metadata": {}, "source": [ "The most popular approach for modelling time to event outcomes in health data is likely the Cox Proportional Hazards Model, which is also sometimes called the Cox model or Cox Regression. As the name implies this method models something called the hazard function.\n", "\n", "The hazard function is a function of time (hours, days, years) and is approximately the instantaneous probability of the event occurring (i.e., chance the event is happening in some very small time window) given the event has not already happened." ] }, { "cell_type": "code", "execution_count": 45, "id": "ad50558f", "metadata": {}, "outputs": [], "source": [ "adata_subset = adata_subset[:, [\"mort_day_censored\", \"censor_flg\", \"gender_num\"]]" ] }, { "cell_type": "markdown", "id": "f894a29b", "metadata": {}, "source": [ "The CoxPHFitter function (from the lifelines package) is the fitting function for Cox models. In our case, let’s continue our example of using gender (`gender_num`) to model the datSurv outcome we created, and running the summary function to see what information is outputted." ] }, { "cell_type": "code", "execution_count": 46, "id": "dec473d4", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "ArrayView([[11.92],\n", " [731.0],\n", " [731.0],\n", " ...,\n", " [62.21],\n", " [234.13],\n", " [731.0]], dtype=object)" ] }, "execution_count": 46, "metadata": {}, "output_type": "execute_result" } ], "source": [ "adata_subset[:, [\"mort_day_censored\"]].X" ] }, { "cell_type": "markdown", "id": "fb2caf51", "metadata": {}, "source": [ "Because `CoxPHFitter.fit()` needs a Pandas DataFrame as input, we have to convert AnnData to DataFrame." ] }, { "cell_type": "code", "execution_count": 47, "id": "bb3309fb", "metadata": {}, "outputs": [], "source": [ "data = ep.ad.anndata_to_df(adata_subset)\n", "data = data.dropna()" ] }, { "cell_type": "code", "execution_count": 48, "id": "25d3bcb3", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 48, "metadata": {}, "output_type": "execute_result" } ], "source": [ "gender_coxph = ep.tl.cox_ph(adata_subset, duration_col=\"mort_day_censored\", event_col=\"censor_flg\")" ] }, { "cell_type": "code", "execution_count": 49, "id": "e33bc61c", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
modellifelines.CoxPHFitter
duration col'mort_day_censored'
event col'censor_flg'
baseline estimationbreslow
number of observations1775
number of events observed497
partial log-likelihood-3636.11
time fit was run2022-08-09 10:04:22 UTC
\n", "
\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
coefexp(coef)se(coef)coef lower 95%coef upper 95%exp(coef) lower 95%exp(coef) upper 95%cmp tozp-log2(p)
gender_num-0.290.750.09-0.47-0.110.630.890.00-3.24<0.0059.71

\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Concordance0.54
Partial AIC7274.23
log-likelihood ratio test10.43 on 1 df
-log2(p) of ll-ratio test9.65
\n", "
" ], "text/latex": [ "\\begin{tabular}{lrrrrrrrrrrr}\n", "\\toprule\n", "{} & coef & exp(coef) & se(coef) & coef lower 95\\% & coef upper 95\\% & exp(coef) lower 95\\% & exp(coef) upper 95\\% & cmp to & z & p & -log2(p) \\\\\n", "covariate & & & & & & & & & & & \\\\\n", "\\midrule\n", "gender\\_num & -0.29 & 0.75 & 0.09 & -0.47 & -0.11 & 0.63 & 0.89 & 0.00 & -3.24 & 0.00 & 9.71 \\\\\n", "\\bottomrule\n", "\\end{tabular}\n" ], "text/plain": [ "\n", " duration col = 'mort_day_censored'\n", " event col = 'censor_flg'\n", " baseline estimation = breslow\n", " number of observations = 1775\n", "number of events observed = 497\n", " partial log-likelihood = -3636.11\n", " time fit was run = 2022-08-09 10:04:22 UTC\n", "\n", "---\n", " coef exp(coef) se(coef) coef lower 95% coef upper 95% exp(coef) lower 95% exp(coef) upper 95%\n", "covariate \n", "gender_num -0.29 0.75 0.09 -0.47 -0.11 0.63 0.89\n", "\n", " cmp to z p -log2(p)\n", "covariate \n", "gender_num 0.00 -3.24 <0.005 9.71\n", "---\n", "Concordance = 0.54\n", "Partial AIC = 7274.23\n", "log-likelihood ratio test = 10.43 on 1 df\n", "-log2(p) of ll-ratio test = 9.65" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "gender_coxph.print_summary()" ] }, { "cell_type": "markdown", "id": "940fc860", "metadata": {}, "source": [ "The coefficients table has the familiar format, which we’ve seen before. The\n", "coef for `gender_num` is about −0.29, and this is the estimate of our log-hazard\n", "ratio. As discussed, taking the exponential of this gives the hazard ratio (HR),\n", "which the summary output computes in the next column (exp(coef)). Here, the\n", "HR is estimated at 0.75, indicating that men have about a 25 % reduction in the\n", "hazards of death, under the proportional hazards assumption." ] }, { "cell_type": "markdown", "id": "5f268730", "metadata": {}, "source": [ "The next column in the coefficient table has the standard error for the log hazard\n", "ratio, followed by the z score and p-value (Pr(>|z|)), which is very similar to\n", "what we saw in the case of logistic regression. Here we see the p-value is quite\n", "small, and we would reject the null hypothesis that the hazard functions are the\n", "same between men and women. This is consistent with the exploratory figures we\n", "produced using Kaplan-Meier curves in the previous section." ] }, { "cell_type": "markdown", "id": "e1a62587", "metadata": {}, "source": [ "For CoxPHFitter, the\n", "summary function also conveniently outputs the confidence interval of the HR a\n", "few lines down, and here our estimate of the HR is 0.75 (95 % CI: 0.63–0.89,\n", "p = 0.001). This is how the HR would typically be reported." ] }, { "cell_type": "markdown", "id": "bf8e565e", "metadata": {}, "source": [ "Using more than one covariate works the same as our other analysis techniques.\n", "Adding a co-morbidity to the model such as atrial fibrillation (`afib_flg`) can be\n", "done as you would do for logistic regression. Because fit a Cox Proportional Hazards Models using CoxPHFitter requires a Pandas DataFrame as input, we also need to create a DataFrame from AnnData." ] }, { "cell_type": "code", "execution_count": 52, "id": "22fb2860", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
modellifelines.CoxPHFitter
duration col'mort_day_censored'
event col'censor_flg'
baseline estimationbreslow
number of observations1775
number of events observed497
partial log-likelihood-3567.43
time fit was run2022-08-09 10:04:22 UTC
\n", "
\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
coefexp(coef)se(coef)coef lower 95%coef upper 95%exp(coef) lower 95%exp(coef) upper 95%cmp tozp-log2(p)
gender_num-0.260.770.09-0.44-0.080.650.920.00-2.88<0.0057.99
afib_flg1.343.840.101.141.543.144.680.0013.18<0.005129.37

\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Concordance0.61
Partial AIC7138.85
log-likelihood ratio test147.80 on 2 df
-log2(p) of ll-ratio test106.62
\n", "
" ], "text/latex": [ "\\begin{tabular}{lrrrrrrrrrrr}\n", "\\toprule\n", "{} & coef & exp(coef) & se(coef) & coef lower 95\\% & coef upper 95\\% & exp(coef) lower 95\\% & exp(coef) upper 95\\% & cmp to & z & p & -log2(p) \\\\\n", "covariate & & & & & & & & & & & \\\\\n", "\\midrule\n", "gender\\_num & -0.26 & 0.77 & 0.09 & -0.44 & -0.08 & 0.65 & 0.92 & 0.00 & -2.88 & 0.00 & 7.99 \\\\\n", "afib\\_flg & 1.34 & 3.84 & 0.10 & 1.14 & 1.54 & 3.14 & 4.68 & 0.00 & 13.18 & 0.00 & 129.37 \\\\\n", "\\bottomrule\n", "\\end{tabular}\n" ], "text/plain": [ "\n", " duration col = 'mort_day_censored'\n", " event col = 'censor_flg'\n", " baseline estimation = breslow\n", " number of observations = 1775\n", "number of events observed = 497\n", " partial log-likelihood = -3567.43\n", " time fit was run = 2022-08-09 10:04:22 UTC\n", "\n", "---\n", " coef exp(coef) se(coef) coef lower 95% coef upper 95% exp(coef) lower 95% exp(coef) upper 95%\n", "covariate \n", "gender_num -0.26 0.77 0.09 -0.44 -0.08 0.65 0.92\n", "afib_flg 1.34 3.84 0.10 1.14 1.54 3.14 4.68\n", "\n", " cmp to z p -log2(p)\n", "covariate \n", "gender_num 0.00 -2.88 <0.005 7.99\n", "afib_flg 0.00 13.18 <0.005 129.37\n", "---\n", "Concordance = 0.61\n", "Partial AIC = 7138.85\n", "log-likelihood ratio test = 147.80 on 2 df\n", "-log2(p) of ll-ratio test = 106.62" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "adata_subset = adata[:, [\"mort_day_censored\", \"censor_flg\", \"gender_num\", \"afib_flg\"]]\n", "\n", "genderafib_coxph = ep.tl.cox_ph(adata_subset, duration_col=\"mort_day_censored\", event_col=\"censor_flg\")\n", "genderafib_coxph.print_summary()" ] }, { "cell_type": "markdown", "id": "cb2a3ba1", "metadata": {}, "source": [ "Here again male gender is associated with reduced time to death, while atrial fibrillation increases the hazard of death by almost four-fold. Both are statistically significant in the summary output.\n", "\n", "Cox regression also allows one to use covariates which change over time. This would allow one to incorporate changes in treatment, disease severity, etc. within the same patient without need for any different methodology. The major challenge to do this is mainly in the construction of the dataset, which is discussed in some of the references at the end of this chapter. Some care is required when the time dependent covariate is only measured periodically, as the method requires that it be known at every event time for the entire cohort of patients, and not just those relevant to the patient in question. This is more practical for changes in treatment which may be recorded with some precision, particularly in a database like MIMIC II, and less so for laboratory results which may be measured at the resolution of hours, days or weeks. Interpolating between lab values or carrying the last observation forward has been shown to introduce several types of problems." ] }, { "cell_type": "markdown", "id": "7119c2fb", "metadata": {}, "source": [ "### Caveats and Conclusions" ] }, { "cell_type": "markdown", "id": "54524c51", "metadata": {}, "source": [ "Survival analysis is distinguished from other forms of analyses covered in this Chapter, as it allows the data to be censored. As was the case for the other approaches we considered, there are modeling assumptions. For instance, it is important that the censoring is not informative of the survival time. For example, if censoring occurs when treatment is withdrawn because the patient is too sick to continue therapy, this would be an example of informative censoring. The validity of all methods discussed in this section are then invalid. Care should be taken to make sure you understand the censoring mechanism as to avoid any false inferences drawn.\n", "\n", "Assessment of the proportional hazards assumption is an important part of any Cox regression analysis. We refer you to the references at the end of this chapter for strategies and alternatives for when the proportional hazards assumption breaks down. In some circumstances, the proportional hazards assumption is not valid, and alternative approaches can be used. As is always the case, when outcomes are dependent (e.g., one patient may contribute more than one observation), the methods discussed in this section should not be used directly. Generally the standard error estimates will be too small, and p-values will be incorrect. The concerns in logistic regression regarding outliers, co-linearity, missing data, and covariates with sparse outcomes apply here as well, as do the concerns about model misspecification for continuous covariates." ] } ], "metadata": { "interpreter": { "hash": "4ebbee468332224025c1d8a5f51338ab29e79b708cc8a093850abd5116748064" }, "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.11" } }, "nbformat": 4, "nbformat_minor": 5 }