{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Secure Kaplan-Meier Survival Analysis Explained\n",
"\n",
"The MPyC demo [kmsurival.py](kmsurvival.py) implements privacy-preserving Kaplan-Meier [survival analysis](https://en.wikipedia.org/wiki/Survival_analysis), based on earlier work by Meilof Veeningen. The demo is built using the Python package [lifelines](https://pypi.org/project/lifelines/), which provides extensive support for survival\n",
"analysis and includes several datasets. We use lifelines for plotting Kaplan-Meier survival curves, performing logrank tests to compare survival curves, and printing survival tables."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"# use pip (or, conda) to make sure lifelines package is installed:\n",
"!pip -q install lifelines "
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"import os, functools\n",
"import pandas as pd\n",
"import matplotlib.pyplot as plt\n",
"import lifelines.statistics\n",
"from mpyc.runtime import mpc\n",
"mpc.logging(False)\n",
"from lifelines import KaplanMeierFitter\n",
"from kmsurvival import plot_fits, events_to_table, events_from_table, logrank_test, aggregate, agg_logrank_test"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Actual use of the lifelines package is hidden mostly inside the [kmsurival.py](kmsurvival.py) demo, except for the function `lifelines.statistics.logrank_test()` used below to validate the results of the secure computations.\n",
"\n",
"## Kaplan-Meier Analysis\n",
"\n",
"We analyze the aml (\"acute myelogenous leukemia\") dataset, which is also used as a [small example on Wikipedia](https://en.wikipedia.org/wiki/Survival_analysis#Example:_Acute_myelogenous_leukemia_survival_data). The file `aml.csv` (copied from the R package `KMsurv`) contains the raw data for 23 patients. Status 1 stands for the event \"recurrence of aml cancer\" and status 0 means no event (\"censored\")."
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"
\n",
" \n",
"
\n",
"
observation
\n",
"
time
\n",
"
status
\n",
"
group
\n",
"
\n",
" \n",
" \n",
"
\n",
"
12
\n",
"
5
\n",
"
1
\n",
"
2
\n",
"
\n",
"
\n",
"
13
\n",
"
5
\n",
"
1
\n",
"
2
\n",
"
\n",
"
\n",
"
14
\n",
"
8
\n",
"
1
\n",
"
2
\n",
"
\n",
"
\n",
"
15
\n",
"
8
\n",
"
1
\n",
"
2
\n",
"
\n",
"
\n",
"
1
\n",
"
9
\n",
"
1
\n",
"
1
\n",
"
\n",
"
\n",
"
16
\n",
"
12
\n",
"
1
\n",
"
2
\n",
"
\n",
"
\n",
"
2
\n",
"
13
\n",
"
1
\n",
"
1
\n",
"
\n",
"
\n",
"
3
\n",
"
13
\n",
"
0
\n",
"
1
\n",
"
\n",
"
\n",
"
17
\n",
"
16
\n",
"
0
\n",
"
2
\n",
"
\n",
"
\n",
"
4
\n",
"
18
\n",
"
1
\n",
"
1
\n",
"
\n",
"
\n",
"
5
\n",
"
23
\n",
"
1
\n",
"
1
\n",
"
\n",
"
\n",
"
18
\n",
"
23
\n",
"
1
\n",
"
2
\n",
"
\n",
"
\n",
"
19
\n",
"
27
\n",
"
1
\n",
"
2
\n",
"
\n",
"
\n",
"
6
\n",
"
28
\n",
"
0
\n",
"
1
\n",
"
\n",
"
\n",
"
20
\n",
"
30
\n",
"
1
\n",
"
2
\n",
"
\n",
"
\n",
"
7
\n",
"
31
\n",
"
1
\n",
"
1
\n",
"
\n",
"
\n",
"
21
\n",
"
33
\n",
"
1
\n",
"
2
\n",
"
\n",
"
\n",
"
8
\n",
"
34
\n",
"
1
\n",
"
1
\n",
"
\n",
"
\n",
"
22
\n",
"
43
\n",
"
1
\n",
"
2
\n",
"
\n",
"
\n",
"
9
\n",
"
45
\n",
"
0
\n",
"
1
\n",
"
\n",
"
\n",
"
23
\n",
"
45
\n",
"
1
\n",
"
2
\n",
"
\n",
"
\n",
"
10
\n",
"
48
\n",
"
1
\n",
"
1
\n",
"
\n",
"
\n",
"
11
\n",
"
161
\n",
"
0
\n",
"
1
\n",
"
\n",
" \n",
"
\n"
],
"text/plain": [
""
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df = pd.read_csv(os.path.join('data', 'surv', 'aml.csv')).rename(columns={'Unnamed: 0': 'observation', 'cens': 'status'})\n",
"df.sort_values(['time', 'observation']).style.hide(axis='index')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Time is in weeks. The study compares the time until recurrence among two groups of patients. Patients in group 1 received maintenance chemotherapy, while patients in group 2 did not get any maintenance treatment. To plot the [Kaplan–Meier survival curve](https://en.wikipedia.org/wiki/Kaplan–Meier_estimator) for groups 1 and 2, we use the function `plot_fits()` as follows."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"
"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"T1, T2 = df['time'] [df['group'] == 1], df['time'] [df['group'] == 2]\n",
"E1, E2 = df['status'][df['group'] == 1], df['status'][df['group'] == 2]\n",
"kmf1 = KaplanMeierFitter(label='1=Maintained').fit(T1, E1)\n",
"kmf2 = KaplanMeierFitter(label='2=Not maintained').fit(T2, E2)\n",
"plot_fits(kmf1, kmf2, 'Kaplan-Meier survival curves', 'weeks')\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The vertical ticks on the graphs indicate censored events. At the bottom, the number of patients \"at risk\" is shown. The study concerned 11 patients in group 1 with one patient censored after 161 weeks and 12 patients in group 2. A Kaplan-Meier curve estimates the survival probability as a function of time (duration). \n",
"\n",
"In this example, the two curves do not appear to differ very much. To analyze this more precisely one performs a [logrank test](https://en.wikipedia.org/wiki/Logrank_test):"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0.0653393220405049"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"lifelines.statistics.logrank_test(T1, T2, E1, E2).p_value"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The null hypothesis is that survival is the same for both groups. Since $p=0.065$ is not particularly small (e.g., not below $\\alpha=0.05$), the null hypothesis is not strongly rejected. In other words, the logrank test also says that the curves do not differ significantly---with the usual caveat of small sample sizes."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Privacy-Preserving Survival Analysis"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In a multiparty setting, each party holds a private dataset and the goal is to perform a survival analysis on the *union* of all the datasets. To obtain the secure union of the datasets in an efficient way, each private dataset will be represented using two survival tables, one survival table per group of patients. \n",
"\n",
"The survival tables for the aml dataset are available from the Kaplan-Meier fitters `kmf1` and `kmf2`:"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
"
],
"text/plain": [
" removed observed censored entrance at_risk\n",
"event_at \n",
"0.0 0 0 0 12 12\n",
"5.0 2 2 0 0 12\n",
"8.0 2 2 0 0 10\n",
"12.0 1 1 0 0 8\n",
"16.0 1 0 1 0 7\n",
"23.0 1 1 0 0 6\n",
"27.0 1 1 0 0 5\n",
"30.0 1 1 0 0 4\n",
"33.0 1 1 0 0 3\n",
"43.0 1 1 0 0 2\n",
"45.0 1 1 0 0 1"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"display(kmf1.event_table, kmf2.event_table)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Using `mpc.input()`, each party will secret-share its pair of survival tables with all the other parties. To allow for a simple union of the survival tables, however, we modify the representation of the survival tables as follows. \n",
"\n",
"First, we determine when the last event happens, which is at $t=161$ in the example. We compute $maxT$ securely as the maximum over all parties, using the following MPyC one-liner:"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"161"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"secfxp = mpc.SecFxp(64) # logrank tests will require fixed-point arithmetic\n",
"maxT = int(await mpc.output(mpc.max(mpc.input(secfxp(int(df['time'].max()))))))\n",
"timeline = range(1, maxT+1)\n",
"max(timeline)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"All parties use $1..maxT$ as the global timeline. Subsequently, each party pads its own survival tables to cover the entire timeline. This is accomplished by two calls to the function `events_to_table()`, which only keeps the essential information:"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
d1
\n",
"
n1
\n",
"
d2
\n",
"
n2
\n",
"
\n",
" \n",
" \n",
"
\n",
"
1
\n",
"
0
\n",
"
11
\n",
"
0
\n",
"
12
\n",
"
\n",
"
\n",
"
2
\n",
"
0
\n",
"
11
\n",
"
0
\n",
"
12
\n",
"
\n",
"
\n",
"
3
\n",
"
0
\n",
"
11
\n",
"
0
\n",
"
12
\n",
"
\n",
"
\n",
"
4
\n",
"
0
\n",
"
11
\n",
"
0
\n",
"
12
\n",
"
\n",
"
\n",
"
5
\n",
"
0
\n",
"
11
\n",
"
2
\n",
"
12
\n",
"
\n",
"
\n",
"
6
\n",
"
0
\n",
"
11
\n",
"
0
\n",
"
10
\n",
"
\n",
"
\n",
"
7
\n",
"
0
\n",
"
11
\n",
"
0
\n",
"
10
\n",
"
\n",
"
\n",
"
8
\n",
"
0
\n",
"
11
\n",
"
2
\n",
"
10
\n",
"
\n",
"
\n",
"
9
\n",
"
1
\n",
"
11
\n",
"
0
\n",
"
8
\n",
"
\n",
"
\n",
"
10
\n",
"
0
\n",
"
10
\n",
"
0
\n",
"
8
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" d1 n1 d2 n2\n",
"1 0 11 0 12\n",
"2 0 11 0 12\n",
"3 0 11 0 12\n",
"4 0 11 0 12\n",
"5 0 11 2 12\n",
"6 0 11 0 10\n",
"7 0 11 0 10\n",
"8 0 11 2 10\n",
"9 1 11 0 8\n",
"10 0 10 0 8"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"d1, n1 = events_to_table(maxT, T1, E1)\n",
"d2, n2 = events_to_table(maxT, T2, E2)\n",
"pd.DataFrame({'d1': d1, 'n1': n1, 'd2': d2, 'n2': n2}, index=timeline).head(10)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Column `d1` records the number of observed events (\"deaths\") for group 1 on the entire timeline, and column `n1` records the number of patients \"at risk\". Similarly, for group 2. \n",
"\n",
"To obtain the secure union of the privately held datasets, we let all parties secret-share their survival tables and simply add all of these elementwise:"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [],
"source": [
"d1, n1, d2, n2 = (functools.reduce(mpc.vector_add, mpc.input(list(map(secfxp, _)))) for _ in (d1, n1, d2, n2))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The joint dataset (union) is now represented by `d1, n1, d2, n2`. Note that these values are all secret-shared, for example:"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
""
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"d1[0]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Aggregate Kaplan-Meier Curves\n",
"\n",
"We now proceed to analyze the joint dataset in a privacy-preserving way by plotting *aggregated* versions of the Kaplan-Meier curves. The exact Kaplan-Meier curves would reveal too much information about the patients in the study. By aggregating the events over longer time intervals, the amount of information revealed by the curves is reduced. At the same time, however, the aggregated curves may still be helpful to see the overall results for the study---and in any case to serve as a sanity check.\n",
"\n",
"The function `aggregate()` securely adds all the observed (\"death\") events over intervals of a given length (stride). The aggregated values are all output publicly, and used to plot the curves via the function `events_from_table()`:"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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RZcbjz322MpxBx54YKUVIypcd911KwvH5tsee+xR7Ty5rv+kk05i6tSp+QiLNm3a8OWXX65TG56garEWDWp2859z64N69erxl7/8halTpzJu3Dj+/ve/1+hLuVWrVlx11VU1WmchE1Sy1NK6rv+2226jY8eO+QgrLzxBOedqlZYtW7LLLrsAobzQTjvtxOzZuf8+2rVrV5o2bcpzzz23xrQXXniB7t2706VLF0444QR++OEHbrjhBj777DP69+9P//7911imTZs2XHDBBXTr1o0ePXrw5ptvsu+++7L99ttz8803A7B48WL23ntvdtllF7p06cK///3vlctvvPHGQDi669evH0cccQQdOnRg0KBBmFnW9Z922mn06NGDTp06cemll65sq1+/flQUGth444256KKL6Nq1K71792bu3LkAzJs3j8MPP5yePXvSs2fPlV12zJ8/n4EDB9KpUydOOukk8lEEwn+Dcs6VzlPnw+eT89vmll1g/6tzmnXGjBm89dZb7LbbbkDuBWMvuugifv/73zNgwICV45YsWcLgwYN54YUXaNeuHccddxw33XQTZ599Ntdeey2jR4+mWbNmWeNo3bo1EydOZMiQIQwePJixY8eyZMkSOnfuzKmnnkrDhg159NFHadKkCV9++SW9e/fm4IMPXqML9bfeeospU6aw1VZbseeeezJ27FjOPPPMNdZ/1VVXsdlmm7F8+XL23ntvJk2axM4777xaW99++y29e/fmqquu4rzzzuPWW2/l4osv5qyzzmLIkCH06dOHTz/9lH333Zdp06Zx2WWX0adPHy655BKeeOKJGpePysYTlHOuVlq8eDGHH3441113HU2aNAFyLxjbt29fAP773/+uHPfee+/Rtm1b2rULN8Uff/zx/P3vf+fss8+utr2DDz4YgC5durB48WIaN25M48aNadCgAd988w2NGjXiwgsvZMyYMdSpU4fZs2czd+5cttxyy9Xa6dWrF61atQKgW7duzJgxgz59+qyxvgceeIBbbrmFZcuWMWfOHKZOnbpGgtpggw1Wdoy46667rjxifP7551c7Jbpw4UIWL17MmDFjeOSRR4DQBcimm25a7euujico51zp5Hikk29Lly7l8MMPZ9CgQSv7ZoLcj6AgHEVdeeWV1Ku37l+jFV1m1KlTZ7XuM+rUqcOyZcsYMWIE8+bNY8KE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\n",
"text/plain": [
"