{
"cells": [
{
"cell_type": "markdown",
"id": "ca2213c2-6abc-4340-853a-7ab1e06e68d3",
"metadata": {},
"source": [
"# Getting started\n",
"\n",
"In this notebook, we use `TorchSurv` to train a model that predicts relative risk of breast cancer recurrence. We use a public data set, the [German Breast Cancer Study Group 2 (GBSG2)](https://paperswithcode.com/dataset/gbsg2). After training the model, we evaluate the predictive performance using evaluation metrics implemented in `TorchSurv`.\n",
"\n",
"\n",
"We first load the dataset using the package [lifelines](https://lifelines.readthedocs.io/en/latest/). The GBSG2 dataset contains features and recurrence free survival time (in days) for 686 women undergoing hormonal treatment. \n",
"\n",
"### Dependencies\n",
"\n",
"To run this notebook, dependencies must be installed. the recommended method is to use our developpment conda environment (**preffered**). Instruction can be found [here](https://opensource.nibr.com/torchsurv/devnotes.html#set-up-a-development-environment-via-conda) to install all optional dependancies. The other method is to install only required packages using the command line below:"
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "160c8e19",
"metadata": {},
"outputs": [],
"source": [
"# Install only required packages (optional)\n",
"# %pip install lifelines\n",
"# %pip install matplotlib\n",
"# %pip install sklearn\n",
"# %pip install pandas\n"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "013dbcb4",
"metadata": {},
"outputs": [],
"source": [
"import warnings\n",
"\n",
"warnings.filterwarnings(\"ignore\")"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "2601dd00-7bd2-49d5-9bdf-a84205872890",
"metadata": {},
"outputs": [],
"source": [
"import lifelines\n",
"import pandas as pd\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"import torch\n",
"from torch.utils.data import DataLoader\n",
"from sklearn.model_selection import train_test_split\n",
"\n",
"# Our package\n",
"from torchsurv.loss.cox import neg_partial_log_likelihood\n",
"from torchsurv.loss.weibull import neg_log_likelihood, log_hazard, survival_function\n",
"from torchsurv.metrics.brier_score import BrierScore\n",
"from torchsurv.metrics.cindex import ConcordanceIndex\n",
"from torchsurv.metrics.auc import Auc\n",
"\n",
"# PyTorch boilerplate - see https://github.com/Novartis/torchsurv/blob/main/docs/notebooks/helpers_introduction.py\n",
"from helpers_introduction import Custom_dataset, plot_losses"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "d7a98ea2-100f-43ef-8c45-c786ddcd313e",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"CUDA-enabled GPU/TPU is available.\n"
]
}
],
"source": [
"# Constant parameters accross models\n",
"# Detect available accelerator; Downgrade batch size if only CPU available\n",
"if any([torch.cuda.is_available(), torch.backends.mps.is_available()]):\n",
" print(\"CUDA-enabled GPU/TPU is available.\")\n",
" BATCH_SIZE = 128 # batch size for training\n",
"else:\n",
" print(\"No CUDA-enabled GPU found, using CPU.\")\n",
" BATCH_SIZE = 32 # batch size for training\n",
"\n",
"EPOCHS = 100\n",
"LEARNING_RATE = 1e-2"
]
},
{
"cell_type": "markdown",
"id": "38dd4c6e-2934-44f5-88fa-1d9d02032fc3",
"metadata": {},
"source": [
"## Dataset overview"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "1df49737-dc02-4d6b-acd7-d03b79f18a29",
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
horTh
\n",
"
age
\n",
"
menostat
\n",
"
tsize
\n",
"
tgrade
\n",
"
pnodes
\n",
"
progrec
\n",
"
estrec
\n",
"
time
\n",
"
cens
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
no
\n",
"
70
\n",
"
Post
\n",
"
21
\n",
"
II
\n",
"
3
\n",
"
48
\n",
"
66
\n",
"
1814
\n",
"
1
\n",
"
\n",
"
\n",
"
1
\n",
"
yes
\n",
"
56
\n",
"
Post
\n",
"
12
\n",
"
II
\n",
"
7
\n",
"
61
\n",
"
77
\n",
"
2018
\n",
"
1
\n",
"
\n",
"
\n",
"
2
\n",
"
yes
\n",
"
58
\n",
"
Post
\n",
"
35
\n",
"
II
\n",
"
9
\n",
"
52
\n",
"
271
\n",
"
712
\n",
"
1
\n",
"
\n",
"
\n",
"
3
\n",
"
yes
\n",
"
59
\n",
"
Post
\n",
"
17
\n",
"
II
\n",
"
4
\n",
"
60
\n",
"
29
\n",
"
1807
\n",
"
1
\n",
"
\n",
"
\n",
"
4
\n",
"
no
\n",
"
73
\n",
"
Post
\n",
"
35
\n",
"
II
\n",
"
1
\n",
"
26
\n",
"
65
\n",
"
772
\n",
"
1
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" horTh age menostat tsize tgrade pnodes progrec estrec time cens\n",
"0 no 70 Post 21 II 3 48 66 1814 1\n",
"1 yes 56 Post 12 II 7 61 77 2018 1\n",
"2 yes 58 Post 35 II 9 52 271 712 1\n",
"3 yes 59 Post 17 II 4 60 29 1807 1\n",
"4 no 73 Post 35 II 1 26 65 772 1"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Load GBSG2 dataset\n",
"df = lifelines.datasets.load_gbsg2()\n",
"df.head(5)"
]
},
{
"cell_type": "markdown",
"id": "8f23ce41-c0eb-4c30-83f3-2a2d45dcf097",
"metadata": {},
"source": [
"The dataset contains the categorical features: \n",
"\n",
"- `horTh`: hormonal therapy, a factor at two levels (yes and no).\n",
"- `age`: age of the patients in years.\n",
"- `menostat`: menopausal status, a factor at two levels pre (premenopausal) and post (postmenopausal).\n",
"- `tsize`: tumor size (in mm).\n",
"- `tgrade`: tumor grade, a ordered factor at levels I < II < III.\n",
"- `pnodes`: number of positive nodes.\n",
"- `progrec`: progesterone receptor (in fmol).\n",
"- `estrec`: estrogen receptor (in fmol).\n",
"\n",
"Additionally, it contains our survival targets:\n",
"\n",
"- `time`: recurrence free survival time (in days).\n",
"- `cens`: censoring indicator (0- censored, 1- event).\n",
"\n",
"One common approach is to use a [one hot encoder](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.get_dummies.html) to convert them into numerical features. We then seperate the dataframes into features `X` and labels `y`. The following code also partitions the labels and features into training and testing cohorts."
]
},
{
"cell_type": "markdown",
"id": "34132fea-daa6-46a5-8429-16df73886a51",
"metadata": {},
"source": [
"## Data preparation"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "7a5fd9ef-2643-46b7-9c98-05ff919026ea",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
age
\n",
"
tsize
\n",
"
pnodes
\n",
"
progrec
\n",
"
estrec
\n",
"
time
\n",
"
cens
\n",
"
horTh_yes
\n",
"
menostat_Pre
\n",
"
tgrade_II
\n",
"
tgrade_III
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
70.0
\n",
"
21.0
\n",
"
3.0
\n",
"
48.0
\n",
"
66.0
\n",
"
1814.0
\n",
"
1.0
\n",
"
0.0
\n",
"
0.0
\n",
"
1.0
\n",
"
0.0
\n",
"
\n",
"
\n",
"
1
\n",
"
56.0
\n",
"
12.0
\n",
"
7.0
\n",
"
61.0
\n",
"
77.0
\n",
"
2018.0
\n",
"
1.0
\n",
"
1.0
\n",
"
0.0
\n",
"
1.0
\n",
"
0.0
\n",
"
\n",
"
\n",
"
2
\n",
"
58.0
\n",
"
35.0
\n",
"
9.0
\n",
"
52.0
\n",
"
271.0
\n",
"
712.0
\n",
"
1.0
\n",
"
1.0
\n",
"
0.0
\n",
"
1.0
\n",
"
0.0
\n",
"
\n",
"
\n",
"
3
\n",
"
59.0
\n",
"
17.0
\n",
"
4.0
\n",
"
60.0
\n",
"
29.0
\n",
"
1807.0
\n",
"
1.0
\n",
"
1.0
\n",
"
0.0
\n",
"
1.0
\n",
"
0.0
\n",
"
\n",
"
\n",
"
4
\n",
"
73.0
\n",
"
35.0
\n",
"
1.0
\n",
"
26.0
\n",
"
65.0
\n",
"
772.0
\n",
"
1.0
\n",
"
0.0
\n",
"
0.0
\n",
"
1.0
\n",
"
0.0
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" age tsize pnodes progrec estrec time cens horTh_yes \\\n",
"0 70.0 21.0 3.0 48.0 66.0 1814.0 1.0 0.0 \n",
"1 56.0 12.0 7.0 61.0 77.0 2018.0 1.0 1.0 \n",
"2 58.0 35.0 9.0 52.0 271.0 712.0 1.0 1.0 \n",
"3 59.0 17.0 4.0 60.0 29.0 1807.0 1.0 1.0 \n",
"4 73.0 35.0 1.0 26.0 65.0 772.0 1.0 0.0 \n",
"\n",
" menostat_Pre tgrade_II tgrade_III \n",
"0 0.0 1.0 0.0 \n",
"1 0.0 1.0 0.0 \n",
"2 0.0 1.0 0.0 \n",
"3 0.0 1.0 0.0 \n",
"4 0.0 1.0 0.0 "
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_onehot = pd.get_dummies(df, columns=[\"horTh\", \"menostat\", \"tgrade\"]).astype(\"float\")\n",
"df_onehot.drop(\n",
" [\"horTh_no\", \"menostat_Post\", \"tgrade_I\"],\n",
" axis=1,\n",
" inplace=True,\n",
")\n",
"df_onehot.head(5)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "0f8b7f3b-fb2a-4d74-ac99-8f6390b2f5eb",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(Sample size) Training:336 | Validation:144 |Testing:206\n"
]
}
],
"source": [
"df_train, df_test = train_test_split(df_onehot, test_size=0.3)\n",
"df_train, df_val = train_test_split(df_train, test_size=0.3)\n",
"print(\n",
" f\"(Sample size) Training:{len(df_train)} | Validation:{len(df_val)} |Testing:{len(df_test)}\"\n",
")"
]
},
{
"cell_type": "markdown",
"id": "00ad6603-0dff-4991-992a-081ba9a4fafa",
"metadata": {},
"source": [
"Let us setup the dataloaders for training, validation and testing."
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "326c03fc-91f1-493b-a9ba-820de17fb2f8",
"metadata": {},
"outputs": [],
"source": [
"# Dataloader\n",
"dataloader_train = DataLoader(\n",
" Custom_dataset(df_train), batch_size=BATCH_SIZE, shuffle=True\n",
")\n",
"dataloader_val = DataLoader(\n",
" Custom_dataset(df_val), batch_size=len(df_val), shuffle=False\n",
")\n",
"dataloader_test = DataLoader(\n",
" Custom_dataset(df_test), batch_size=len(df_test), shuffle=False\n",
")"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "570386fb-f0ea-4061-bae2-11b274e7f851",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"x (shape) = torch.Size([128, 9])\n",
"num_features = 9\n",
"event = torch.Size([128])\n",
"time = torch.Size([128])\n"
]
}
],
"source": [
"# Sanity check\n",
"x, (event, time) = next(iter(dataloader_train))\n",
"num_features = x.size(1)\n",
"\n",
"print(f\"x (shape) = {x.shape}\")\n",
"print(f\"num_features = {num_features}\")\n",
"print(f\"event = {event.shape}\")\n",
"print(f\"time = {time.shape}\")"
]
},
{
"cell_type": "markdown",
"id": "6b53d40d-d2c4-4dd7-bb85-97d4e946c356",
"metadata": {},
"source": [
"## Section 1: Cox proportional hazards model\n",
"\n",
"In this section, we use the [Cox proportional hazards model](../_autosummary/torchsurv.loss.cox.html). Given covariate $x_{i}$, the hazard of patient $i$ has the form\n",
"$$\n",
"\\lambda (t|x_{i}) =\\lambda_{0}(t)\\theta(x_{i})\n",
"$$\n",
"The baseline hazard $\\lambda_{0}(t)$ is identical across subjects (i.e., has no dependency on $i$). The subject-specific risk of event occurrence is captured through the relative hazards $\\{\\theta(x_{i})\\}_{i = 1, \\dots, N}$.\n",
"\n",
"We train a multi-layer perceptron (MLP) to model the subject-specific risk of event occurrence, i.e., the log relative hazards $\\log\\theta(x_{i})$. Patients with lower recurrence time are assumed to have higher risk of event. "
]
},
{
"cell_type": "markdown",
"id": "46343fe0",
"metadata": {},
"source": [
"### Section 1.1: MLP model for log relative hazards"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "9c2bd89a-c90a-4795-aab5-b5c21906a0de",
"metadata": {},
"outputs": [],
"source": [
"cox_model = torch.nn.Sequential(\n",
" torch.nn.BatchNorm1d(num_features), # Batch normalization\n",
" torch.nn.Linear(num_features, 32),\n",
" torch.nn.ReLU(),\n",
" torch.nn.Dropout(),\n",
" torch.nn.Linear(32, 64),\n",
" torch.nn.ReLU(),\n",
" torch.nn.Dropout(),\n",
" torch.nn.Linear(64, 1), # Estimating log hazards for Cox models\n",
")"
]
},
{
"cell_type": "markdown",
"id": "97c90244",
"metadata": {},
"source": [
"### Section 1.2: MLP model training"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "d7889dc1-1cfa-424e-a586-481cbc789581",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch: 000, Training loss: 12.75\n",
"Epoch: 010, Training loss: 12.02\n",
"Epoch: 020, Training loss: 11.79\n",
"Epoch: 030, Training loss: 11.84\n",
"Epoch: 040, Training loss: 11.61\n",
"Epoch: 050, Training loss: 11.61\n",
"Epoch: 060, Training loss: 11.46\n",
"Epoch: 070, Training loss: 11.57\n",
"Epoch: 080, Training loss: 11.56\n",
"Epoch: 090, Training loss: 11.20\n"
]
}
],
"source": [
"torch.manual_seed(42)\n",
"\n",
"# Init optimizer for Cox\n",
"optimizer = torch.optim.Adam(cox_model.parameters(), lr=LEARNING_RATE)\n",
"\n",
"# Initiate empty list to store the loss on the train and validation sets\n",
"train_losses = []\n",
"val_losses = []\n",
"\n",
"# training loop\n",
"for epoch in range(EPOCHS):\n",
" epoch_loss = torch.tensor(0.0)\n",
" for i, batch in enumerate(dataloader_train):\n",
" x, (event, time) = batch\n",
" optimizer.zero_grad()\n",
" log_hz = cox_model(x) # shape = (16, 1)\n",
" loss = neg_partial_log_likelihood(log_hz, event, time, reduction=\"mean\")\n",
" loss.backward()\n",
" optimizer.step()\n",
" epoch_loss += loss.detach()\n",
"\n",
" if epoch % (EPOCHS // 10) == 0:\n",
" print(f\"Epoch: {epoch:03}, Training loss: {epoch_loss:0.2f}\")\n",
"\n",
" # Reccord loss on train and test sets\n",
" epoch_loss /= i + 1\n",
" train_losses.append(epoch_loss)\n",
" with torch.no_grad():\n",
" x, (event, time) = next(iter(dataloader_val))\n",
" val_losses.append(\n",
" neg_partial_log_likelihood(cox_model(x), event, time, reduction=\"mean\")\n",
" )"
]
},
{
"cell_type": "markdown",
"id": "0e2bdd8c-f84c-4003-98f4-220ddab518d1",
"metadata": {},
"source": [
"We can visualize the training and validation losses."
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "21afc248-303a-4156-8d9c-b97be3e0a56b",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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lISpU6dCq9Vi+PDh0vYvvvgiVq5ciS+//BKPPvqo2/1/8sknMJvNeP/99xEVFYXBgwejuLgYDz30kLSNXq/Hn/70J+l2Xl4etm3bhs8++ww33ngjYmJiEBkZifb2dpcpzTfeeAM5OTlYsmQJBEHAgAEDUFpaiqeeegp//OMfodGwwPWwYcPw7LPPAgD69u2LJUuWYP369STQCIIgOooyghaZyGrRrBY2ND22a5SkUIqTCBluueUWLF++HO3trPPmk08+wa9+9StotVo0NzdjwYIFGDRoEBISEhATE4Njx46hsLDQo30fPXoUw4cPR1RUlHTfhAkTHLZ76623MGbMGKSmpiImJgbvvPOOx6+hfK0JEyZAUEQOL774YjQ1NaG4uFi6b9iwYTbP69GjByorK716LYIgCEIF3iQQkQBoNEBUMrvdhdKcFEG7ENBHsUhWsF7bQ2bPng2LxYJvvvkGY8eOxebNm/Hqq68CAH77299izZo1ePnll5Gfn4/IyEhcf/31MBgMHu3barW63eazzz7DE088gVdeeQUTJkxAbGws/v73v2PHjh0e/w78tQS7tC5/feX9er1tmF0QBIcaPIIgCMIHlBE0gKU5m893qU5OEmgXAoLgUZox2ERGRuLaa6/FJ598glOnTqFfv34YPXo0AGDz5s248847cc011wAAmpqacPbsWY/3PWjQIHz00UdobW1FZGQkAGD79u0222zevBkTJ07Eww8/LN13+vRpm23CwsJgNpvdvtby5ctthNq2bdsQGxuLrKwsj9dMEARB+IgUQeMCTbRB6kICjVKcREhxyy234JtvvsH777+PW2+9Vbo/Pz8fK1aswP79+/Hzzz9j7ty5XkWb5s6dC41Gg3vuuQdHjhzB6tWr8fLLL9tsk5+fj927d2PNmjU4ceIEnnnmGezatctmm169euHAgQM4fvw4qqqqYDQaHV7r4YcfRlFREX7961/j2LFj+OKLL/Dss89i/vz5Uv0ZQRAEEUCkOZwJ7LILdnLS0YIIKaZMmYKkpCQcP34cc+fOle5ftGgREhMTMXHiRMyePRszZszAqFGjPN5vTEwMvvrqKxw5cgQjR47E73//e/ztb3+z2ebBBx/Etddei5tuugnjx49HdXW1TTQNAO677z70799fqlPbunWrw2tlZWVh9erV2LlzJ4YPH44HH3wQ99xzD/7w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",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plot_losses(train_losses, val_losses, \"Cox\")"
]
},
{
"cell_type": "markdown",
"id": "bd881d14-9646-48e0-bcc3-f29be358161f",
"metadata": {},
"source": [
"### Section 1.3: Cox proportional hazards model evaluation\n",
"\n",
"We evaluate the predictive performance of the model using \n",
"\n",
"* the [concordance index](../_autosummary/torchsurv.metrics.cindex.html) (C-index), which measures the the probability that a model correctly predicts which of two comparable samples will experience an event first based on their estimated risk scores,\n",
"* the [Area Under the Receiver Operating Characteristic Curve](../_autosummary/torchsurv.metrics.auc.html) (AUC), which measures the probability that a model correctly predicts which of two comparable samples will experience an event by time t based on their estimated risk scores.\n",
"\n",
"We cannot use the Brier score because this model is not able to estimate the survival function."
]
},
{
"cell_type": "markdown",
"id": "0d2e7996",
"metadata": {},
"source": [
"We start by evaluating the subject-specific relative hazards on the test set "
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "272a997d-a978-4e9b-bb0b-d90e4f03a530",
"metadata": {},
"outputs": [],
"source": [
"cox_model.eval()\n",
"with torch.no_grad():\n",
" # test event and test time of length n\n",
" x, (event, time) = next(iter(dataloader_test))\n",
" log_hz = cox_model(x) # log hazard of length n"
]
},
{
"cell_type": "markdown",
"id": "77bd0fe9",
"metadata": {},
"source": [
"We obtain the concordance index, and its confidence interval"
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "3c9ad489-9e53-40ac-8931-8941597760a8",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Cox model performance:\n",
"Concordance-index = 0.6610040068626404\n",
"Confidence interval = tensor([0.5505, 0.7716])\n"
]
}
],
"source": [
"# Concordance index\n",
"cox_cindex = ConcordanceIndex()\n",
"print(\"Cox model performance:\")\n",
"print(f\"Concordance-index = {cox_cindex(log_hz, event, time)}\")\n",
"print(f\"Confidence interval = {cox_cindex.confidence_interval()}\")"
]
},
{
"cell_type": "markdown",
"id": "507b410a",
"metadata": {},
"source": [
"We can also test whether the observed concordance index is greater than 0.5. The statistical test is specified with H0: c-index = 0.5 and Ha: c-index > 0.5. The p-value of the statistical test is"
]
},
{
"cell_type": "code",
"execution_count": 15,
"id": "7d34ba82",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"p-value = 0.002155780792236328\n"
]
}
],
"source": [
"# H0: cindex = 0.5, Ha: cindex > 0.5\n",
"print(\"p-value = {}\".format(cox_cindex.p_value(alternative=\"greater\")))"
]
},
{
"cell_type": "markdown",
"id": "a60919a9",
"metadata": {},
"source": [
"For time-dependent prediction (e.g., 5-year mortality), the C-index is not a proper measure. Instead, it is recommended to use the AUC. The probability to correctly predicts which of two comparable patients will experience an event by 5-year based on their estimated risk scores is the AUC evaluated at 5-year (1825 days) obtained with"
]
},
{
"cell_type": "code",
"execution_count": 16,
"id": "907312f9",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"AUC 5-yr = tensor([0.6954])\n",
"AUC 5-yr (conf int.) = tensor([0.6360, 0.7548])\n"
]
}
],
"source": [
"cox_auc = Auc()\n",
"\n",
"new_time = torch.tensor(1825.0)\n",
"\n",
"# auc evaluated at new time = 1825, 5 year\n",
"print(f\"AUC 5-yr = {cox_auc(log_hz, event, time, new_time=new_time)}\")\n",
"print(f\"AUC 5-yr (conf int.) = {cox_auc.confidence_interval()}\")"
]
},
{
"cell_type": "markdown",
"id": "41e7e69f",
"metadata": {},
"source": [
"As before, we can test whether the observed Auc at 5-year is greater than 0.5. The statistical test is specified with H0: auc = 0.5 and Ha: auc > 0.5. The p-value of the statistical test is"
]
},
{
"cell_type": "code",
"execution_count": 17,
"id": "702e5a74",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"AUC (p_value) = tensor([0.])\n"
]
}
],
"source": [
"print(f\"AUC (p_value) = {cox_auc.p_value()}\")"
]
},
{
"cell_type": "markdown",
"id": "b8f517e6-b0a4-4fbc-aac5-b500b4aca169",
"metadata": {},
"source": [
"## Section 2: Weibull accelerated failure time (AFT) model"
]
},
{
"cell_type": "markdown",
"id": "769ddcf5",
"metadata": {},
"source": [
"In this section, we use the [Weibull accelerated failure (AFT) model](../_autosummary/torchsurv.loss.weibull.html). Given covariate $x_{i}$, the hazard of patient $i$ at time $t$ has the form\n",
"$$\n",
"\\lambda (t|x_{i}) = \\frac{\\rho(x_{i}) } {\\lambda(x_{i}) } + \\left(\\frac{t}{\\lambda(x_{i})}\\right)^{\\rho(x_{i}) - 1}\n",
"$$\n",
"\n",
"Given the hazard form, it can be shown that the event density follows a Weibull distribution parametrized by scale $\\lambda(x_{i})$ and shape $\\rho(x_{i})$. The subject-specific risk of event occurrence at time $t$ is captured through the hazards $\\{\\lambda (t|x_{i})\\}_{i = 1, \\dots, N}$. We train a multi-layer perceptron (MLP) to model the subject-specific log scale, $\\log \\lambda(x_{i})$, and the log shape, $\\log\\rho(x_{i})$. "
]
},
{
"cell_type": "markdown",
"id": "a580702e",
"metadata": {},
"source": [
"### Section 2.1: MLP model for log scale and log shape"
]
},
{
"cell_type": "code",
"execution_count": 18,
"id": "35b92c10-e5fb-491d-9e27-743bcffdced2",
"metadata": {},
"outputs": [],
"source": [
"# Same architecture than Cox model, beside outputs dimension\n",
"weibull_model = torch.nn.Sequential(\n",
" torch.nn.BatchNorm1d(num_features), # Batch normalization\n",
" torch.nn.Linear(num_features, 32),\n",
" torch.nn.ReLU(),\n",
" torch.nn.Dropout(),\n",
" torch.nn.Linear(32, 64),\n",
" torch.nn.ReLU(),\n",
" torch.nn.Dropout(),\n",
" torch.nn.Linear(64, 2), # Estimating log parameters for Weibull model\n",
")"
]
},
{
"cell_type": "markdown",
"id": "e96c6985",
"metadata": {},
"source": [
"### Section 2.2: MLP model training"
]
},
{
"cell_type": "code",
"execution_count": 19,
"id": "3d5c6f77-6245-42b0-ae48-33b57789b651",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch: 000, Training loss: 4903.93\n",
"Epoch: 010, Training loss: 20.11\n",
"Epoch: 020, Training loss: 19.83\n",
"Epoch: 030, Training loss: 19.17\n",
"Epoch: 040, Training loss: 17.98\n",
"Epoch: 050, Training loss: 18.01\n",
"Epoch: 060, Training loss: 18.66\n",
"Epoch: 070, Training loss: 17.93\n",
"Epoch: 080, Training loss: 18.28\n",
"Epoch: 090, Training loss: 17.48\n"
]
}
],
"source": [
"torch.manual_seed(42)\n",
"\n",
"# Init optimizer for Weibull\n",
"optimizer = torch.optim.Adam(weibull_model.parameters(), lr=LEARNING_RATE)\n",
"\n",
"# Initialize empty list to store loss on train and validation sets\n",
"train_losses = []\n",
"val_losses = []\n",
"\n",
"# training loop\n",
"for epoch in range(EPOCHS):\n",
" epoch_loss = torch.tensor(0.0)\n",
" for i, batch in enumerate(dataloader_train):\n",
" x, (event, time) = batch\n",
" optimizer.zero_grad()\n",
" log_params = weibull_model(x) # shape = (16, 2)\n",
" loss = neg_log_likelihood(log_params, event, time, reduction=\"mean\")\n",
" loss.backward()\n",
" optimizer.step()\n",
" epoch_loss += loss.detach()\n",
"\n",
" if epoch % (EPOCHS // 10) == 0:\n",
" print(f\"Epoch: {epoch:03}, Training loss: {epoch_loss:0.2f}\")\n",
"\n",
" # Reccord losses for the following figure\n",
" train_losses.append(epoch_loss)\n",
" with torch.no_grad():\n",
" x, (event, time) = next(iter(dataloader_val))\n",
" val_losses.append(\n",
" neg_log_likelihood(weibull_model(x), event, time, reduction=\"mean\")\n",
" )"
]
},
{
"cell_type": "markdown",
"id": "4aba21b6",
"metadata": {},
"source": [
"We can visualize the training and validation losses."
]
},
{
"cell_type": "code",
"execution_count": 20,
"id": "243a4fa9-f751-46e7-83f3-e623bfd3518e",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plot_losses(train_losses, val_losses, \"Weibull\")"
]
},
{
"cell_type": "markdown",
"id": "86139132-d337-47b7-a8ad-eac1e255f91d",
"metadata": {},
"source": [
"### Section 2.3: Weibull AFT model evaluation\n",
"\n",
"We evaluate the predictive performance of the model using \n",
"\n",
"* the [C-index](../_autosummary/torchsurv.metrics.cindex.html), which measures the the probability that a model correctly predicts which of two comparable samples will experience an event first based on their estimated risk scores,\n",
"* the [AUC](../_autosummary/torchsurv.metrics.auc.html), which measures the probability that a model correctly predicts which of two comparable samples will experience an event by time t based on their estimated risk scores, and\n",
"* the [Brier score](../_autosummary/torchsurv.metrics.brier_score.html), which measures the model's calibration by calculating the mean square error between the estimated survival function and the empirical (i.e., in-sample) event status."
]
},
{
"cell_type": "markdown",
"id": "1cb226f5",
"metadata": {},
"source": [
"We start by obtaining the subject-specific log hazard and survival probability at every time $t$ observed on the test set"
]
},
{
"cell_type": "code",
"execution_count": 21,
"id": "11599a1f-597b-4ebf-8a15-d3f9db1ebcca",
"metadata": {},
"outputs": [],
"source": [
"weibull_model.eval()\n",
"with torch.no_grad():\n",
" # event and time of length n\n",
" x, (event, time) = next(iter(dataloader_test))\n",
" log_params = weibull_model(x) # shape = (n,2)\n",
"\n",
"# Compute the log hazards from weibull log parameters\n",
"log_hz = log_hazard(log_params, time) # shape = (n,n)\n",
"\n",
"# Compute the survival probability from weibull log parameters\n",
"surv = survival_function(log_params, time) # shape = (n,n)"
]
},
{
"cell_type": "markdown",
"id": "7e309515",
"metadata": {},
"source": [
"We can evaluate the concordance index, its confidence interval and the p-value of the statistical test testing whether the c-index is greater than 0.5:"
]
},
{
"cell_type": "code",
"execution_count": 22,
"id": "afd7e7a5-c909-41eb-a48f-a9c9832eb33b",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Weibull model performance:\n",
"Concordance-index = 0.4752066135406494\n",
"Confidence interval = tensor([0.3505, 0.5999])\n",
"p-value = 0.6516208648681641\n"
]
}
],
"source": [
"# Concordance index\n",
"weibull_cindex = ConcordanceIndex()\n",
"print(\"Weibull model performance:\")\n",
"print(f\"Concordance-index = {weibull_cindex(log_hz, event, time)}\")\n",
"print(f\"Confidence interval = {weibull_cindex.confidence_interval()}\")\n",
"\n",
"# H0: cindex = 0.5, Ha: cindex >0.5\n",
"print(f\"p-value = {weibull_cindex.p_value(alternative = 'greater')}\")"
]
},
{
"cell_type": "markdown",
"id": "d985e48c",
"metadata": {},
"source": [
"For time-dependent prediction (e.g., 5-year mortality), the C-index is not a proper measure. Instead, it is recommended to use the AUC. The probability to correctly predicts which of two comparable patients will experience an event by 5-year based on their estimated risk scores is the AUC evaluated at 5-year (1825 days) obtained with"
]
},
{
"cell_type": "code",
"execution_count": 23,
"id": "ca4e6c56",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"AUC 5-yr = tensor([0.5116])\n",
"AUC 5-yr (conf int.) = tensor([0.4587, 0.5645])\n",
"AUC 5-yr (p value) = tensor([0.3335])\n"
]
}
],
"source": [
"new_time = torch.tensor(1825.0)\n",
"\n",
"# subject-specific log hazard at \\5-yr\n",
"log_hz_t = log_hazard(log_params, time=new_time) # shape = (n)\n",
"weibull_auc = Auc()\n",
"\n",
"# auc evaluated at new time = 1825, 5 year\n",
"print(f\"AUC 5-yr = {weibull_auc(log_hz_t, event, time, new_time=new_time)}\")\n",
"print(f\"AUC 5-yr (conf int.) = {weibull_auc.confidence_interval()}\")\n",
"print(f\"AUC 5-yr (p value) = {weibull_auc.p_value(alternative='greater')}\")"
]
},
{
"cell_type": "markdown",
"id": "66b00e9f",
"metadata": {},
"source": [
"Lastly, we can evaluate the time-dependent Brier score and the integrated Brier score"
]
},
{
"cell_type": "code",
"execution_count": 24,
"id": "b1d99480-b643-4836-acd3-7614fa903543",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Brier score = tensor([0.4384, 0.4445, 0.4472, 0.4525, 0.4509])\n",
"Brier score (conf int.) = tensor([[0.4324, 0.4372, 0.4391, 0.4433, 0.4411],\n",
" [0.4444, 0.4517, 0.4553, 0.4617, 0.4607]])\n",
"Integrated Brier score = 0.24550026655197144\n"
]
}
],
"source": [
"brier_score = BrierScore()\n",
"\n",
"# brier score at first 5 times\n",
"print(f\"Brier score = {brier_score(surv, event, time)[:5]}\")\n",
"print(f\"Brier score (conf int.) = {brier_score.confidence_interval()[:,:5]}\")\n",
"\n",
"# integrated brier score\n",
"print(f\"Integrated Brier score = {brier_score.integral()}\")"
]
},
{
"cell_type": "markdown",
"id": "0ca1d08c",
"metadata": {},
"source": [
"We can test whether the time-dependent Brier score is smaller than what would be expected if the survival model was not providing accurate predictions beyond random chance. We use a bootstrap permutation test and obtain the p-value with:"
]
},
{
"cell_type": "code",
"execution_count": 25,
"id": "9754fdcd",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Brier score (p-val) = tensor([0.0190, 0.1500, 0.4940, 0.5490, 0.4680])\n"
]
}
],
"source": [
"# H0: bs = bs0, Ha: bs < bs0; where bs0 is the expected brier score if the survival model was not providing accurate predictions beyond random chance.\n",
"\n",
"# p-value for brier score at first 5 times\n",
"print(f\"Brier score (p-val) = {brier_score.p_value(alternative = 'less')[:5]}\")"
]
},
{
"cell_type": "markdown",
"id": "31f7e7f6-8f07-4f82-8653-8d0d2d1ed84f",
"metadata": {},
"source": [
"## Section 3: Models comparison\n",
"\n",
"We can compare the predictive performance of the Cox proportional hazards model against the Weibull AFT model."
]
},
{
"cell_type": "markdown",
"id": "ed057468-ce75-4d3e-a825-71b55effcec8",
"metadata": {},
"source": [
"### Section 3.1: Concordance index\n",
"The statistical test is formulated as follows, H0: cindex cox = cindex weibull, Ha: cindex cox > cindex weibull"
]
},
{
"cell_type": "code",
"execution_count": 26,
"id": "ea66963f-2537-4390-bb65-c773275b292b",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Cox cindex = 0.6610040068626404\n",
"Weibull cindex = 0.4752066135406494\n",
"p-value = 0.018631745129823685\n"
]
}
],
"source": [
"print(f\"Cox cindex = {cox_cindex.cindex}\")\n",
"print(f\"Weibull cindex = {weibull_cindex.cindex}\")\n",
"print(\"p-value = {}\".format(cox_cindex.compare(weibull_cindex)))"
]
},
{
"cell_type": "markdown",
"id": "f478e8df",
"metadata": {},
"source": [
"### Section 3.2: AUC at 5-year\n",
"\n",
"The statistical test is formulated as follows, H0: 5-yr auc cox = 5-yr auc weibull, Ha: 5-yr auc cox > 5-yr auc weibull"
]
},
{
"cell_type": "code",
"execution_count": 27,
"id": "0c4e1651",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Cox 5-yr AUC = tensor([0.6954])\n",
"Weibull 5-yr AUC = tensor([0.5116])\n",
"p-value = tensor([1.5964e-05])\n"
]
}
],
"source": [
"print(f\"Cox 5-yr AUC = {cox_auc.auc}\")\n",
"print(f\"Weibull 5-yr AUC = {weibull_auc.auc}\")\n",
"print(\"p-value = {}\".format(cox_auc.compare(weibull_auc)))"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "torchsurv_env",
"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.14"
}
},
"nbformat": 4,
"nbformat_minor": 5
}