{ "cells": [ { "cell_type": "markdown", "id": "bfab1e0b", "metadata": {}, "source": [ "# Bootstrapping model fits\n", "\n", "**Bootstrapping does not really seem superior to simply looking at the *times_seen* parameter for mutations. Model average is the way to go. So this notebook is no longer tested or included in docs and may be obsolete.**\n", "\n", "The previous section describes fitting a single model.\n", "But we may also want to have confidence estimates for the fit.\n", "We can do that via bootstrapping the data set.\n", "\n", "Note however that our current recommendation is to use experimental replicates (see later example on *Averaging models*) rather than bootstrapping whenever possible, as experimental replicates often provide more robust senses of error/variation than just boostrapping a single data set.\n", "\n", "The overall recommended workflow is to first fit models to all the data to determine the number of epitopes, etc.\n", "Then once the desired fitting parameters are determined, you can bootstrap to get confidence on predictions." ] }, { "cell_type": "markdown", "id": "43058260", "metadata": {}, "source": [ "## Get model fit to the data\n", "The first step is just to fit a `Polyclonal` model to all the data we are using.\n", "We do similar to the previous notebook for our RBD example, but first shrink the size of the data set to just 10,000 variants to provide more \"error\" to better illustrate the bootstrapping.\n", "\n", "We will call this model fit to all the data we are using the \"root\" model as it's used as the starting point (root) for the subsequent bootstrapping.\n", "Note that data (which we will bootstrap) are attached to this pre-fit model:" ] }, { "cell_type": "code", "execution_count": 1, "id": "e52a9b62", "metadata": { "execution": { "iopub.execute_input": "2023-02-11T21:21:05.669180Z", "iopub.status.busy": "2023-02-11T21:21:05.668878Z", "iopub.status.idle": "2023-02-11T21:22:36.933752Z", "shell.execute_reply": "2023-02-11T21:22:36.932552Z", "shell.execute_reply.started": "2023-02-11T21:21:05.669155Z" }, "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "# First fitting site-level model.\n", "# Starting optimization of 522 parameters at Sat Feb 11 13:21:17 2023.\n", " step time_sec loss fit_loss reg_escape reg_spread reg_spatial reg_uniqueness reg_uniqueness2 reg_activity\n", " 0 0.02725 2336.7 2335.3 0 0 0 0 0 1.3149\n", " 200 4.463 404.62 393.9 4.9364 0 0 0 0 5.7827\n", " 400 8.9117 391.84 378.82 7.2693 0 0 0 0 5.7481\n", " 600 14.154 389.29 375.83 7.6232 0 0 0 0 5.8309\n", " 800 18.24 388.57 375.18 7.5455 0 0 0 0 5.8444\n", " 896 20.168 388.55 375.13 7.5847 0 0 0 0 5.8429\n", "# Successfully finished at Sat Feb 11 13:21:37 2023.\n", "# Starting optimization of 5796 parameters at Sat Feb 11 13:21:37 2023.\n", " step time_sec loss fit_loss reg_escape reg_spread reg_spatial reg_uniqueness reg_uniqueness2 reg_activity\n", " 0 0.022857 487.5 394 87.656 1.2484e-29 0 0 0 5.8429\n", " 200 4.7855 164.5 90.501 54.697 13.393 0 0 0 5.9093\n", " 400 10.349 137.01 83.114 34.726 13.355 0 0 0 5.8132\n", " 600 15.457 130.8 81.21 30.145 13.622 0 0 0 5.8191\n", " 800 20.864 126.2 79.626 26.891 13.894 0 0 0 5.7891\n", " 1000 26.314 124.55 79.001 25.838 13.917 0 0 0 5.795\n", " 1200 32.369 122.7 78.128 25.254 13.536 0 0 0 5.779\n", " 1400 37.446 121.67 77.746 25.017 13.13 0 0 0 5.7724\n", " 1600 42.602 120.94 77.305 24.876 12.985 0 0 0 5.7707\n", " 1800 47.634 120.61 77.224 24.705 12.907 0 0 0 5.773\n", " 2000 52.373 120.46 77.154 24.611 12.922 0 0 0 5.7708\n", " 2200 57.217 120.17 77.047 24.569 12.787 0 0 0 5.767\n", " 2278 59.502 120.16 77.039 24.567 12.785 0 0 0 5.7665\n", "# Successfully finished at Sat Feb 11 13:22:36 2023.\n" ] } ], "source": [ "# NBVAL_IGNORE_OUTPUT\n", "\n", "import numpy\n", "\n", "import pandas as pd\n", "\n", "from plotnine import *\n", "\n", "import polyclonal\n", "\n", "# read data\n", "noisy_data = (\n", " pd.read_csv(\"RBD_variants_escape_noisy.csv\", na_filter=None)\n", " .query('library == \"avg3muts\"')\n", " .query(\"concentration in [0.25, 1, 4]\")\n", ")\n", "\n", "# just keep some variants to make fitting \"noisier\"\n", "n_keep = 10000\n", "barcodes_to_keep = (\n", " noisy_data[\"barcode\"].drop_duplicates().sample(n_keep, random_state=1).tolist()\n", ")\n", "noisy_data = noisy_data.query(\"barcode in @barcodes_to_keep\")\n", "\n", "# make and fit the root Polyclonal object with all the data we are using\n", "root_poly = polyclonal.Polyclonal(\n", " data_to_fit=noisy_data,\n", " n_epitopes=3,\n", " data_mut_escape_overlap=\"fill_to_data\",\n", ")\n", "\n", "opt_res = root_poly.fit(\n", " logfreq=200,\n", " reg_escape_weight=0.01,\n", " reg_uniqueness2_weight=0,\n", ")" ] }, { "cell_type": "markdown", "id": "9ce0e033", "metadata": {}, "source": [ "## Create and fit bootstrapped models\n", "To create the bootstrapped models, we initialize a `PolyclonalBootstrap`, here just using 5 samples for speed (for real analyses to get good error estimates you may want more on the order of 20 to 100 bootstrap samples).\n", "Note it is important that the root model you are using has already been fit to the data!\n", "Note also that there is a `n_threads` option which specifies how many threads should be used for the bootstrapping: by default it's -1 (use all CPUs available), but set to another number if you want to limit CPU usage:" ] }, { "cell_type": "code", "execution_count": 2, "id": "e59e09be", "metadata": { "execution": { "iopub.execute_input": "2023-02-11T21:22:36.938486Z", "iopub.status.busy": "2023-02-11T21:22:36.938232Z", "iopub.status.idle": "2023-02-11T21:22:39.371514Z", "shell.execute_reply": "2023-02-11T21:22:39.369582Z", "shell.execute_reply.started": "2023-02-11T21:22:36.938461Z" }, "tags": [] }, "outputs": [], "source": [ "n_bootstrap_samples = 5\n", "\n", "bootstrap_poly = polyclonal.PolyclonalBootstrap(\n", " root_polyclonal=root_poly,\n", " n_bootstrap_samples=n_bootstrap_samples,\n", ")" ] }, { "cell_type": "markdown", "id": "664fabf5", "metadata": {}, "source": [ "Now fit the bootstrapped models:" ] }, { "cell_type": "code", "execution_count": 3, "id": "a2075b30", "metadata": { "execution": { "iopub.execute_input": "2023-02-11T21:22:39.377378Z", "iopub.status.busy": "2023-02-11T21:22:39.376885Z", "iopub.status.idle": "2023-02-11T21:23:13.685097Z", "shell.execute_reply": "2023-02-11T21:23:13.684359Z", "shell.execute_reply.started": "2023-02-11T21:22:39.377325Z" }, "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Starting fitting bootstrap models at Sat Feb 11 13:22:39 2023\n", "Fitting took 34.3 seconds, finished at Sat Feb 11 13:23:13 2023\n" ] } ], "source": [ "# NBVAL_IGNORE_OUTPUT\n", "\n", "import time\n", "\n", "start = time.time()\n", "print(f\"Starting fitting bootstrap models at {time.asctime()}\")\n", "n_fit, n_failed = bootstrap_poly.fit_models(\n", " reg_escape_weight=0.01,\n", " reg_uniqueness2_weight=0,\n", ")\n", "print(f\"Fitting took {time.time() - start:.3g} seconds, finished at {time.asctime()}\")\n", "assert n_failed == 0 and n_fit == n_bootstrap_samples" ] }, { "cell_type": "markdown", "id": "4a502236", "metadata": {}, "source": [ "## Look at summarized results\n", "We can get the resulting measurements for the epitope activities and mutation effects both per-replicate and summarized across replicates (mean, median, standard deviation).\n", "\n", "### Epitope activities\n", "Epitope activities.\n", "You can see that we can't actually really resolve the class 1 epitope here, as it has negative activity. This is probably because we are using a smaller data set than the full simulated data set fit in the prior example, and so there isn't enough data to effectively resolve this epitope.\n", "When you get a result like this, you should probably re-fit the model with just two epitopes:" ] }, { "cell_type": "code", "execution_count": 4, "id": "c2a2c99c", "metadata": { "execution": { "iopub.execute_input": "2023-02-11T21:23:13.689715Z", "iopub.status.busy": "2023-02-11T21:23:13.689450Z", "iopub.status.idle": "2023-02-11T21:23:13.778774Z", "shell.execute_reply": "2023-02-11T21:23:13.778009Z", "shell.execute_reply.started": "2023-02-11T21:23:13.689694Z" }, "tags": [] }, "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", "
epitopeactivity_meanactivity_medianactivity_std
012.52.50.0
123.53.50.0
23-0.1-0.10.0
\n", "
" ], "text/plain": [ " epitope activity_mean activity_median activity_std\n", "0 1 2.5 2.5 0.0\n", "1 2 3.5 3.5 0.0\n", "2 3 -0.1 -0.1 0.0" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "\n", "
\n", "" ], "text/plain": [ "alt.LayerChart(...)" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# NBVAL_IGNORE_OUTPUT\n", "display(bootstrap_poly.activity_wt_df.round(1))\n", "\n", "bootstrap_poly.activity_wt_barplot()" ] }, { "cell_type": "markdown", "id": "3cfe4b76", "metadata": {}, "source": [ "### Mutation escape values\n", "Mutation escape values for each replicate:" ] }, { "cell_type": "code", "execution_count": 5, "id": "65a523a9", "metadata": { "execution": { "iopub.execute_input": "2023-02-11T21:23:13.782347Z", "iopub.status.busy": "2023-02-11T21:23:13.782119Z", "iopub.status.idle": "2023-02-11T21:23:14.006538Z", "shell.execute_reply": "2023-02-11T21:23:14.006077Z", "shell.execute_reply.started": "2023-02-11T21:23:13.782331Z" }, "tags": [] }, "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
epitopesitewildtypemutantmutationescapetimes_seenbootstrap_replicate
01331NAN331A0.0141
11331NDN331D-0.1111
21331NEN331E-0.0151
31331NFN331F0.0141
41331NGN331G0.0211
\n", "
" ], "text/plain": [ " epitope site wildtype mutant mutation escape times_seen \\\n", "0 1 331 N A N331A 0.0 14 \n", "1 1 331 N D N331D -0.1 11 \n", "2 1 331 N E N331E -0.0 15 \n", "3 1 331 N F N331F 0.0 14 \n", "4 1 331 N G N331G 0.0 21 \n", "\n", " bootstrap_replicate \n", "0 1 \n", "1 1 \n", "2 1 \n", "3 1 \n", "4 1 " ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# NBVAL_IGNORE_OUTPUT\n", "bootstrap_poly.mut_escape_df_replicates.round(1).head()" ] }, { "cell_type": "markdown", "id": "0e1405fc", "metadata": {}, "source": [ "Mutation escape values summarizes across replicates.\n", "Note the `frac_bootstrap_replicates` column has the fraction of bootstrap replicates with a value for this mutation:" ] }, { "cell_type": "code", "execution_count": 6, "id": "c3b2a945", "metadata": { "execution": { "iopub.execute_input": "2023-02-11T21:23:14.008843Z", "iopub.status.busy": "2023-02-11T21:23:14.008651Z", "iopub.status.idle": "2023-02-11T21:23:14.479740Z", "shell.execute_reply": "2023-02-11T21:23:14.479243Z", "shell.execute_reply.started": "2023-02-11T21:23:14.008827Z" }, "tags": [] }, "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
epitopesitewildtypemutantmutationescape_meanescape_medianescape_stdn_modelstimes_seenfrac_models
01331NAN331A-0.1-0.20.1515.01.0
11331NDN331D0.1-0.00.359.81.0
21331NEN331E0.0-0.00.1513.01.0
\n", "
" ], "text/plain": [ " epitope site wildtype mutant mutation escape_mean escape_median \\\n", "0 1 331 N A N331A -0.1 -0.2 \n", "1 1 331 N D N331D 0.1 -0.0 \n", "2 1 331 N E N331E 0.0 -0.0 \n", "\n", " escape_std n_models times_seen frac_models \n", "0 0.1 5 15.0 1.0 \n", "1 0.3 5 9.8 1.0 \n", "2 0.1 5 13.0 1.0 " ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# NBVAL_IGNORE_OUTPUT\n", "bootstrap_poly.mut_escape_df.round(1).head(n=3)" ] }, { "cell_type": "markdown", "id": "691489ba", "metadata": {}, "source": [ "We can plot the mutation escape values across replicates.\n", "The dropdown selects the statistic shown in the heatmap (mean or median), and mouseovers give details on points.\n", "Here we initialize `times_seen=2` in the slider to initially only show escape values for mutations observed in at least 2 variants, although this can be adjusted via a slider:" ] }, { "cell_type": "code", "execution_count": 18, "id": "4a9c693f", "metadata": { "execution": { "iopub.execute_input": "2023-02-11T21:25:47.091651Z", "iopub.status.busy": "2023-02-11T21:25:47.091190Z", "iopub.status.idle": "2023-02-11T21:25:49.334835Z", "shell.execute_reply": "2023-02-11T21:25:49.333920Z", "shell.execute_reply.started": "2023-02-11T21:25:47.091614Z" }, "tags": [] }, "outputs": [ { "data": { "text/html": [ "\n", "
\n", "" ], "text/plain": [ "alt.VConcatChart(...)" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# NBVAL_IGNORE_OUTPUT\n", "bootstrap_poly.mut_escape_plot(\n", " addtl_slider_stats={\"times_seen\": 2}, per_model_tooltip=False\n", ")" ] }, { "cell_type": "markdown", "id": "02fc8bf8", "metadata": {}, "source": [ "### Site summaries of mutation escape\n", "Site summaries of mutation escape values for replicates:" ] }, { "cell_type": "code", "execution_count": 8, "id": "0172f947", "metadata": { "execution": { "iopub.execute_input": "2023-02-11T21:23:17.469747Z", "iopub.status.busy": "2023-02-11T21:23:17.468712Z", "iopub.status.idle": "2023-02-11T21:23:17.688184Z", "shell.execute_reply": "2023-02-11T21:23:17.687547Z", "shell.execute_reply.started": "2023-02-11T21:23:17.469685Z" }, "tags": [] }, "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", " \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", "
epitopesitewildtypemeantotal positivemaxmintotal negativen mutationsbootstrap_replicate
01331N0.12.30.9-0.3-0.8161
11332I0.12.90.7-0.2-0.3191
21333T-0.00.90.6-0.4-1.4181
31334N0.02.01.0-0.6-2.0181
41335L0.01.50.3-0.5-1.3191
\n", "
" ], "text/plain": [ " epitope site wildtype mean total positive max min total negative \\\n", "0 1 331 N 0.1 2.3 0.9 -0.3 -0.8 \n", "1 1 332 I 0.1 2.9 0.7 -0.2 -0.3 \n", "2 1 333 T -0.0 0.9 0.6 -0.4 -1.4 \n", "3 1 334 N 0.0 2.0 1.0 -0.6 -2.0 \n", "4 1 335 L 0.0 1.5 0.3 -0.5 -1.3 \n", "\n", " n mutations bootstrap_replicate \n", "0 16 1 \n", "1 19 1 \n", "2 18 1 \n", "3 18 1 \n", "4 19 1 " ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# NBVAL_IGNORE_OUTPUT\n", "bootstrap_poly.mut_escape_site_summary_df_replicates().round(1).head()" ] }, { "cell_type": "markdown", "id": "181d9bda", "metadata": {}, "source": [ "Site summaries of mutation escape values summarized (e.g., averaged) across replicates.\n", "Note that the `metric` column now indicates a different row for each site-summary metric type, which is then summarized by its mean, median, and standard deviation.\n", "We calculate these statistics only over mutations observed in at least 2 variants:" ] }, { "cell_type": "code", "execution_count": 9, "id": "b24f796e", "metadata": { "execution": { "iopub.execute_input": "2023-02-11T21:23:17.691175Z", "iopub.status.busy": "2023-02-11T21:23:17.690938Z", "iopub.status.idle": "2023-02-11T21:23:17.924153Z", "shell.execute_reply": "2023-02-11T21:23:17.923423Z", "shell.execute_reply.started": "2023-02-11T21:23:17.691156Z" }, "tags": [] }, "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", " \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", "
epitopesitewildtypemetricescape_meanescape_medianescape_stdn_modelsfrac_modelsn mutations
01331Nmax0.70.70.151.016.0
11331Nmean0.10.10.151.016.0
21331Nmin-0.2-0.30.151.016.0
31331Ntotal negative-0.7-0.80.451.016.0
41331Ntotal positive2.72.50.751.016.0
\n", "
" ], "text/plain": [ " epitope site wildtype metric escape_mean escape_median \\\n", "0 1 331 N max 0.7 0.7 \n", "1 1 331 N mean 0.1 0.1 \n", "2 1 331 N min -0.2 -0.3 \n", "3 1 331 N total negative -0.7 -0.8 \n", "4 1 331 N total positive 2.7 2.5 \n", "\n", " escape_std n_models frac_models n mutations \n", "0 0.1 5 1.0 16.0 \n", "1 0.1 5 1.0 16.0 \n", "2 0.1 5 1.0 16.0 \n", "3 0.4 5 1.0 16.0 \n", "4 0.7 5 1.0 16.0 " ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# NBVAL_IGNORE_OUTPUT\n", "bootstrap_poly.mut_escape_site_summary_df(min_times_seen=2).round(1).head()" ] }, { "cell_type": "markdown", "id": "844ce337", "metadata": {}, "source": [ "## Predictions of ICXXs and probabilities of escape\n", "We can also use the bootstrapped models to predict the escape properties of new variants.\n", "\n", "To illustrate, first get the data we used to fit the model along with the true IC90s for these:" ] }, { "cell_type": "code", "execution_count": 10, "id": "14b3c544", "metadata": { "execution": { "iopub.execute_input": "2023-02-11T21:23:17.925322Z", "iopub.status.busy": "2023-02-11T21:23:17.925019Z", "iopub.status.idle": "2023-02-11T21:23:17.936131Z", "shell.execute_reply": "2023-02-11T21:23:17.935307Z", "shell.execute_reply.started": "2023-02-11T21:23:17.925303Z" }, "tags": [] }, "outputs": [], "source": [ "true_data = noisy_data[[\"aa_substitutions\", \"IC90\"]].drop_duplicates()" ] }, { "cell_type": "markdown", "id": "76e33528", "metadata": {}, "source": [ "Next we get the IC90s for each variant and replicate:" ] }, { "cell_type": "code", "execution_count": 11, "id": "811e86ce", "metadata": { "execution": { "iopub.execute_input": "2023-02-11T21:23:17.937185Z", "iopub.status.busy": "2023-02-11T21:23:17.936903Z", "iopub.status.idle": "2023-02-11T21:23:32.032419Z", "shell.execute_reply": "2023-02-11T21:23:32.031756Z", "shell.execute_reply.started": "2023-02-11T21:23:17.937166Z" }, "tags": [] }, "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", "
aa_substitutionsIC90predicted_IC90bootstrap_replicate
00.10.11
1G339Q0.10.11
2D427E0.10.11
\n", "
" ], "text/plain": [ " aa_substitutions IC90 predicted_IC90 bootstrap_replicate\n", "0 0.1 0.1 1\n", "1 G339Q 0.1 0.1 1\n", "2 D427E 0.1 0.1 1" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# NBVAL_IGNORE_OUTPUT\n", "\n", "bootstrap_poly.icXX_replicates(true_data, x=0.9, col=\"predicted_IC90\").round(1).head(\n", " n=3\n", ")" ] }, { "cell_type": "markdown", "id": "18a0fb42", "metadata": {}, "source": [ "More often, we want to summarize across replicates with mean / median / standard deviation:" ] }, { "cell_type": "code", "execution_count": 12, "id": "4cc38a49", "metadata": { "execution": { "iopub.execute_input": "2023-02-11T21:23:32.033574Z", "iopub.status.busy": "2023-02-11T21:23:32.033287Z", "iopub.status.idle": "2023-02-11T21:23:42.196034Z", "shell.execute_reply": "2023-02-11T21:23:42.195467Z", "shell.execute_reply.started": "2023-02-11T21:23:32.033555Z" }, "tags": [] }, "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", "
aa_substitutionsIC90mean_predicted_IC90median_predicted_IC90std_predicted_IC90n_modelsfrac_models
00.10.10.10.051.0
1A344E0.10.10.10.051.0
2A344E A363I T385S L517V0.20.20.10.051.0
\n", "
" ], "text/plain": [ " aa_substitutions IC90 mean_predicted_IC90 median_predicted_IC90 \\\n", "0 0.1 0.1 0.1 \n", "1 A344E 0.1 0.1 0.1 \n", "2 A344E A363I T385S L517V 0.2 0.2 0.1 \n", "\n", " std_predicted_IC90 n_models frac_models \n", "0 0.0 5 1.0 \n", "1 0.0 5 1.0 \n", "2 0.0 5 1.0 " ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# NBVAL_IGNORE_OUTPUT\n", "\n", "pred_ic90s = bootstrap_poly.icXX(true_data, x=0.9, col=\"predicted_IC90\", max_c=50)\n", "\n", "pred_ic90s.round(1).head(n=3)" ] }, { "cell_type": "markdown", "id": "12ff99c5", "metadata": {}, "source": [ "Plot the mean predictions against actual IC90s:" ] }, { "cell_type": "code", "execution_count": 13, "id": "cc1871e1", "metadata": { "execution": { "iopub.execute_input": "2023-02-11T21:23:42.197056Z", "iopub.status.busy": "2023-02-11T21:23:42.196781Z", "iopub.status.idle": "2023-02-11T21:23:42.997665Z", "shell.execute_reply": "2023-02-11T21:23:42.997020Z", "shell.execute_reply.started": "2023-02-11T21:23:42.197040Z" }, "tags": [] }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# NBVAL_IGNORE_OUTPUT\n", "\n", "p = (\n", " ggplot(pred_ic90s)\n", " + aes(\"IC90\", \"mean_predicted_IC90\")\n", " + geom_point()\n", " + scale_x_log10()\n", " + scale_y_log10()\n", ")\n", "\n", "_ = p.draw()" ] }, { "cell_type": "markdown", "id": "2bb3cde2", "metadata": {}, "source": [ "Predictions are fairly well correlated with actual values:" ] }, { "cell_type": "code", "execution_count": 14, "id": "bc557c6c", "metadata": { "execution": { "iopub.execute_input": "2023-02-11T21:23:42.998796Z", "iopub.status.busy": "2023-02-11T21:23:42.998577Z", "iopub.status.idle": "2023-02-11T21:23:43.010633Z", "shell.execute_reply": "2023-02-11T21:23:43.010011Z", "shell.execute_reply.started": "2023-02-11T21:23:42.998778Z" }, "tags": [] }, "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", "
IC90mean_predicted_IC90
IC901.000.95
mean_predicted_IC900.951.00
\n", "
" ], "text/plain": [ " IC90 mean_predicted_IC90\n", "IC90 1.00 0.95\n", "mean_predicted_IC90 0.95 1.00" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "numpy.log(pred_ic90s[[\"IC90\", \"mean_predicted_IC90\"]]).corr().round(2)" ] }, { "cell_type": "markdown", "id": "d9b1c7ac", "metadata": {}, "source": [ "They are better correlated if we look only at mutations seen in many variants:" ] }, { "cell_type": "code", "execution_count": 15, "id": "df27251e", "metadata": { "execution": { "iopub.execute_input": "2023-02-11T21:23:43.011700Z", "iopub.status.busy": "2023-02-11T21:23:43.011440Z", "iopub.status.idle": "2023-02-11T21:23:43.032114Z", "shell.execute_reply": "2023-02-11T21:23:43.031452Z", "shell.execute_reply.started": "2023-02-11T21:23:43.011680Z" }, "tags": [] }, "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", "
IC90mean_predicted_IC90
IC901.000.95
mean_predicted_IC900.951.00
\n", "
" ], "text/plain": [ " IC90 mean_predicted_IC90\n", "IC90 1.00 0.95\n", "mean_predicted_IC90 0.95 1.00" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "numpy.log(\n", " bootstrap_poly.root_polyclonal.filter_variants_by_seen_muts(\n", " pred_ic90s,\n", " min_times_seen=20,\n", " )[[\"IC90\", \"mean_predicted_IC90\"]]\n", ").corr().round(2)" ] }, { "cell_type": "markdown", "id": "732e6e1b", "metadata": {}, "source": [ "We can also directly get the predicted probabilities of escape for variants at differenct concentration per bootstrap replicate:" ] }, { "cell_type": "code", "execution_count": 16, "id": "d29b82ba", "metadata": { "execution": { "iopub.execute_input": "2023-02-11T21:23:43.033206Z", "iopub.status.busy": "2023-02-11T21:23:43.032923Z", "iopub.status.idle": "2023-02-11T21:23:46.956137Z", "shell.execute_reply": "2023-02-11T21:23:46.955554Z", "shell.execute_reply.started": "2023-02-11T21:23:43.033189Z" }, "tags": [] }, "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", " \n", " \n", " \n", " \n", " \n", " \n", "
aa_substitutionsIC90concentrationpredicted_prob_escapebootstrap_replicate
00.0810.001
1A344E0.1210.001
2A344E A363I T385S L517V0.2210.001
3A344E K356Y S373F V445P0.3710.031
4A344E K378L G381R Q474G H519R R346K0.1310.001
\n", "
" ], "text/plain": [ " aa_substitutions IC90 concentration \\\n", "0 0.08 1 \n", "1 A344E 0.12 1 \n", "2 A344E A363I T385S L517V 0.22 1 \n", "3 A344E K356Y S373F V445P 0.37 1 \n", "4 A344E K378L G381R Q474G H519R R346K 0.13 1 \n", "\n", " predicted_prob_escape bootstrap_replicate \n", "0 0.00 1 \n", "1 0.00 1 \n", "2 0.00 1 \n", "3 0.03 1 \n", "4 0.00 1 " ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# NBVAL_IGNORE_OUTPUT\n", "\n", "bootstrap_poly.prob_escape_replicates(true_data, concentrations=[1, 4]).round(2).head()" ] }, { "cell_type": "markdown", "id": "670bc095", "metadata": {}, "source": [ "Or summarized across replicates:" ] }, { "cell_type": "code", "execution_count": 17, "id": "55fd92fb", "metadata": { "execution": { "iopub.execute_input": "2023-02-11T21:23:46.957107Z", "iopub.status.busy": "2023-02-11T21:23:46.956862Z", "iopub.status.idle": "2023-02-11T21:23:50.685837Z", "shell.execute_reply": "2023-02-11T21:23:50.685217Z", "shell.execute_reply.started": "2023-02-11T21:23:46.957091Z" }, "tags": [] }, "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
aa_substitutionsIC90mean_predicted_prob_escapemedian_predicted_prob_escapestd_predicted_prob_escapen_modelsfrac_models
00.080.000.000.00102.0
1A344E0.120.000.000.00102.0
2A344E A363I T385S L517V0.220.000.000.00102.0
3A344E K356Y S373F V445P0.370.020.020.02102.0
4A344E K378L G381R Q474G H519R R346K0.130.000.000.00102.0
\n", "
" ], "text/plain": [ " aa_substitutions IC90 mean_predicted_prob_escape \\\n", "0 0.08 0.00 \n", "1 A344E 0.12 0.00 \n", "2 A344E A363I T385S L517V 0.22 0.00 \n", "3 A344E K356Y S373F V445P 0.37 0.02 \n", "4 A344E K378L G381R Q474G H519R R346K 0.13 0.00 \n", "\n", " median_predicted_prob_escape std_predicted_prob_escape n_models \\\n", "0 0.00 0.00 10 \n", "1 0.00 0.00 10 \n", "2 0.00 0.00 10 \n", "3 0.02 0.02 10 \n", "4 0.00 0.00 10 \n", "\n", " frac_models \n", "0 2.0 \n", "1 2.0 \n", "2 2.0 \n", "3 2.0 \n", "4 2.0 " ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# NBVAL_IGNORE_OUTPUT\n", "\n", "pred_prob_escape = bootstrap_poly.prob_escape(true_data, concentrations=[1, 4])\n", "\n", "pred_prob_escape.round(2).head()" ] } ], "metadata": { "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.11.0" } }, "nbformat": 4, "nbformat_minor": 5 }