{ "cells": [ { "cell_type": "code", "execution_count": null, "metadata": { "pycharm": {} }, "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "import numpy as np\n", "import pandas as pd\n", "\n", "import wot" ] }, { "cell_type": "markdown", "metadata": { "pycharm": {} }, "source": [ "# Notebook 2: Computing transport matrices\n", "\n", "In this notebook we compute transport matrices connecting each pair of time-points, and we examine the effect of each parameter on the solution. \n", "\n", "To compute the transport matrix $\\pi_{t_1,t_2}$ connecting cells $x_1, \\ldots, x_n$ at time $t_1$ to cells $y_1, \\ldots, y_m$ at time $t_2$, we solve an optimization problem over all matrices $\\pi$ that obey certain row-sum and column-sum constraints. \n", "These constraints ensure that the total amount of mass flowing out of each cell $x_i$ and into each cell $y_j$ adds up the correct amount. \n", "We select the transport matrix with the lowest possible transport cost, subject to these constraints. \n", "\n", "The amount of mass flowing out of each cell $x_i$ depends on the *growth rate* of the cell. We do this in step 1 below, before proceeding to computing transport maps in step 2. \n" ] }, { "cell_type": "markdown", "metadata": { "pycharm": {} }, "source": [ "# Step 1: Construct initial estimate of cell growth rates (optional)\n", "\n", "Before computing transport maps, we first form an initial estimate of the cell growth rate function $g(x)$. \n", "We do this using signatures of proliferation and apoptosis computed in Notebook 1. \n", "Note that we refine this initial estimate using unbalanced optimal transport, as explained later in this notebook. \n", "\n", "We model cellular growth with a Birth-Death Process, which assigns each cell $x$ a *rate* of division $\\beta(x)$ and a rate of death $\\delta(x)$. \n", "In a small interval of time $dt$, these *rates* imply that the probability of a division is $\\beta(x)dt$, and the probability of death is $\\delta(x) dt$. \n", "The expected number of descendants after time $dt = t_2 - t_1$ is $e^{dt(\\beta(x) - \\delta(x))}$.\n", "\n", "To compute the birth (i.e. division) rate and death rate, we apply a logistic function to transform the gene set scores into biologically plausible vaules for our reprogramming dataset (where the most proliferative cells double every 9 hours, and the least proliferative cells double every 60 hours). " ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "pycharm": {} }, "outputs": [], "source": [ "# load proliferation and apoptosis scores\n", "gene_set_scores = pd.read_csv('data/gene_set_scores.csv', index_col=0)\n", "proliferation=gene_set_scores['Cell.cycle']\n", "apoptosis = gene_set_scores['Apoptosis']\n", "\n", "# apply logistic function to transform to birth rate and death rate\n", "def logistic(x, L, k, x0=0):\n", " f = L / (1 + np.exp(-k * (x - x0)))\n", " return f\n", "def gen_logistic(p, beta_max, beta_min, pmax, pmin, center, width):\n", " return beta_min + logistic(p, L=beta_max - beta_min, k=4 / width, x0=center)\n", "\n", "def beta(p, beta_max=1.7, beta_min=0.3, pmax=1.0, pmin=-0.5, center=0.25):\n", " return gen_logistic(p, beta_max, beta_min, pmax, pmin, center, width=0.5)\n", "\n", "def delta(a, delta_max=1.7, delta_min=0.3, amax=0.5, amin=-0.4, center=0.1):\n", " return gen_logistic(a, delta_max, delta_min, amax, amin, center,\n", " width=0.2)\n", "\n", "birth = beta(proliferation)\n", "death = delta(apoptosis)\n", "\n", "# growth rate is given by \n", "gr = np.exp(birth-death)\n", "growth_rates_df = pd.DataFrame(index=gene_set_scores.index, data={'cell_growth_rate':gr})\n", "growth_rates_df.to_csv('data/growth_gs_init.txt')" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "j1JdUgTXawEJ", "pycharm": {} }, "source": [ "# Step 2: Compute transport maps\n", "\n", "We are now ready to compute transport maps. \n", "\n", "The next code block reads in the expression matrix, cell days, and the initial cell growth rates we computed in step 1 above. If the cell growth rates are not provided, the algorithm will assume each cell grows at roughly the same rate. Note that the expression matrix we use here contains variable gene expression data of 1,400 genes from two time-course experiments, and we apply a filter to select cells from the serum time course. " ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "colab": {}, "colab_type": "code", "id": "OgHGRa2aIax6", "pycharm": {} }, "outputs": [ { "data": { "text/plain": [ "(175472, 1479)" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "VAR_GENE_DS_PATH = 'data/ExprMatrix.var.genes.h5ad'\n", "CELL_DAYS_PATH = 'data/cell_days.txt'\n", "SERUM_CELL_IDS_PATH = 'data/serum_cell_ids.txt'\n", "CELL_GROWTH_PATH = 'data/growth_gs_init.txt'\n", "\n", "# load data\n", "adata = wot.io.read_dataset(VAR_GENE_DS_PATH, obs=[CELL_DAYS_PATH, CELL_GROWTH_PATH], obs_filter=SERUM_CELL_IDS_PATH)\n", "adata.shape" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "eXxmqmQua1I0", "pycharm": {} }, "source": [ "# The optimization problem\n", "\n", "We solve the following *unbalanced transport* optimization problem introduced in Chizat et al 2018, where we only enforce the row-sum constraints approximately and we add entropy to the transport matrix: \n", "\n", "\\begin{equation}\n", "\\begin{aligned}\n", "\\underset{\\pi}{\\text{minimize}} & \\qquad \\iint c(x,y) \\pi(x,y) dx dy - \\epsilon \\int \\pi(x,y) \\log \\pi(x,y) dx dy \\\\\n", "&\\qquad + \\lambda_2 {\\text{KL}} \\left ( \\int \\pi(x,y) dx \\Big \\vert d \\hat {\\mathbb{P}}_{t_2} (y) \\int g(x)^{t_2 - t_1} d \\hat {\\mathbb{P}}_{t_1}(x) \\right ) \\\\ \n", "& \\qquad + \\lambda_1 {\\text{KL}} \\left ( \\int \\pi(x,y) dy \\Big \\vert d \\hat {\\mathbb{P}}_{t_1} (x) g(x)^{t_2 - t_1} \\right). \n", "\\end{aligned}\n", "\\end{equation}\n", "\n", "Here we use the notation $\\hat {\\mathbb{P}}_{t_k} = \\frac 1 n \\sum_{i=1}^n \\delta_{x_i}$ for the empirical distribution of samples $x_1,\\ldots,x_n$ at time $t_k$, and $\\text{KL}(P \\vert Q)$ denotes the KL-divergence between distributions $P$ and $Q$. The function $c(x,y)$ encodes the cost of transporting a unit mass from $x$ to $y$. We define $c(x,y)$ to be the squared euclidean distance between cells in local PCA space. This PCA space is computed separately for each pair of time-points. Finally, the function $g(x)$ encodes the growth rate of cell $x$, and is used to specify the budget of descendant mass for each cell $x_i$ at time $t_1$. \n", "\n", "The optimization problem has three regularization parameters: \n", "* $\\epsilon$ controls the degree of entropy in the transport map. \n", "A larger value gives more entropic descendant distributions, where cells are able to obtain more fates. \n", "* $\\lambda_1$ controls the constraint on the row sums of $\\pi_{t_1,t_2}$, which depend on the growth rate function $g(x)$ \n", "A smaller value of $\\lambda_1$ enforces the constraints less strictly, which is useful when we do not have precise information about $g(x)$.\n", "* $\\lambda_2$ controls the constraint on the column sums of $\\pi_{t_1,t_2}$.\n", "\n", "In the following code block we initialize an OTModel, which is parameterized by $\\epsilon, \\lambda_1, \\lambda_2$." ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 34 }, "colab_type": "code", "executionInfo": { "elapsed": 1558, "status": "ok", "timestamp": 1556313217324, "user": { "displayName": "Joshua Gould", "photoUrl": "", "userId": "09978885733763067346" }, "user_tz": 240 }, "id": "YKuGivoIca9G", "outputId": "c0639c77-d5ed-4e9e-9130-b994bfad5e9c", "pycharm": {} }, "outputs": [], "source": [ "# create OTModel\n", "ot_model = wot.ot.OTModel(adata,epsilon = 0.05, lambda1 = 1,lambda2 = 50) " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can now use the OTModel to compute transport maps between any pair of time-points. " ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "# Compute a single transport map from day 7 to 7.5\n", "tmap_annotated = ot_model.compute_transport_map(7,7.5)" ] }, { "cell_type": "markdown", "metadata": { "pycharm": {} }, "source": [ "The object tmap_annotated is an annotated transport matrix, and tmap_annotated.X contains the actual numerical matrix. \n", "Both rows and columns are annotated with cell barcodes and cell growth rates (just along rows). These annotations are accessed as follows: " ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "pycharm": {}, "scrolled": true }, "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
g0g1
index
D7_Dox_C1_AAACCTGAGGAATCGC-11.2688950.977589
D7_Dox_C1_AAACCTGAGTAGATGT-12.9786602.510199
D7_Dox_C1_AAACCTGCAACCGCCA-11.8719181.789104
D7_Dox_C1_AAACCTGCACTATCTT-13.0729892.790364
D7_Dox_C1_AAACCTGCAGCCTGTG-11.0262250.918584
D7_Dox_C1_AAACCTGCATATACGC-11.4125821.366065
D7_Dox_C1_AAACCTGCATCCGTGG-11.1825961.144585
D7_Dox_C1_AAACCTGTCGGAATCT-10.9826871.047557
D7_Dox_C1_AAACGGGGTAGTACCT-10.4172770.443068
D7_Dox_C1_AAACGGGTCTCTTATG-10.3487610.282756
D7_Dox_C1_AAACGGGTCTGGGCCA-12.6361222.038604
D7_Dox_C1_AAACGGGTCTGTCAAG-10.3992070.446110
D7_Dox_C1_AAAGATGAGAGAGCTC-11.5647381.329046
D7_Dox_C1_AAAGATGAGAGTACAT-11.4854961.384023
D7_Dox_C1_AAAGATGAGATCCGAG-10.6994110.789952
D7_Dox_C1_AAAGATGAGGGCACTA-11.7765691.709204
D7_Dox_C1_AAAGATGCACTTAACG-10.9901880.850556
D7_Dox_C1_AAAGATGGTCCCTTGT-13.4472983.750008
D7_Dox_C1_AAAGATGTCCGCAAGC-10.4058940.475874
D7_Dox_C1_AAAGATGTCGCGTTTC-11.2911901.144758
D7_Dox_C1_AAAGATGTCGTGGACC-13.4671862.937608
D7_Dox_C1_AAAGCAAAGAGTACCG-12.4570921.622737
D7_Dox_C1_AAAGCAATCACTTATC-11.2553581.328561
D7_Dox_C1_AAAGTAGAGAGTTGGC-11.7552481.891669
D7_Dox_C1_AAAGTAGAGCTAACTC-11.6520051.428341
D7_Dox_C1_AAAGTAGAGGAGTACC-10.5438270.574121
D7_Dox_C1_AAAGTAGCAGTTTACG-12.8819752.747883
D7_Dox_C1_AAAGTAGCATTAACCG-11.1172990.860455
D7_Dox_C1_AAAGTAGGTACTCGCG-12.7651292.744694
D7_Dox_C1_AAAGTAGTCTCGATGA-11.4267131.493590
.........
D7_Dox_C2_TTTATGCCAAACTGCT-10.5461270.668312
D7_Dox_C2_TTTATGCCACATGACT-13.4063303.133376
D7_Dox_C2_TTTATGCCATACTCTT-12.1495021.922778
D7_Dox_C2_TTTATGCGTGGCCCTA-12.5830772.744961
D7_Dox_C2_TTTATGCGTTTAAGCC-13.2678802.653814
D7_Dox_C2_TTTATGCTCAATAAGG-10.6817960.808452
D7_Dox_C2_TTTATGCTCATTATCC-13.6855062.870278
D7_Dox_C2_TTTATGCTCCTTGACC-10.3375860.440907
D7_Dox_C2_TTTATGCTCCTTTCTC-12.8567742.429800
D7_Dox_C2_TTTATGCTCTTGGGTA-10.4254220.620381
D7_Dox_C2_TTTCCTCCATCGATTG-10.2677480.358732
D7_Dox_C2_TTTCCTCGTAGTACCT-12.5774532.360288
D7_Dox_C2_TTTCCTCGTTATGCGT-10.9594501.076300
D7_Dox_C2_TTTCCTCTCCTTAATC-13.2753543.232358
D7_Dox_C2_TTTCCTCTCGATGAGG-10.4700760.660028
D7_Dox_C2_TTTCCTCTCTGTTTGT-12.6425292.428539
D7_Dox_C2_TTTGCGCTCTTACCGC-10.2573520.273753
D7_Dox_C2_TTTGGTTAGCGAGAAA-10.2949040.404630
D7_Dox_C2_TTTGGTTAGGACACCA-10.5122390.583090
D7_Dox_C2_TTTGGTTCAAAGGTGC-11.4950611.318807
D7_Dox_C2_TTTGGTTGTGATGATA-12.3254062.188960
D7_Dox_C2_TTTGGTTGTTGAACTC-10.3211370.383881
D7_Dox_C2_TTTGGTTTCGTACCGG-11.5245281.443170
D7_Dox_C2_TTTGGTTTCTAACGGT-10.7925680.755125
D7_Dox_C2_TTTGTCAAGTGTCCCG-10.8414140.897749
D7_Dox_C2_TTTGTCAAGTTAGCGG-10.3385310.370486
D7_Dox_C2_TTTGTCACAGTGGAGT-10.5825840.609164
D7_Dox_C2_TTTGTCAGTAATTGGA-10.2549260.296702
D7_Dox_C2_TTTGTCATCGTGACAT-10.5947150.876372
D7_Dox_C2_TTTGTCATCTCCCTGA-11.1984711.539571
\n", "

6507 rows × 2 columns

\n", "
" ], "text/plain": [ " g0 g1\n", "index \n", "D7_Dox_C1_AAACCTGAGGAATCGC-1 1.268895 0.977589\n", "D7_Dox_C1_AAACCTGAGTAGATGT-1 2.978660 2.510199\n", "D7_Dox_C1_AAACCTGCAACCGCCA-1 1.871918 1.789104\n", "D7_Dox_C1_AAACCTGCACTATCTT-1 3.072989 2.790364\n", "D7_Dox_C1_AAACCTGCAGCCTGTG-1 1.026225 0.918584\n", "D7_Dox_C1_AAACCTGCATATACGC-1 1.412582 1.366065\n", "D7_Dox_C1_AAACCTGCATCCGTGG-1 1.182596 1.144585\n", "D7_Dox_C1_AAACCTGTCGGAATCT-1 0.982687 1.047557\n", "D7_Dox_C1_AAACGGGGTAGTACCT-1 0.417277 0.443068\n", "D7_Dox_C1_AAACGGGTCTCTTATG-1 0.348761 0.282756\n", "D7_Dox_C1_AAACGGGTCTGGGCCA-1 2.636122 2.038604\n", "D7_Dox_C1_AAACGGGTCTGTCAAG-1 0.399207 0.446110\n", "D7_Dox_C1_AAAGATGAGAGAGCTC-1 1.564738 1.329046\n", "D7_Dox_C1_AAAGATGAGAGTACAT-1 1.485496 1.384023\n", "D7_Dox_C1_AAAGATGAGATCCGAG-1 0.699411 0.789952\n", "D7_Dox_C1_AAAGATGAGGGCACTA-1 1.776569 1.709204\n", "D7_Dox_C1_AAAGATGCACTTAACG-1 0.990188 0.850556\n", "D7_Dox_C1_AAAGATGGTCCCTTGT-1 3.447298 3.750008\n", "D7_Dox_C1_AAAGATGTCCGCAAGC-1 0.405894 0.475874\n", "D7_Dox_C1_AAAGATGTCGCGTTTC-1 1.291190 1.144758\n", "D7_Dox_C1_AAAGATGTCGTGGACC-1 3.467186 2.937608\n", "D7_Dox_C1_AAAGCAAAGAGTACCG-1 2.457092 1.622737\n", "D7_Dox_C1_AAAGCAATCACTTATC-1 1.255358 1.328561\n", "D7_Dox_C1_AAAGTAGAGAGTTGGC-1 1.755248 1.891669\n", "D7_Dox_C1_AAAGTAGAGCTAACTC-1 1.652005 1.428341\n", "D7_Dox_C1_AAAGTAGAGGAGTACC-1 0.543827 0.574121\n", "D7_Dox_C1_AAAGTAGCAGTTTACG-1 2.881975 2.747883\n", "D7_Dox_C1_AAAGTAGCATTAACCG-1 1.117299 0.860455\n", "D7_Dox_C1_AAAGTAGGTACTCGCG-1 2.765129 2.744694\n", "D7_Dox_C1_AAAGTAGTCTCGATGA-1 1.426713 1.493590\n", "... ... ...\n", "D7_Dox_C2_TTTATGCCAAACTGCT-1 0.546127 0.668312\n", "D7_Dox_C2_TTTATGCCACATGACT-1 3.406330 3.133376\n", "D7_Dox_C2_TTTATGCCATACTCTT-1 2.149502 1.922778\n", "D7_Dox_C2_TTTATGCGTGGCCCTA-1 2.583077 2.744961\n", "D7_Dox_C2_TTTATGCGTTTAAGCC-1 3.267880 2.653814\n", "D7_Dox_C2_TTTATGCTCAATAAGG-1 0.681796 0.808452\n", "D7_Dox_C2_TTTATGCTCATTATCC-1 3.685506 2.870278\n", "D7_Dox_C2_TTTATGCTCCTTGACC-1 0.337586 0.440907\n", "D7_Dox_C2_TTTATGCTCCTTTCTC-1 2.856774 2.429800\n", "D7_Dox_C2_TTTATGCTCTTGGGTA-1 0.425422 0.620381\n", "D7_Dox_C2_TTTCCTCCATCGATTG-1 0.267748 0.358732\n", "D7_Dox_C2_TTTCCTCGTAGTACCT-1 2.577453 2.360288\n", "D7_Dox_C2_TTTCCTCGTTATGCGT-1 0.959450 1.076300\n", "D7_Dox_C2_TTTCCTCTCCTTAATC-1 3.275354 3.232358\n", "D7_Dox_C2_TTTCCTCTCGATGAGG-1 0.470076 0.660028\n", "D7_Dox_C2_TTTCCTCTCTGTTTGT-1 2.642529 2.428539\n", "D7_Dox_C2_TTTGCGCTCTTACCGC-1 0.257352 0.273753\n", "D7_Dox_C2_TTTGGTTAGCGAGAAA-1 0.294904 0.404630\n", "D7_Dox_C2_TTTGGTTAGGACACCA-1 0.512239 0.583090\n", "D7_Dox_C2_TTTGGTTCAAAGGTGC-1 1.495061 1.318807\n", "D7_Dox_C2_TTTGGTTGTGATGATA-1 2.325406 2.188960\n", "D7_Dox_C2_TTTGGTTGTTGAACTC-1 0.321137 0.383881\n", "D7_Dox_C2_TTTGGTTTCGTACCGG-1 1.524528 1.443170\n", "D7_Dox_C2_TTTGGTTTCTAACGGT-1 0.792568 0.755125\n", "D7_Dox_C2_TTTGTCAAGTGTCCCG-1 0.841414 0.897749\n", "D7_Dox_C2_TTTGTCAAGTTAGCGG-1 0.338531 0.370486\n", "D7_Dox_C2_TTTGTCACAGTGGAGT-1 0.582584 0.609164\n", "D7_Dox_C2_TTTGTCAGTAATTGGA-1 0.254926 0.296702\n", "D7_Dox_C2_TTTGTCATCGTGACAT-1 0.594715 0.876372\n", "D7_Dox_C2_TTTGTCATCTCCCTGA-1 1.198471 1.539571\n", "\n", "[6507 rows x 2 columns]" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# row annotations include cell growth rates\n", "tmap_annotated.obs\n", "\n", "# columns annotated by cell barcodes\n", "# tmap_annotated.var" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The column `g0` displays the input growth rates and the column `g1` displays the row sums of the transport map (raised to the power $t_2 - t_1$. These values can differ, as we see in the plot below, because the row-sum constraints are only enforced loosely. We interpret the value `g1` as an *inferred growth rate*. " ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "pycharm": {} }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Visualize how growth rates change with growth iterations\n", "plt.scatter(tmap_annotated.obs['g0'],tmap_annotated.obs['g1'])\n", "plt.xlabel(\"g0\")\n", "plt.ylabel(\"g1\")\n", "plt.title(\"Input vs Output Growth Rates\")\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": { "pycharm": {} }, "source": [ "When we increase the regularization parameter $\\lambda_1$, the row sum constraints are enforced more strictly. " ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "pycharm": {} }, "outputs": [], "source": [ "ot_model_strict = wot.ot.OTModel(adata,epsilon = 0.05, lambda1 = 3,lambda2 = 50) \n", "tmap_anno_strict = ot_model_strict.compute_transport_map(7,7.5)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.scatter(tmap_anno_strict.obs['g0'],tmap_anno_strict.obs['g1'])\n", "plt.xlabel(\"g0\")\n", "plt.ylabel(\"g1\")\n", "plt.title(\"Input vs Output Growth Rates\")\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Updating growth estimates\n", "\n", "We can feed these new growth rates back into the OT solver and recompute transport maps with these new growth rates. Instead of doing this manually, we can specify the number of 'growth iterations' with the flag `growth_iters`." ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "ot_model_gr2 = wot.ot.OTModel(adata,epsilon = 0.05, lambda1 = 1,lambda2 = 50,growth_iters=2) \n", "tmap_anno_gr2 = ot_model_gr2.compute_transport_map(7,7.5)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The row annotations of this transport map now have fields for multiple iterations of learning growth:" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "scrolled": true }, "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
g0g1g2
index
D7_Dox_C1_AAACCTGAGGAATCGC-11.2688950.9775890.771923
D7_Dox_C1_AAACCTGAGTAGATGT-12.9786602.5101992.130938
D7_Dox_C1_AAACCTGCAACCGCCA-11.8719181.7891041.692330
D7_Dox_C1_AAACCTGCACTATCTT-13.0729892.7903642.516863
D7_Dox_C1_AAACCTGCAGCCTGTG-11.0262250.9185840.815139
D7_Dox_C1_AAACCTGCATATACGC-11.4125821.3660651.303655
D7_Dox_C1_AAACCTGCATCCGTGG-11.1825961.1445851.093318
D7_Dox_C1_AAACCTGTCGGAATCT-10.9826871.0475571.093740
D7_Dox_C1_AAACGGGGTAGTACCT-10.4172770.4430680.462439
D7_Dox_C1_AAACGGGTCTCTTATG-10.3487610.2827560.228207
D7_Dox_C1_AAACGGGTCTGGGCCA-12.6361222.0386041.597445
D7_Dox_C1_AAACGGGTCTGTCAAG-10.3992070.4461100.482377
D7_Dox_C1_AAAGATGAGAGAGCTC-11.5647381.3290461.122280
D7_Dox_C1_AAAGATGAGAGTACAT-11.4854961.3840231.281136
D7_Dox_C1_AAAGATGAGATCCGAG-10.6994110.7899520.872767
D7_Dox_C1_AAAGATGAGGGCACTA-11.7765691.7092041.641042
D7_Dox_C1_AAAGATGCACTTAACG-10.9901880.8505560.728069
D7_Dox_C1_AAAGATGGTCCCTTGT-13.4472983.7500084.010355
D7_Dox_C1_AAAGATGTCCGCAAGC-10.4058940.4758740.539814
D7_Dox_C1_AAAGATGTCGCGTTTC-11.2911901.1447581.010505
D7_Dox_C1_AAAGATGTCGTGGACC-13.4671862.9376082.486141
D7_Dox_C1_AAAGCAAAGAGTACCG-12.4570921.6227371.104880
D7_Dox_C1_AAAGCAATCACTTATC-11.2553581.3285611.376567
D7_Dox_C1_AAAGTAGAGAGTTGGC-11.7552481.8916692.018037
D7_Dox_C1_AAAGTAGAGCTAACTC-11.6520051.4283411.230901
D7_Dox_C1_AAAGTAGAGGAGTACC-10.5438270.5741210.591511
D7_Dox_C1_AAAGTAGCAGTTTACG-12.8819752.7478832.580114
D7_Dox_C1_AAAGTAGCATTAACCG-11.1172990.8604550.672185
D7_Dox_C1_AAAGTAGGTACTCGCG-12.7651292.7446942.694334
D7_Dox_C1_AAAGTAGTCTCGATGA-11.4267131.4935901.543274
............
D7_Dox_C2_TTTATGCCAAACTGCT-10.5461270.6683120.792676
D7_Dox_C2_TTTATGCCACATGACT-13.4063303.1333762.934748
D7_Dox_C2_TTTATGCCATACTCTT-12.1495021.9227781.724100
D7_Dox_C2_TTTATGCGTGGCCCTA-12.5830772.7449612.847056
D7_Dox_C2_TTTATGCGTTTAAGCC-13.2678802.6538142.172043
D7_Dox_C2_TTTATGCTCAATAAGG-10.6817960.8084520.928986
D7_Dox_C2_TTTATGCTCATTATCC-13.6855062.8702782.267717
D7_Dox_C2_TTTATGCTCCTTGACC-10.3375860.4409070.554888
D7_Dox_C2_TTTATGCTCCTTTCTC-12.8567742.4298002.113878
D7_Dox_C2_TTTATGCTCTTGGGTA-10.4254220.6203810.875085
D7_Dox_C2_TTTCCTCCATCGATTG-10.2677480.3587320.460588
D7_Dox_C2_TTTCCTCGTAGTACCT-12.5774532.3602882.148033
D7_Dox_C2_TTTCCTCGTTATGCGT-10.9594501.0763001.177374
D7_Dox_C2_TTTCCTCTCCTTAATC-13.2753543.2323583.133913
D7_Dox_C2_TTTCCTCTCGATGAGG-10.4700760.6600280.894440
D7_Dox_C2_TTTCCTCTCTGTTTGT-12.6425292.4285392.226831
D7_Dox_C2_TTTGCGCTCTTACCGC-10.2573520.2737530.284005
D7_Dox_C2_TTTGGTTAGCGAGAAA-10.2949040.4046300.530570
D7_Dox_C2_TTTGGTTAGGACACCA-10.5122390.5830900.645941
D7_Dox_C2_TTTGGTTCAAAGGTGC-11.4950611.3188071.158094
D7_Dox_C2_TTTGGTTGTGATGATA-12.3254062.1889602.083658
D7_Dox_C2_TTTGGTTGTTGAACTC-10.3211370.3838810.442784
D7_Dox_C2_TTTGGTTTCGTACCGG-11.5245281.4431701.351901
D7_Dox_C2_TTTGGTTTCTAACGGT-10.7925680.7551250.708005
D7_Dox_C2_TTTGTCAAGTGTCCCG-10.8414140.8977490.937937
D7_Dox_C2_TTTGTCAAGTTAGCGG-10.3385310.3704860.397700
D7_Dox_C2_TTTGTCACAGTGGAGT-10.5825840.6091640.624181
D7_Dox_C2_TTTGTCAGTAATTGGA-10.2549260.2967020.334487
D7_Dox_C2_TTTGTCATCGTGACAT-10.5947150.8763721.247693
D7_Dox_C2_TTTGTCATCTCCCTGA-11.1984711.5395711.896885
\n", "

6507 rows × 3 columns

\n", "
" ], "text/plain": [ " g0 g1 g2\n", "index \n", "D7_Dox_C1_AAACCTGAGGAATCGC-1 1.268895 0.977589 0.771923\n", "D7_Dox_C1_AAACCTGAGTAGATGT-1 2.978660 2.510199 2.130938\n", "D7_Dox_C1_AAACCTGCAACCGCCA-1 1.871918 1.789104 1.692330\n", "D7_Dox_C1_AAACCTGCACTATCTT-1 3.072989 2.790364 2.516863\n", "D7_Dox_C1_AAACCTGCAGCCTGTG-1 1.026225 0.918584 0.815139\n", "D7_Dox_C1_AAACCTGCATATACGC-1 1.412582 1.366065 1.303655\n", "D7_Dox_C1_AAACCTGCATCCGTGG-1 1.182596 1.144585 1.093318\n", "D7_Dox_C1_AAACCTGTCGGAATCT-1 0.982687 1.047557 1.093740\n", "D7_Dox_C1_AAACGGGGTAGTACCT-1 0.417277 0.443068 0.462439\n", "D7_Dox_C1_AAACGGGTCTCTTATG-1 0.348761 0.282756 0.228207\n", "D7_Dox_C1_AAACGGGTCTGGGCCA-1 2.636122 2.038604 1.597445\n", "D7_Dox_C1_AAACGGGTCTGTCAAG-1 0.399207 0.446110 0.482377\n", "D7_Dox_C1_AAAGATGAGAGAGCTC-1 1.564738 1.329046 1.122280\n", "D7_Dox_C1_AAAGATGAGAGTACAT-1 1.485496 1.384023 1.281136\n", "D7_Dox_C1_AAAGATGAGATCCGAG-1 0.699411 0.789952 0.872767\n", "D7_Dox_C1_AAAGATGAGGGCACTA-1 1.776569 1.709204 1.641042\n", "D7_Dox_C1_AAAGATGCACTTAACG-1 0.990188 0.850556 0.728069\n", "D7_Dox_C1_AAAGATGGTCCCTTGT-1 3.447298 3.750008 4.010355\n", "D7_Dox_C1_AAAGATGTCCGCAAGC-1 0.405894 0.475874 0.539814\n", "D7_Dox_C1_AAAGATGTCGCGTTTC-1 1.291190 1.144758 1.010505\n", "D7_Dox_C1_AAAGATGTCGTGGACC-1 3.467186 2.937608 2.486141\n", "D7_Dox_C1_AAAGCAAAGAGTACCG-1 2.457092 1.622737 1.104880\n", "D7_Dox_C1_AAAGCAATCACTTATC-1 1.255358 1.328561 1.376567\n", "D7_Dox_C1_AAAGTAGAGAGTTGGC-1 1.755248 1.891669 2.018037\n", "D7_Dox_C1_AAAGTAGAGCTAACTC-1 1.652005 1.428341 1.230901\n", "D7_Dox_C1_AAAGTAGAGGAGTACC-1 0.543827 0.574121 0.591511\n", "D7_Dox_C1_AAAGTAGCAGTTTACG-1 2.881975 2.747883 2.580114\n", "D7_Dox_C1_AAAGTAGCATTAACCG-1 1.117299 0.860455 0.672185\n", "D7_Dox_C1_AAAGTAGGTACTCGCG-1 2.765129 2.744694 2.694334\n", "D7_Dox_C1_AAAGTAGTCTCGATGA-1 1.426713 1.493590 1.543274\n", "... ... ... ...\n", "D7_Dox_C2_TTTATGCCAAACTGCT-1 0.546127 0.668312 0.792676\n", "D7_Dox_C2_TTTATGCCACATGACT-1 3.406330 3.133376 2.934748\n", "D7_Dox_C2_TTTATGCCATACTCTT-1 2.149502 1.922778 1.724100\n", "D7_Dox_C2_TTTATGCGTGGCCCTA-1 2.583077 2.744961 2.847056\n", "D7_Dox_C2_TTTATGCGTTTAAGCC-1 3.267880 2.653814 2.172043\n", "D7_Dox_C2_TTTATGCTCAATAAGG-1 0.681796 0.808452 0.928986\n", "D7_Dox_C2_TTTATGCTCATTATCC-1 3.685506 2.870278 2.267717\n", "D7_Dox_C2_TTTATGCTCCTTGACC-1 0.337586 0.440907 0.554888\n", "D7_Dox_C2_TTTATGCTCCTTTCTC-1 2.856774 2.429800 2.113878\n", "D7_Dox_C2_TTTATGCTCTTGGGTA-1 0.425422 0.620381 0.875085\n", "D7_Dox_C2_TTTCCTCCATCGATTG-1 0.267748 0.358732 0.460588\n", "D7_Dox_C2_TTTCCTCGTAGTACCT-1 2.577453 2.360288 2.148033\n", "D7_Dox_C2_TTTCCTCGTTATGCGT-1 0.959450 1.076300 1.177374\n", "D7_Dox_C2_TTTCCTCTCCTTAATC-1 3.275354 3.232358 3.133913\n", "D7_Dox_C2_TTTCCTCTCGATGAGG-1 0.470076 0.660028 0.894440\n", "D7_Dox_C2_TTTCCTCTCTGTTTGT-1 2.642529 2.428539 2.226831\n", "D7_Dox_C2_TTTGCGCTCTTACCGC-1 0.257352 0.273753 0.284005\n", "D7_Dox_C2_TTTGGTTAGCGAGAAA-1 0.294904 0.404630 0.530570\n", "D7_Dox_C2_TTTGGTTAGGACACCA-1 0.512239 0.583090 0.645941\n", "D7_Dox_C2_TTTGGTTCAAAGGTGC-1 1.495061 1.318807 1.158094\n", "D7_Dox_C2_TTTGGTTGTGATGATA-1 2.325406 2.188960 2.083658\n", "D7_Dox_C2_TTTGGTTGTTGAACTC-1 0.321137 0.383881 0.442784\n", "D7_Dox_C2_TTTGGTTTCGTACCGG-1 1.524528 1.443170 1.351901\n", "D7_Dox_C2_TTTGGTTTCTAACGGT-1 0.792568 0.755125 0.708005\n", "D7_Dox_C2_TTTGTCAAGTGTCCCG-1 0.841414 0.897749 0.937937\n", "D7_Dox_C2_TTTGTCAAGTTAGCGG-1 0.338531 0.370486 0.397700\n", "D7_Dox_C2_TTTGTCACAGTGGAGT-1 0.582584 0.609164 0.624181\n", "D7_Dox_C2_TTTGTCAGTAATTGGA-1 0.254926 0.296702 0.334487\n", "D7_Dox_C2_TTTGTCATCGTGACAT-1 0.594715 0.876372 1.247693\n", "D7_Dox_C2_TTTGTCATCTCCCTGA-1 1.198471 1.539571 1.896885\n", "\n", "[6507 rows x 3 columns]" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# row annotations include initial cell growth rates g0, and also g1 and g2\n", "tmap_anno_gr2.obs" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Tuning $\\lambda_1$ and $\\lambda_2$\n", "\n", "The numerical value of $\\lambda_1$ determines how different $g_{k+1}$ can be from $g_k$. If growth rates are known very well, then a large value of $\\lambda_1$ can be used to enforce the row-sum constraints strictly and we could just do one growth iteration. When we do more than one growth iteration, the value of $\\lambda_1$ can be interpreted intuitively as an *inverse step size* in our update of growth rates. A large value allows us to change growth by a lot at each iteration. \n", "\n", "You may have noticed that we set $\\lambda_2 = 50$, a much larger numerical value than $\\lambda_1 = 1$. This enforces the constraints on the column sums strictly (the amount of mass going into each cell $y$ at time $t_2$ is well specified). To see this, we plot a histogram of column sums, and we see a very narrow band. " ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(array([ 2., 2., 23., 58., 200., 624., 1517., 1869., 726.,\n", " 40.]),\n", " array([1.404813 , 1.407358 , 1.4099029, 1.4124479, 1.4149928, 1.4175378,\n", " 1.4200828, 1.4226277, 1.4251727, 1.4277176, 1.4302626],\n", " dtype=float32),\n", " )" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "colsums = tmap_anno_gr2.X.sum(axis=0);\n", "plt.hist(colsums)" ] }, { "cell_type": "markdown", "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 34 }, "colab_type": "code", "executionInfo": { "elapsed": 545, "status": "ok", "timestamp": 1556313222255, "user": { "displayName": "Joshua Gould", "photoUrl": "", "userId": "09978885733763067346" }, "user_tz": 240 }, "id": "P-ZQVITQe9m-", "outputId": "a864cea1-48cd-468b-b9ac-845724230979", "pycharm": {} }, "source": [ "# Tuning $\\epsilon$ \n", "\n", "The parameter $\\epsilon$ controls the level of entropy in the transport maps. A larger value promotes more entropic descendant distributions, so each cell can transition to a larger variety of descendants. We recommend sticking with the default value of $\\epsilon = 0.05$. Note that we rescale the cost matrix to have a median value of $1,$ so the default value of $\\epsilon$ should give similar results for datasets of different scales. \n", "\n", "# Compute all transport maps in batch mode\n", "\n", "The following command computes all transport maps. Note that this can take a few hours on a laptop. For convenience, we include precomputed transport maps in the `tmaps` directory. " ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 164 }, "colab_type": "code", "executionInfo": { "elapsed": 370, "status": "error", "timestamp": 1556369739325, "user": { "displayName": "Joshua Gould", "photoUrl": "", "userId": "09978885733763067346" }, "user_tz": 240 }, "id": "5lFF4FfhAexV", "outputId": "2c0fc345-a952-4619-fe70-8a5dcc1a7538", "pycharm": {} }, "outputs": [], "source": [ "# ot_model = wot.ot.OTModel(adata, epsilon = 0.05, lambda1 = 1, lambda2 = 50, growth_iters = 3) \n", "# ot_model.compute_all_transport_maps(tmap_out='tmaps/serum')\n", "\n", "# we can speed this up by supplying g2 and doing 1 growth iter" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This can also be run from the command line as follows:\n", "\n", "`wot optimal_transport --matrix data/ExprMatrix.var.genes.h5ad --cell_days data/cell_days.txt --cell_filter data/serum_cell_ids.txt --cell_growth_rates data/growth_gs_init.txt --growth_iters 3 --lambda1 1 --lambda2 50 --epsilon 0.05`\n", "\n", "We use these transport maps in the remaining notebooks. " ] } ], "metadata": { "colab": { "name": "wot-2.ipynb", "provenance": [], "version": "0.3.2" }, "kernelspec": { "display_name": "Python 3", "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.7.3" }, "pycharm": { "stem_cell": { "cell_type": "raw", "source": [], "metadata": { "collapsed": false } } }, "widgets": { "application/vnd.jupyter.widget-state+json": { "state": {}, "version_major": 2, "version_minor": 0 } } }, "nbformat": 4, "nbformat_minor": 2 }