{ "cells": [ { "cell_type": "markdown", "id": "03812395", "metadata": {}, "source": [ "# Experimental data\n", "\n", "In contrast to theoretical or computational landscapes, like the Serine codon model shown in previous sections, empirical landscapes are based on experimental data. Such data is typically noisy and incomplete, so we need to apply additional methods to obtain reliable estimates of the phenotype of every possible genotype in order to visualize the genotype-phenotype map. In this section, we will illustrate the two methods available in `gpmap-tools` for inference of complete genotype-phenotype maps $f$ from noisy measurements `y` at a subset of sequences `X`. Optionally, the variance associated to the measurement `y_var` can be provided.\n", "\n", "> **Note:** these methods only work for sequences of the same length\n", "\n", "- **Minimum epistasis interpolation (MEI)** finds the genotype-phenotype map that minimizes the sum of squared P-th epistatic coefficients $\\bar{\\epsilon_P^2}$ while exactly matching the data `y` at sequences `X` ([read more](https://www.nature.com/articles/s41467-020-15512-5)).\n", "- **Empirical VC regression** estimates a prior distribution characterized by the variance explained by interactions of every possible order from the empirical distance-correlation function computed from the available data. Then, it uses this prior distribution to perform Gaussian process regression to infer a complete genotype-phenotype map ([read more](https://doi.org/10.1073/pnas.2204233119)).\n", "\n", "In this section, we will illustrate how to use these methods using simulated and real data and how to use them to evaluate the evidence supporting specific hypotheses about the genotype-phenotype map." ] }, { "cell_type": "code", "execution_count": null, "id": "f34627a2", "metadata": {}, "outputs": [], "source": [ "# Import required libraries\n", "import pandas as pd\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "\n", "from itertools import product, combinations\n", "from scipy.stats import pearsonr, norm\n", "from gpmap.datasets import DataSet\n", "from gpmap.inference import VCregression, MinimumEpistasisInterpolator\n", "from gpmap.plot.mpl import init_fig" ] }, { "cell_type": "markdown", "id": "48dc85f2", "metadata": {}, "source": [ "## Inference from simulated data\n", "\n", "We first illustrate how to use these methods using simulated data. In this case, we know what the true genotype-phenotype map is and can compare the model inferences with the real values. \n", "\n", "### How to sample functions from the prior distribution\n", "\n", "We will simulate data from the Variance Component regression model. In order to do so, we need to define the configuration of sequence space, the variance associated to interactions of every possible order `lambdas`, standard deviation of the measurement noise `sigma` and the fraction of genotypes that are not measured in the experiment `p_missing`." ] }, { "cell_type": "code", "execution_count": 2, "id": "838329b0", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
yy_varf
AAAAAA0.6406320.040.496707
AAAAAC-2.3149240.04-2.381059
AAAAAG-2.1501900.04-2.072592
AAAAAT1.4667910.041.143917
AAAACA3.8547570.044.207335
............
TTTTGG0.7914770.040.805718
TTTTGT1.6213760.041.522178
TTTTTA3.7558500.043.650933
TTTTTC1.1877700.041.162799
TTTTTG3.0843320.042.627240
\n", "

3693 rows × 3 columns

\n", "
" ], "text/plain": [ " y y_var f\n", "AAAAAA 0.640632 0.04 0.496707\n", "AAAAAC -2.314924 0.04 -2.381059\n", "AAAAAG -2.150190 0.04 -2.072592\n", "AAAAAT 1.466791 0.04 1.143917\n", "AAAACA 3.854757 0.04 4.207335\n", "... ... ... ...\n", "TTTTGG 0.791477 0.04 0.805718\n", "TTTTGT 1.621376 0.04 1.522178\n", "TTTTTA 3.755850 0.04 3.650933\n", "TTTTTC 1.187770 0.04 1.162799\n", "TTTTTG 3.084332 0.04 2.627240\n", "\n", "[3693 rows x 3 columns]" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.random.seed(0)\n", "lambdas_true = np.array([1e4, 1e3, 2e2, 1e0, 1e-1, 3e-3, 1e-5])\n", "\n", "model = VCregression(seq_length=6, alphabet_type='dna', lambdas=lambdas_true)\n", "f, X, y, y_var = model.simulate(y_var=0.04, p_missing=0.1)\n", "idx = model.get_obs_idx(X)\n", "X_test = np.delete(model.genotypes, idx)\n", "f_test = np.delete(f, idx)\n", "data = pd.DataFrame({'y': y, 'y_var': y_var, 'f': f[idx]}, index=X)\n", "data" ] }, { "cell_type": "markdown", "id": "4090bcb3", "metadata": {}, "source": [ "### How to compute the minimum epistasis interpolation solution\n", "\n", "This can be done very simply by defining a `MinimumEpistasisInterpolator` object with the right configuration of sequence space and the order of local epistatic coefficients we aim to penalize. In this case, we set `P=2` to minimize the sum of squared epistatic coefficients." ] }, { "cell_type": "code", "execution_count": 3, "id": "dc8c2ad2", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
f
AAAAAA0.640632
AAAAAC-2.314924
AAAAAG-2.150190
AAAAAT1.466791
AAAACA3.854757
......
TTTTGT1.621376
TTTTTA3.755850
TTTTTC1.187770
TTTTTG3.084332
TTTTTT3.728994
\n", "

4096 rows × 1 columns

\n", "
" ], "text/plain": [ " f\n", "AAAAAA 0.640632\n", "AAAAAC -2.314924\n", "AAAAAG -2.150190\n", "AAAAAT 1.466791\n", "AAAACA 3.854757\n", "... ...\n", "TTTTGT 1.621376\n", "TTTTTA 3.755850\n", "TTTTTC 1.187770\n", "TTTTTG 3.084332\n", "TTTTTT 3.728994\n", "\n", "[4096 rows x 1 columns]" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "model = MinimumEpistasisInterpolator(P=2, seq_length=6, alphabet_type='dna')\n", "model.set_data(X=X, y=y)\n", "mei = model.predict()\n", "mei" ] }, { "cell_type": "markdown", "id": "b4d766e1", "metadata": {}, "source": [ "We can now compare the predicted with the true phenotype at the held-out test sequences" ] }, { "cell_type": "code", "execution_count": 4, "id": "6b3be51e", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Text(0.03, 0.97, '$R^2$=0.995')" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "r2 = pearsonr(mei['f'], f)[0] ** 2\n", "fig, axes = plt.subplots(1, 1, figsize=(4, 4))\n", "axes.scatter(x=mei['f'], y=f, c='black', alpha=0.5, s=5, lw=0)\n", "ticks = np.arange(-10, 9, 2)\n", "axes.axline((0, 0), (1, 1), lw=0.75, linestyle='--', c='grey')\n", "axes.set(xlabel=r'$y_{True}$', ylabel=r'$y_{pred}$', aspect='equal', xlim=(-15, 10), ylim=(-15, 10))\n", "axes.text(0.03, 0.97, r'$R^2$=' + '{:.3f}'.format(r2), transform=axes.transAxes,\n", " va='top')" ] }, { "cell_type": "markdown", "id": "ce611af4", "metadata": {}, "source": [ "This comparison shows a very high correlation between the predictions and the real phenotypic values, but the extremely low and high values tend to be over and underestimated, respectively. \n", "\n", "### How to estimate Variance Components $\\lambda$'s\n", "\n", "We next illustrate how to use Variance Component regression on the same simulated data for comparison. The first step is the estimation of the variance components from the data. The covariance matrix $K$ under the prior is given by\n", "\n", "$$K = \\sum_k \\lambda_k K_k$$\n", "\n", "We define the $\\lambda_k$ through kernel alignment. This is achieved by finding the non-negative linear combination of the covariance matrices $K_k$ associated to each pure interactions of order $k$ that that minimize the Frobenius norm of the difference with the empirical second moment matrix $(y - \\bar y)^T(y - \\bar y)$ \n", "\n", "$$\\hat\\lambda = \\arg \\min_{\\lambda} \\lVert (y - \\bar y)(y - \\bar y)^T - (\\sum_k \\lambda_k K_k)_{xx} \\lVert_F^2$$\n", "\n", "\n" ] }, { "cell_type": "code", "execution_count": 5, "id": "5ccde983", "metadata": {}, "outputs": [], "source": [ "model = VCregression(seq_length=6, alphabet_type=\"dna\")\n", "model.fit(X, y, y_var)\n", "vc = model.lambdas_to_variance(model.lambdas)\n", "vc_p = vc / vc.sum() * 100" ] }, { "cell_type": "code", "execution_count": 6, "id": "c6131627", "metadata": {}, "outputs": [ { "data": { "image/png": "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3nzzTcXFxRkbEADQbrfccotuueUW5+P6+nodO3ZMR48e1UcffURRCugm7Ha78vLyFBkZqZ49exodB26AWcQAAG7t3//939XY2KgTJ06osrJSlZWVOnHihOx2u/793//d6HgAgE4QGBioESNG6J577tHTTz9tdBwAHaChoUF5eXmKi4ujIAUnilIuMJvNSkpK0siRI42OAgBeZ+fOnXrhhRd0+eWXO/ddfvnleu6557Rr165LPu9jjz0mk8mkxYsXO/fV19crPT1d4eHh6t27t6ZPn67S0tL2xAcAuMhms+l//ud/tGnTJj388MOaOnWq0ZEAdBCLxaKSkhIlJCTIz48btvB/+DS4ID09Xenp6aqpqVFoaKjRcQDAq8THx6uxsbHFfpvNppiYmEs654EDB/SHP/xBw4YNa7Z/yZIl2rp1q9566y2FhoZqwYIFmjZtmvbs2XNJrwMAOL+vv/5an332mY4dO+bcvvrqKzU2Nsrf319XXnmlhg4danRMAB3gzJkzqq+vV3x8PCvsoQWKUgAAt/bEE09o4cKFMpvNGjFihKRvJz1ftGiRnnzyyYs+X21trWbNmqV169Zp5cqVzv3V1dV6+eWXtXHjRt1www2SpFdeeUVXXnml9u3bp2uuuaZjGgQAXu7uu+/WG2+8IZPJpKCgIFksFt18881atmyZhg4dqsGDB8vX19fomAA6QGlpqfz8/BQdHW10FLgpbt8DALi1n/70p8rJydHo0aMVEBCggIAAjR49WocOHdI999yjvn37OjdXpKen6+abb1ZaWlqz/dnZ2WpsbGy2/4orrlBCQoL27t3boW0CAG+2efNmPfvss6qtrVVRUZEWLFigv/3tbzpw4IASExMpSAHdgMPhUH5+voKCghQeHm50HLgxRkoBANzamjVrOuxcb775pg4dOqQDBw60eK6kpET+/v7OFf7OiYyMVElJSavntFqtslqtzsc1NTUdlhcAuqMlS5Zo9uzZCgwMlCQ988wzmj17tn7+859r8+bNev755/WjH/3I4JQALpXNZlN+fr6io6MVEBBgdBy4OYpSAAC3NmfOnA45T35+vhYtWqS///3vzn8IdYTMzEytWLGiw84HAN1dZmZmi32pqanav3+/nn32Wc2cOVM333yznnnmGfXv39+AhAAuldVqVXFxseLj4xn1CJdw+x4AwK1t2LDhvPub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qampBqUCAHQEVt8D2maz2bRo0SJnQapHjx6KjY1VQUGBmpqaZDKZtHjxYt16663MJwWP1GFzSgEA0BlWrlypl156Sddff71WrFihFStW6Prrr9f69eu1atWqizrXCy+8oGHDhikkJEQhISEaM2aMPvjgA+fz9fX1Sk9PV3h4uHr37q3p06ertLS0o5sEAADgkt27dztv2QsKClJ0dLROnTrlHEXucDiUn5+v3bt3GxkTuGQUpVzAROcAYJxrr71We/fuVXx8vP70pz/pL3/5i773ve/p6NGjGjt27EWdKy4uTo899piys7N18OBB3XDDDbr11lv1P//zP5KkJUuW6C9/+Yveeust7dy5U0VFRQyHB4BOtnv3bt19990aM2aMCgsLJUl//OMf9cknnxicDDBecXGxJCk0NFShoaHKy8s77/yI544DPA2377kgPT1d6enpzom6AABdKyUlRa+//nq7zzN58uRmj3/3u9/phRde0L59+xQXF6eXX35ZGzdu1A033CBJeuWVV3TllVdq3759uuaaa9r9+gCA5t5++2395Cc/0axZs3T48GFZrVZJUnV1tVatWqX333/f4ISAsaKjoxURESG73d5m4Sk6OroLUwEdh6IUAMDt2e12nTx5UmVlZbLb7c2eu/766y/pnDabTW+99ZYsFovGjBmj7OxsNTY2Ki0tzXnMFVdcoYSEBO3du7fVopTVanX+I0r6dqURAIBrVq5cqbVr12r27Nl68803nfuvvfZarVy50sBkgPEcDocGDRqksLAwffXVV+c9xmQyKS4u7qJHjwPugqIUAMCt7du3T3fddZdOnTrVYri6yWSSzWa7qPN99tlnGjNmjOrr69W7d29t2bJFSUlJysnJkb+/v8LCwpodHxkZqZKSklbPl5mZqRUrVlxUBgDAt7744ovzfrkQGhqqqqqqrg8EuAmbzab8/HxFRUUpMzNTM2bMkMlkava30LkVKtesWcMk5/BYzCkFAHBrP//5zzVixAgdO3ZMlZWVOnPmjHOrrKy86PNdfvnlysnJ0aeffqr58+drzpw5On78+CXnW7p0qaqrq51bfn7+JZ8LALxNVFSUTp482WL/J598okGDBhmQCDBeQ0OD8vPzFRcXp8DAQE2bNk2bN29WbGxss+Pi4uK0efNm5r+ER2OkFADArX311VfavHmzvve973XI+fz9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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "k = np.arange(model.lambdas.shape[0])\n", "\n", "fig, subplots = plt.subplots(1, 3, figsize=(12, 3.5))\n", "\n", "axes = subplots[0]\n", "axes.bar(x=k, height=model.lambdas, color='black')\n", "axes.set(xlabel='k', ylabel=r'$\\lambda_k$', yscale='log',\n", " xticks=np.arange(7))\n", "\n", "axes = subplots[1]\n", "axes.bar(x=k[1:], height=vc_p, color='black')\n", "axes.set(xlabel='k', ylabel='% variance explained')\n", "\n", "axes = subplots[2]\n", "axes.scatter(lambdas_true, model.lambdas, c='black')\n", "lims = (1e-5, 1e6)\n", "axes.plot(lims, lims, c='grey', lw=0.3, alpha=0.5)\n", "axes.set(xscale='log', yscale='log',\n", " xlabel=r'True $\\lambda_k$',\n", " ylabel=r'Inferred $\\lambda_k$',\n", " xlim=lims, ylim=lims)\n", "\n", "fig.tight_layout()" ] }, { "cell_type": "markdown", "id": "cff9aee0", "metadata": {}, "source": [ "We can see that the inferred variance components are very similar in log scale to the true data-generating parameters. \n", "\n", "However, when data is sparse, kernel alignment is a hard problem and we need to regularize towards simpler solutions. While we could shrink towards additivity, another good general choice that still models high order interactions is towards exponential decay of the variance components. We can do it by setting `cross_validation=True` and penalizing the second order moments of the $\\log \\lambda_k$ as a function of $k$. It will automatically split the data into different folds and perform kernel alignment under different regularization strength to find the penalization constant that best generalizes to the validation set according to a metric. These metrics can be\n", "the Frobenius of the difference between the prior and second moment matrix, $R^2$ on the or the log-likelihood of the predictions on the validation set. This can be specified through the argument `cv_loss_function='r2'` ,`cv_loss_function='logL'`." ] }, { "cell_type": "markdown", "id": "a9dcb37f", "metadata": {}, "source": [ "### How to obtain phenotypic predictions under a VC prior\n", "\n", "Once we know the parameters of the Variance Component prior, we can compute the posterior distribution for the complete genotype-phenotype map with the method `predict`" ] }, { "cell_type": "code", "execution_count": 7, "id": "16df54ca", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
f
AAAAAA0.509161
AAAAAC-2.099185
AAAAAG-2.021162
AAAAAT1.261439
AAAACA3.904009
......
TTTTGT1.799622
TTTTTA3.642860
TTTTTC1.275835
TTTTTG2.718211
TTTTTT4.253923
\n", "

4096 rows × 1 columns

\n", "
" ], "text/plain": [ " f\n", "AAAAAA 0.509161\n", "AAAAAC -2.099185\n", "AAAAAG -2.021162\n", "AAAAAT 1.261439\n", "AAAACA 3.904009\n", "... ...\n", "TTTTGT 1.799622\n", "TTTTTA 3.642860\n", "TTTTTC 1.275835\n", "TTTTTG 2.718211\n", "TTTTTT 4.253923\n", "\n", "[4096 rows x 1 columns]" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "model.fit(X, y, y_var)\n", "pred = model.predict()\n", "pred" ] }, { "cell_type": "markdown", "id": "3a1b07a8", "metadata": {}, "source": [ "We can now compare the predictions with the true phenotypic values in held-out sequences, achieving better predictive performance than with MEI." ] }, { "cell_type": "code", "execution_count": 8, "id": "52faa016", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Text(0.03, 0.97, '$R^2$=0.998')" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAY0AAAF5CAYAAABjpHbeAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy89olMNAAAACXBIWXMAAA9hAAAPYQGoP6dpAABFLElEQVR4nO3deViU5f4/8PfMAMOwiKAgkIq7iLIIKGpZZiaZoYQobqV26uixTl+3VDqmqampZaXZsc63sgXEBRjTMjPtmAoiMoGIu4mICLiwBAIDD8/vD388XyfQEGeYhffruua6mpl7Zj4jydt7ee5bJoqiCCIiokaQG7sAIiIyHwwNIiJqNIYGERE1GkODiIgajaFBRESNxtAgIqJGY2gQEVGjMTSIiKjRGBpERNRoDA0iImo0swyNX3/9FWFhYfD09IRMJoNardZ5XhRFLF68GB4eHlCpVBg2bBjOnz9vnGKJiCyIWYZGeXk5/P39sXHjxgafX7NmDdavX49NmzYhJSUF9vb2CA0NRWVlZTNXSkRkWWTmvmGhTCZDYmIiwsPDAdzpZXh6emLu3LmYN28eAKCkpATt2rXD5s2bMX78eCNWS0Rk3qyMXYC+Xbp0Cfn5+Rg2bJj0mJOTE0JCQpCcnHzP0KiqqkJVVZV0v7a2Frdu3UKbNm0gk8kMXjcRkaGIoog//vgDnp6ekMsfboDJ4kIjPz8fANCuXTudx9u1ayc915BVq1Zh6dKlBq2NiMiYrly5gvbt2z/Ue1hcaDRVdHQ05syZI90vKSlBx44dceXKFbRq1cqIlRERNZ4gCNizZw8yMzPh5OSE1q1bIzQ0FF26dIGjo+NDv7/FhYa7uzsAoKCgAB4eHtLjBQUFCAgIuOfrlEollEplvcdbtWrF0CAis6BWq6HRaHDu3Dl4e3ujsrISU6ZMQXV1NQDoZajdLFdP3U/nzp3h7u6O/fv3S4+VlpYiJSUFAwcONGJlRESGIwgC0tPTpTmL2tpa+Pr6QqVS6fVzzLKnUVZWhgsXLkj3L126hPT0dLi4uKBjx46YNWsW3nnnHXTv3h2dO3fGW2+9BU9PT2mFFRGRpVEoFPD390dGRgbCwsIwfvx4KBQKvX+OWYbG8ePH8eSTT0r36+YipkyZgs2bN2P+/PkoLy/H3//+dxQXF+Oxxx7Djz/+CFtbW2OVTERkUIIgoLq6Gp06dcLYsWMNEhiABVynYSilpaVwcnJCSUkJ5zSIyOSp1WqUlJRgwoQJsLGx0XlOn7/PzLKnQUREd4iiCJlMhn79+sHV1bVeYOibxU2EExG1FIIgYMeOHcjKysIjjzxi8MAA2NMgIjJLgiAgPj4eFRUV6N69e7N9LnsaRERmaO/evaioqGhwDsOQGBrN6MqVKxgyZAh8fHzg5+eH7du3G7skIjIzgiCgtrYWgwYNavbAADg81aysrKzw4YcfIiAgAPn5+QgKCsKzzz4Le3t7Y5dGRGZAq9VCrVajffv2GDRokFFqYGg0Iw8PD2lrE3d3d7Rt2xa3bt1iaBDRX0pMTERGRgYcHByMeqEyh6f06IknnoBMJoNMJoONjQ169eqF2NjYBtumpaVBEAR06NChyZ+3ceNGdOrUCba2tggJCcGxY8f+8jV//PEHZs2aBS8vL6hUKgwaNAipqamNfh640z1+66230LlzZ6hUKnTt2hXLly8HL/khMgytVouMjAwAd3bEMNSFe43B0NATURTx22+/4b333sO1a9dw9uxZPPPMM3jxxRdx6dIlnba3bt3Ciy++iM8++6zJn7d161bMmTMHS5YsgUajgb+/P0JDQ1FYWHjf17388svYt28fvvnmG2RmZmL48OEYNmwYrl692qjnAWD16tX497//jY8//hinT5/G6tWrsWbNGmzYsKHJ34eIGpaYmIiVK1dK5/0EBAQYNTQgUoNKSkpEAGJJSUmj2p89e1YEIJ48eVJ6LDMzUwQg7tmzR3qssrJSHDx4sPj1118/VH39+/cXX331Vem+IAiip6enuGrVqnu+5vbt26JCoRB3796t83hgYKD4r3/96y+frzNy5EjxpZde0mkTEREhTpo06WG+EhH9SVVVlbhkyRLpVlVV1aT3edDfZ/fDnoaepKWlwdnZGT4+PgCA3Nxc/Otf/4JSqYSfnx+AO72RqVOnYujQoXjhhRfqvcfKlSvh4OBw31tOTg60Wi3S0tJ0TieUy+UYNmwYkpOT71ljTU0NBEGotweXSqXC4cOH//L5OoMGDcL+/ftx7tw5AEBGRgYOHz6MESNGPOCfGhHdiyAIUKvVcHBwAHCnh9HcK6UawolwPdFoNCgpKYGjoyMEQUBlZSVUKhU2bdoET09PAMCRI0ewdetW+Pn5Qa1WAwC++eYb+Pr6AgBmzJiBcePG3fdzPD09UVhYCEEQGjyd8MyZM/d8raOjIwYOHIjly5ejV69eaNeuHbZs2YLk5GR069btL5+vs3DhQpSWlsLb2xsKhQKCIGDFihWYNGlSU/7oiKgBGo0Gt2/fxuuvvw6FQmHcIam7MDT0RKPR4NVXX8Xrr7+O4uJizJs3D48++iimTp0qtXnsscdQW1t7z/dwcXGBi4uLQev85ptv8NJLL+GRRx6BQqFAYGAgJkyYgLS0tEY9DwDbtm1DTEwMYmNj0bt3b6Snp2PWrFnw9PTElClTDFo/kaUTBAHl5eXIyclBdnY2fvjhB5M61oGhoScajQavvPKK9C/yTz75BH5+fnjllVfQqVOnRr3HypUrsXLlyvu2OXXqFNzd3aFQKFBQUKDzXEFBgXRy4b107doVBw8eRHl5OUpLS+Hh4YGoqCh06dKlUc8DwBtvvIGFCxdi/PjxAABfX19cvnwZq1atYmgQPYS6rUHy8vKQmJgoLdEPCwszmZ4G5zT04Pfff0dxcTH69OkjPebj44OuXbvec8ltQ2bMmIH09PT73jw9PWFjY4OgoCCd0wlra2uxf//+Rp9OaG9vDw8PDxQVFWHv3r0YPXp0o5+/ffu2dDpYHYVCcd9eFBHdX11glJeXIzk5GTdv3sTJkyfh5+dnMoEBsKehF2lpabC2tkaPHj10Hn/qqaeQmJiIN998s1Hv8yDDU3PmzMGUKVMQHByM/v3748MPP0R5eTmmTZsmtfn444+RmJioEy579+6FKIro2bMnLly4gDfeeAPe3t7S6/7qeeDOv3pWrFiBjh07onfv3vjtt9+wbt06vPTSS42qnYjqO3PmDHJycnD8+HEkJyejVatW8PHxqfcPOmNjaOiBRqNB9+7d661sGDZsGDZt2oTc3Fy0b99er58ZFRWF69evY/HixcjPz0dAQAB+/PFHncnxGzdu4OLFizqvKykpQXR0NHJzc+Hi4oIxY8ZgxYoVsLa2btTzALBhwwa89dZbmDlzJgoLC+Hp6Ynp06dj8eLFev2ORC1B3cWyR44cgSAIsLKyQqtWreDi4oKoqCiT6mUAPLnvnnhyHxEZmlarRXx8PJKSkpCZmYnr16/Dx8cHCoUC48aNQ0REhF4+hyf3ERGZubqwUCgUuHbtGq5fvw5nZ2eMHz8e4eHhJtfDqMOJcCKiZhYfH48vv/wSJSUlSEhIQF5eHlxcXNC+fXtkZmYau7z7YmgQETUDQRAA/N/mg0VFRdiyZQuqqqqk5e35+fnw9fU12V4GwOEpIiKDU6vVSE9Ph6+vL65cuYKKigqUlJTA398f1tbWGDBgAFQqFcaPH6+3eQxDYWgQERmAIAhQKBTSXnHnz5/H9evXIYoifvrpJ1RUVKBNmzYYMGAAVq9eLbU3dQwNIiI9q+tZVFVV4dChQ7h8+TIcHR0xYMAAxMXFwcrKCra2tnj00UdhY2NjNoEBcE6DiEivBEFAeno6amtrceTIEZw/fx4dO3ZEUVER9u/fDzs7O8hkMgwaNAg2NjbGPx/jAbGnQUSkRwqFAgEBAUhPT0e/fv3g5eUFa2trXLhwAX379kVxcTH69euHtWvXmlUPow5Dg4hIj7RaLcLCwnDkyBFUVlbCzs4OO3bsgJ2dHfz8/BAdHQ2VSgUAZhcYAEODiEhvoqOjsWvXLmi1WhQVFeHxxx/Hf//7X9ja2qKqqgpVVVVSYJgrzmkQET0kQRCg1Wpx+PBh5ObmwtPTE7dv38bPP/8MW1tbWFlZoUePHlCpVNL1GuaKPQ0ioodQt1IqMzMT2dnZCA0Nhb29PTIzM/H4449DqVRCFEUUFBSY/IV7jcHQICJqorqVUtXV1Th8+DCGDh0KpVKJHTt2wMfHB76+vqiuroZSqURUVJTJX7jXGAwNIqImUigUqKqqws6dO1FaWoqrV6/i6NGjqKmpQW5uLmpra6FUKvHmm2/WOzrBXHFOg4ioiSoqKnDu3Dn07NkTSqUShw4dknoWlZWV+PXXX1FVVWUxgQEwNIiImmTBggXw8vKClZUVWrdujYqKCqhUKjg7OyMoKAje3t4YMmQIlEql2U9+342hQUT0AARBwJYtW7BlyxYMHToUKpUKW7ZsgYODAzp16oTp06fjwIEDmDdvHuRyudld8f1XeHLfPfDkPiK6myAI2LlzJ9577z2cPHkS1dXV6NGjB06fPg2lUomZM2di+fLlOkNRpnLFN0/uIyJqRmq1GrGxsUhOTkZBQQGeffZZpKSk4OrVq3B3d0enTp2gVCrrBYQpBIa+MTSIiO5Dq9VCo9GgoKAAf/zxB55//nmoVCqUl5fD19cXMpkMnp6eCAwMtMiQ+DOGBhHRPdy9xXlVVRWefvppqFQqJCQkYPr06Xj33Xelti0hMACGBhFRg+ou3MvKysKPP/6IsrIy5OfnIy8vD4IgYMWKFS0mKO7G1VNERPdw4sQJ7Nq1C8888wy6d++Oy5cvo7q6GrW1tSgrKzN2eUbBngYR0Z/Ex8fjt99+w/HjxzF69GioVCpkZ2dLzzs4OMDJycl4BRoRQ4OI6C4JCQlYv349XF1dERwcDJVKhdjYWAiCgEceeQQAsG7duhY5NAUwNIiIJIIgYNu2bcjKykJJSQmcnZ1RWloKmUyGoKAg2NnZISQkBOPGjTN2qUbD0CAiusvhw4fx1FNP4ffff8fx48cBAK1bt0ZycjIEQbCofaSaghPhRET4v17Go48+CpVKhYyMDOk5KysraLXaFh8YAHsaRNTCabVa/PDDDzh27BiKioqkOYzq6mqpzaBBg8z+mFZ9YWgQUYu1YMECJCcn49KlSygsLISVlRWqq6t1AqN79+5ISEgwYpWmhaFBRC2OIAjYsWMHvvjiC8hkMjz55JO4ceMGDhw4AODOklqlUolu3bph4cKFLXalVEMYGkTUoiQkJCAmJgbHjh1DWVkZRo0aBZVKhUOHDklt+vTpgzlz5iAiIoKB8ScMDSJqMeLj4zF9+nTcunULoihi4MCBOnMYCoUCnTt3xtNPPw1ra2sGRgMscvXU22+/DZlMpnPz9vY2dllEZESCICAlJQUlJSWQyWSws7PDsWPHpMCwt7fH6NGjpQv40tPTLerEPX2x2J5G79698fPPP0v3raws9qsS0V8QBAHz589HXFwcamtrERkZicrKSnz33XdSMPTu3Ru9e/dGdXW1RZ64py8W+5vUysoK7u7ujW5ft/VxndLSUkOURUTNTK1WY+HChTh37hxkMhkiIyOhUqmQmJgotXF0dETnzp2xaNEi2NjYmMyJe6bIIoenAOD8+fPw9PREly5dMGnSJOTk5Ny3/apVq+Dk5CTdOnTo0EyVEpGhCIKAY8eO4ffff4coivDx8al3HUa3bt3w+uuvY/z48dLFewyMe7PIM8L37NmDsrIy9OzZE9euXcPSpUtx9epVnDx5Eo6Ojg2+pqGeRocOHXhGOJGZ69q1K7Kzs+Hs7IybN29CoVBAEATI5XJ0794d7777LsLCwiw6KHhG+F8YMWKE9N9+fn4ICQmBl5cXtm3bhr/97W8NvkapVEKpVDZXiURkYFqtFgsWLEB2djYiIyMhk8mwdetWaQ7D3t4effr0sfjA0DeLDI0/a926NXr06IELFy4YuxQiagZz587F7t27cfnyZWkOIzY2VqeNtbU1F8g0QYv4EysrK8PFixfxwgsvGLsUIjKwsLAwfP/99xBFER07doRSqay3l5Snpye6deuGcePGsZfxgCwyNObNm4ewsDB4eXkhLy8PS5YsgUKhwIQJE4xdGhEZiCAICA8Px+7duyGXy9GhQwfk5OTgm2++kdpYWVkhMDAQoaGh8Pf3R0REhBErNk8WGRq5ubmYMGECbt68CVdXVzz22GM4evQoXF1djV0aERmAWq3G6tWrcfToUcjlckRGRkKpVOoEhkKhQL9+/TB//nzOYzwEiwyNuLg4Y5dARM1EEATExMQgJSVFCow/z2G4u7vjo48+wpgxYxgWD8kiQ4OIWoaKigooFApkZGRAFEW4uLhAJpPpzGF07twZZ86c4QFKemKxF/cRkWUbM2YM2rdvj3bt2uH3339Hnz59cPPmTWzdulUKDAcHB6xdu5aBoUfsaRCR2amoqMCuXbukfaIiIyNhZ2eH06dP62wyGBoaivDwcOMVaoHY0yAis3B3GGi12nqBERMTo9OmTZs2mDBhAucw9Iw9DSIyeWq1GhqNBgEBAdBqtVi0aBEAwNbWFpWVlUhMTJSGpGxsbDBv3jwEBQVxSa0BWOTeU/qgz71aiKjpBEHApEmTcPLkSeTk5OCPP/6AXC5HSEgIjh07Vu/Mi169eiEtLQ0qlcpIFZseff4+4/AUEZk8QRCQn58vBUZkZCR69OgBuVz3V5i1tTWcnZ058W1AHJ4iIpOmVqtx7do13Lx5s951GHdvDeLu7g5nZ2c8/vjjnMcwIIYGEZms7du3Y8OGDbh48SIAQC6X48aNGzh06JBOYAQGBmLkyJFSGx6iZDgcniIikxQfH48lS5bg8OHDKCwsxLBhw2BjY4MDBw7U62GEhYUhICCAx7Q2A/Y0iMjkCIKA999/H+fPn9c5ovXusLCxscHw4cMRFBSEgIAAhIeHY/To0QwMA2NoEJHJqBtW2rZtG44fP47a2tp7zmE4Ojpi27ZtsLGxkYKCgWF4DA0iMglqtRqpqak4deoUfv31Vykgfv/9d2RkZNQLjCeeeILLao2AoUFERqfVarFw4ULk5OSgoqICcrkcYWFhSEpKwvHjx6V21tbWcHNzQ1ZWFpycnIxYccvF0CAio1Kr1fj6669x/vx51NbW6iyrLS0t1Wnr5uaGTp06wcHBwUjVEkODiIxGEASsXbsWmZmZqK2tBQBEREQ0OIfh7OyMKVOmoF+/fpy7MCKGBhEZhSAI0Gq1uHz5MsrKyqTHMzIykJ2drRMYXbt2xXvvvccT90wAQ4OImp1arUZcXBzS09ORl5cHmUyGiIgIHD9+HOfPn9dp27VrV5w6dYpbg5gIhgYRNSutVguNRoOMjAycPXtWZw4jLy9Pp61MJkPfvn3ZuzAhDA0iajZ1W5yfOHECZ86cAQCEhYU1OIfRrl07dO3aFZMmTWJomBCGBhE1i7KyMsTFxeHw4cO4evUqZDIZRFFESkoKbt68qRMYMpkMFy5cgEqlYmCYGIYGERncmDFjcPz4ceTn50Or1UpDUmfOnMGJEyd02trZ2eG1117jsloTxdAgIoOqqKjA8ePHcePGDZ3AUKlUOH36tE7bdu3aYcOGDRg7dqyRqqW/wtAgIoPau3cvbt68idu3bwMAhg8f3uAchpubG65evcrhKBPH0CAigykrK8NXX32F8vJy6ZS9I0eOoLKyUicw2rZti7y8PAaGGWBoEJFBRERE4IcffkBVVZU0JHXt2jUcOnRIp51MJsMnn3zCwDATDA0i0rutW7di586d9faSOnr0aL22YWFhnMMwIzy5j4j0ShAE6SwMAHjssccanMOQyWQYMGAA+vbtC0EQjFUuPSD2NIhIb7RaLSIjI7Fr1y7I5XJYW1sjOTkZycnJ9QLjf/7nf+Dk5MTjWc0MQ4OI9GLBggX4+OOPcfv2bWlI6o8//sCePXt02rm4uOCJJ57ABx98IJ3UR+aDoUFED23btm348MMP612HkZiYqNMuMjISPXr0wLJlywDweFZzxDkNImqSunmIsrIyfPPNN9BqtQAAf3//e56H4e3tzfMwzBx7GkT0wNRqNdLT07F3715pRZRcLoejoyPS09ORmZmJmpoanddMmzYNb7/9NgPDzLGnQUQPRBAEaDQaVFZW6gRGZGQknn76aYiiqBMYMpkMYWFheP/99xkYFoA9DSJ6ILt27cKBAwdw8eJFAP8XGHZ2doiJidFpa2Njg8DAwHpzG2S+GBpE1GiCIODYsWM4c+YMbt68CQDo3LkzVCoVYmJidOYwAKBfv36YPXs2exgWhKFBRI0iCAIWLVqEb775Bjdv3oRcLoe7uzsuXryI33//HaIo6rR/9NFHMWfOHERERBipYjIEhgYR/aWEhARoNBrs3LkT169fl4akrK2tERMToxMYCoUCsbGxGDNmDHsYFoihQUT3FR8fj/Xr1yM/Px8XLlwAAOk6jNjYWJ22fn5+0Gg0DAsLxtAgonsSBAHbt29HWloaysvLAdw5KMnKyqredRgAcPToUQaGheOSWyK6J0EQcPDgQek8jB49eqCgoKDBwHBwcGBgtADsaRBRg+Lj4/Htt98iPz9fZ2uQCxcuSDvY1pHL5fD19WVotAAMDSLSIQgCEhISMGPGDNy6dUsnMGJjY3UCw9nZGXZ2dujYsSPmz5/P0GgBGBpEJElISEBcXBx++OEHaQ7D3t4e1dXVSExM1BmSsra2xsaNG6VVUgyMloGhQUQA7gxHffTRR0hOTkZNTQ3kcjkCAwORlpbW4BXdAQEBmDBhghEqJWPiRDgRQRAEbN26FSdOnJACIzIyEr17926wB+Hi4oJnnnmGJ+61QOxpEBF27tyJ7777DlVVVfXmMP68W22/fv3QpUsXBAYGckiqBWJoELVwWq0WMTExqKqqAgBYWVmhpKSk3hyGTCZDv379kJSUBIAHKLVUHJ4iasHUajUWL16Mffv2QS6XY8iQIZDJZNi7d2+96zBGjRqFpKQkTnq3cOxpELVQFRUVmD9/PrKzsyEIgjQkdeTIkXpte/TogalTpzIsyLJ7Ghs3bkSnTp1ga2uLkJAQHDt2zNglEZmE6OhoODg44Pz58zqB0dCV3s8++yxOnTqF8PBw4xRLJsViQ2Pr1q2YM2cOlixZAo1GA39/f4SGhqKwsNDYpREZVUVFBdavXy9dpCeKInJzcxsMjKCgIHz//ffsYZDEYkNj3bp1eOWVVzBt2jT4+Phg06ZNsLOzwxdffGHs0oiMZsuWLXjsscdw+/ZtyOVyPPvss2jVqhWSkpIa7GEcP37cSJWSqbLIOQ2tVou0tDRER0dLj8nlcgwbNgzJyckNvqaqqkpaPQIApaWlBq+TqDndPUR797La27dv12v72muvYcOGDc1dIpkBi+xp3LhxA4IgoF27djqPt2vXDvn5+Q2+ZtWqVXBycpJuHTp0aI5SiQxOEAR8++23OnN6Y8aMueccRnBwMAOD7skiQ6MpoqOjUVJSIt2uXLli7JKIHlpCQgImTpyI6dOn6zyelZVVLzCUSiVef/11pKamNneZZEYscniqbdu2UCgUKCgo0Hm8oKAA7u7uDb5GqVRCqVQ2R3lEzWL79u1Yv349Tp06Jc1hjBo1CseOHcOpU6d02jo4OOCzzz7jXlL0lyyyp2FjY4OgoCDs379feqy2thb79+/HwIEDjVgZUfOIj4/H3LlzkZKSorO9uZOTE65fv67T1t7eHjNnzmRgUKNYZE8DAObMmYMpU6YgODgY/fv3x4cffojy8nJMmzbN2KURGZQgCEhNTUVhYaE0/BQeHt7gHIatrS1mzZqFpUuXGqtcMjMWGxpRUVG4fv06Fi9ejPz8fAQEBODHH3+sNzlOZGnefPNNbNy4UWc1YGpqKvLz8+tNevfv3x99+/bldRjUaDJRFEVjF2GKSktL4eTkhJKSErRq1crY5RA1SlxcHP72t79JcxhjxoxBZmYmzpw5o9NOpVLhueeew/jx4xEREWGkaqm56PP3mcX2NIhamu3bt2PmzJlSYNRdh3Hx4kWddg4ODvjf//1fREZGsodBD8wiJ8KJWoK7D0BKSEjA7NmzUVRUBAAYMWJEg3MYdnZ2mDFjBqKiohgY1CTsaRCZIbVajfT0dAQEBCA0NBRJSUm4evUq5HI5RFFEUlISysrK6gXGF198gaioKCNWTuaOoUFkZgRBQHp6OgBgzZo1mDx5MsrLy6UhqcuXLyMlJaXe60aMGIHIyMhmrpYsDYeniMyMQqFAQEAA4uLikJycrBMYKpUKGo2m3mseeeQRTJw4kUNS9NAYGkRmaNiwYTh79qx0f8iQIffcSyokJAQfffQRV0mRXnB4isiMCIKA+Ph4TJ48GcCd3WoVCgWSkpIgCEK9wAgLC0NiYiJ7GKQ37GkQmQm1Wo3BgwcjKioK1dXV0pDUE088gcrKSp3AkMvlmDVrFr777jsGBukVQ4PIDAiCgJiYGOk8mLvnMA4ePFiv/ejRo/Hee+81d5nUAjA0iExc3fUYd/ck+vXrd885jO7du+PFF19kD4MM4oHnNC5evIiuXbsaohYi+hO1Wo3U1FT069cPhw8fhlwuh52dHVJTU6HRaOoNSY0YMQI7d+5kYJDBPHBozJgxAxcuXIC7uzv8/Px0bk5OToaokahFEgQB0dHRyMvLQ1lZGQAgMjISWq0WarUatbW1UlsHBwe88sorWLdunbHKpRbigYen9u3bh0uXLiEsLAyFhYW4evUq3nnnHbi4uKBbt26GqJGoRaqoqEB2drZ0Xn3dHMb3339fr+2mTZsYGNQsmrzkdtu2bdJVqQDw008/ISYmRh81EbVogiBArVYjJiYGlZWVAICePXvecw6jZ8+eGD9+vDFKpRaoyaFha2uLU6dOwcfHBwAwfPhwREdH660wopZIrVYjNjYWe/bsQVlZGeRyOdq0aYPTp0/j7NmzOkNScrkczz//PCZPnsw5DGo2TQ6Nzz//HFFRURgyZAgCAgKQmZkJmUymz9qIWpS6E/cyMzOlwIiMjIRcLkdcXJxOYMyaNQuOjo5YtGgRbGxsjFg1tTRNXnLbu3dvpKWlYfDgwcjOzoaXlxf27Nmjz9qIWoS6JbWLFi3CV199hTNnzuhchxEfH6/T3tHRESqVCoGBgQwManZN7mncuHEDn332GaytrbF8+XJ91kTUYtRtcd6rVy98+umn0nkYnp6esLGxaXAOY/DgwVi+fDmHpMgomtzTiIyMRJs2bbB582YAQGZmJhYuXKivuogsXt0W56dOncKSJUtQVFQEuVyOzp07Izc3F99++229wGjXrh2+//57BgYZTZNDo7y8HNOnT5e6x76+vti7d6/eCiOydAqFAhUVFfjuu+9w9uxZaUhq8ODB9eYHZTIZZs6cifz8fCNVS3RHk0OjXbt2yMvL0/mfu255IBHdnyAI0Gq12LFjB6qqqnTmMLZs2QJRFKW2VlZWmD17NjZu3GjEionuaHJofPjhh5g6dSoKCwuxdetWTJs2Dd7e3vqsjcgiqdVqTJgwAc7Ozvj9998BAE5OThBFsd4chlwux6hRo7BmzRpjlUuko0kT4bW1tfj111+xe/duqNVqZGZmIjg4GNOmTdN3fUQWRRAEbNmyBbt370ZFRQXkcjl8fX2RkZGB7du367SVy+Xw8PDgiXtkUpoUGnK5HJ9++ileeukljBs3DuPGjdN3XUQWp25p7eXLl6XAqBuSysrKQk1NjdTW09MTcrkcEydOxJgxY4xVMlE9TV5yGxwcjI8//hivvfaaPushskjx8fHIyMjAjz/+iNTUVJ3AiI2N1QkMZ2dnvPjii7C2toZcLocgCOxpkMlocmjk5uZiz549eO+99zBo0CD4+vrC19cXzz33nD7rIzJ7CQkJWLJkCfLy8qTrMJRKJcrLy5GYmKgzh2Fvb4/p06cjJCQE6enpCAgIYGCQSWlyaOzcuRMAUFZWhqysLGRmZuLnn39maBDdRavVIj09HUVFRdJ1GIMGDcLRo0d1dqu1t7fHp59+irFjx0rL2MPCwhgYZHKaHBoajQbvv/8+ioqK4OvrixkzZuDll1/WZ21EZk2tVkOj0eCHH35AXl6ezpBUSkqK1M7JyQn/+c9/MHbsWJ3XMzDIFDV5yW1UVBRGjhyJFStWoEePHoiIiMBPP/2kz9qIzJYgCIiNjcUHH3yAtLS0enMYdw9JffLJJ/UCg8hUNbmn4ezsjIkTJwIA+vbti/DwcAwdOhTDhw/XW3FE5qpu4rvuxD2ZTIaCggIkJSXpBEb37t0RFRVlrDKJHliTexpdu3bF+++/L1252rp1a33VRGTWEhISMHfuXFy7dg1yuRzDhw+HSqXCwYMH6016r1q1isNQZFaaHBpVVVX497//jY4dO+KZZ55Bnz59MGzYMFy9elWf9RGZFUEQsHDhQuTm5qK8vByRkZHw8PBAVVWVTjsbGxv85z//4TUYZHYaPTx15coVdOjQQbqfkJAA4M7GhZmZmThx4gROnDiBCRMmIC8vDxcuXNB/tUQmTKvVIiEhAdnZ2ZDJZPecw5DJZHjmmWcwYcIEI1ZL1DQy8e6d0e7D3t4ec+fOxcKFC2FnZ2fouoyutLQUTk5OKCkpQatWrYxdDpmguy+6i46ORlJSEs6dOyftRNu3b1+cPHlSJzBsbW3xj3/8A+vWrTNKzdQy6fP3WaOHp/bt24e9e/eie/fu0hkaRC2VWq3G8uXLoVarUVFRgaSkJGg0GhQWFmLUqFFwc3PDb7/9phMYbm5u+PrrrxkYZNYaHRqDBg1CSkoKVq1ahbfeegtBQUE4dOiQIWsjMkl1hycBQExMDF544QWcOHECt2/fRmRkJJydnaUrv+tYW1vj73//OyIiIoxQMZH+PPBE+IsvvoizZ89i5MiRGDFiBCIjI3Hp0iVD1EZkkhQKBQICArBv3z7s3r0biYmJKC4uRkRERL05DGtra/Tr1w8REREICgriSikye01ePTV8+HC8/PLLSExMhI+PD+bPny+tSSeydM8++yxkMhm0Wi1qa2sB3Nkl4c+T3m3btsUzzzyDr7/+GuHh4Uaqlkh/Gr16atOmTUhNTUVqaipOnz4NuVyOPn36YMaMGfD390dcXBx8fHyQkJCA4OBgQ9ZMZFRarRb/+te/kJaWBgCIjIyERqORDlSqY2trC2tra/Tp00faT4rI3DV69VSHDh0QEhKCAQMGYMCAAQgKCoJKpdJps3LlSsTGxuLkyZMGKbY5cfUUNSQ6OhpfffUVbty4AUEQ7rms1srKCj179sTIkSOxevVqI1ZMpN/fZ40OjcYoKCiAp6endNiMOWNo0J9ptVp4eHjg1q1bAIBRo0bB2dm5XmAoFAo4OzvjwoULcHJyMla5RBJ9/j5r8t5TDXFzc8OBAwf0+ZZEJmPHjh0oKiqCTCaDKIo4evQoioqKpMCwsbGBvb09bt++jTZt2sDBwcHIFRPpn15DQyaT4YknntDnWxKZhISEBHz88cfSld7nz5/Hb7/9ptPG0dERTz75JERRxOTJk7lSiiySXkODyBJptVpER0fjypUr0hzGn+ftvL29ER4ejnfeeQcAz8Igy8XQILoHQRCwa9cuzJw5E9euXZN2q717DkMul+Pbb7/FmDFjuEKKWgSGBlEDtm7diszMTOzbtw8FBQVQKBQ4cuQItFqtzqR3t27dMG7cOPYsqMVgaBD9SUREBH788UeIogitVovIyEgUFBTg4MGDUhsrKyu0bt0ay5cvZ2BQi8LQILpLRUUFDh06hIqKCp0jWpOSkqQ2Xbt2xSOPPIIBAwZg3LhxRqyWqPkxNIjusnjxYpSUlAAABg4c2OBeUhMmTMCbb75Z7+JWopaAoUH0/23fvh0ff/wxBEGASqVCSkoKjh07Vu88DD8/PwYGtVhN3rCQyFIIggBBEPD+++9LcxhDhw5FTU2NTmC0adMG06dPx9ixY41YLZFxWWRodOrUCTKZTOf27rvvGrssMkFqtRpLly5FREQEUlNTpTmMn376SWqjUCjQq1cvbNy4EWvXrjVitUTGZ7HDU8uWLcMrr7wi3Xd0dDRiNWSKKioqsGXLFmRmZuLs2bPw9fXVmcOwsrJCYGAgvLy8MH78eB6gRAQLDg1HR0e4u7sbuwwyUdHR0di5cycKCgpQUlICJycnZGRk4OTJkxAEATKZDD169ICXlxe+/fZbXrhH9P9Z5PAUALz77rto06YN+vbti7Vr16Kmpua+7auqqlBaWqpzI8uk1Wrx7bff4uzZsyguLsaYMWMwbNgwAJB2aA4JCYGrqyvkcjmvwyC6i0X2NF5//XUEBgbCxcUFSUlJiI6OxrVr17Bu3bp7vmbVqlVYunRpM1ZJza1uwlutVuPatWsAoHMeBnBn080BAwZg7ty5yMjIQGBgIEOD6G6imViwYIEI4L6306dPN/jazz//XLSyshIrKyvv+f6VlZViSUmJdLty5YoIQCwpKTHUV6JmlJiYKD766KOij4+POGDAABGA2LlzZ/HFF18Ura2tRQCivb29OGDAADExMVEURVGsqakxbtFEelJSUqK332dm09OYO3cupk6det82Xbp0afDxkJAQ1NTUIDs7Gz179mywjVKphFKpfNgyyQQJgoC0tDTk5OSgoqICFy9eRPv27XHp0iVkZ2dDFEXY2NigY8eOeOqppxAWFgaAO9USNcRsQsPV1RWurq5Nem16ejrkcjnc3Nz0XBWZA4VCgZ9++gl5eXkQRRGRkZGwsbHBt99+C1EUIZfL4erqChcXFwQHBzMsiO7DbEKjsZKTk5GSkoInn3wSjo6OSE5OxuzZszF58mQ4OzsbuzxqZoIg4I033sBvv/0mBcaf5zBcXFwwZcoUKBQKqZdBRA2zuNBQKpWIi4vD22+/jaqqKnTu3BmzZ8/GnDlzjF0aNTO1Wo2YmBjs3bsXNTU1aNu2LeRyuc5eUjKZDF26dIG1tTUCAgLYyyD6CxYXGoGBgTh69KixyyAjEwQBGo0GBw4cQHl5Oby9vXH69GnExcVJbRQKBTw8PBAaGoo333yT12IQNYLFhQZRnd69e6O0tFQakjp79ixqa2sB3AmMrl27wtXVFYGBgQwMokZiaJDFiY+PR2ZmJm7evImIiAhpDqMuMOzt7dG+fXvpLAzOYxA1HkODLEpCQgI++ugjXLx4EaWlpXjqqaeQmJioc6b38OHD0bNnT8jlcs5jED0ghgZZjLrtzc+dO4euXbsiNTUVO3fu1Gnj7u6OPn36QC6Xcx6DqAkYGmQxduzYgfT0dISFhcHW1hYajUYakgLuXOT55JNPSj0MBgbRg2NokEVISEjAvHnz8Nxzz8HW1haxsbGQyWSwsbGBg4MDBg8ejPj4eCgUCgiCwCEpoiZiaJDZEwQBMTExuHXrFm7duoWDBw+iuroacrkc3bp1w7JlyxAVFSW1Z2AQNZ3Fbo1OLYMgCJg/fz5u374NURTx888/S5PeVlZWqKyslM7IIKKHx9Ags5WQkIDHH38ceXl58PDwkIJBoVDAwcEBbm5u6NChA4KCgti7INITDk+R2REEAQkJCVi/fj06duwIpVKJ2NhY2Nvbw83NDY6Ojli6dClGjx4NhULBwCDSI4YGmZW6/aR++eUX3L59G9XV1dBoNACAjz/+GGfOnIG/vz/GjBlj5EqJLBNDg8yGIAjYsmULfv31VwwYMABJSUlISUmBTCaDra0trKyssGTJEvYsiAyIcxpkNrRaLWprazF06FC0bdsWZWVlkMlkkMlk6NChA06dOmXsEoksHkODTJ4gCJg7dy769esHpVIJW1tbbN26FaIowsHBAd27d4eHhwf8/PzYyyAyMA5PkUlTq9VYuHAhLly4AOBOgOTk5KC2thYBAQHo1KkTFAoFxo4di4iICCNXS2T5GBpksgRBQGpqKq5evYrRo0cjNTUVZ86cgUwmQ7du3WBvb49evXoBAMLDw41bLFELwdAgk6VQKODv749Ro0bB2toa+fn5AO6czuju7o6QkBDuVEvUzBgaZLLi4+ORlZUFlUqFr7/+GtXV1VAoFHB1dcU///lPjB07lvtIETUzhgaZpPj4eHz00Ufw8vLCzp07UVNTA7lcDg8PD6xZswZjx44FwH2kiJobV0+RydFqtdIeUgcPHoSPjw8cHBzg7OyMiRMnYvz48cYukajFYk+DjK5uiEmr1QIAli1bhsrKSqSlpcHW1hYXLlyQ2vAMDCLjYmiQUanVaqSnpyMzMxNnz56Fv78/bG1tERMTI81hCIIAlUpl7FKJCAwNMiJBEJCeno7q6mqkpaVBFEUcPHgQt2/fRk1NDWQyGby8vNi7IDIhDA0yGoVCgaqqKhw9ehRPPfUUcnNzkZWVBR8fH9TW1sLT0xOTJ0/mZDeRCWFokNFotVoolUoMHjwYpaWlCA4ORkhICBYtWiQFBQODyLQwNKjZ1Z2HkZWVhfz8fNja2iI3Nxd9+vRBQEAAh6OITBhDg5qVWq3G2rVrcfHiRahUKly/fh3W1tbo3bs3YmNjGRhEJo6hQc1Gq9Xi+PHjuHr1Kp5++mncuHED2dnZkMvluHz5srHLI6JGYGiQwQmCgF27dkGj0eD06dMYMmQIlEolTp06JfUsOnbsyPkLIjPA0CCDio+PR0ZGBg4cOACFQgEnJyd4eXlBEAR88MEH2LJlC2QyGSZOnMjQIDIDDA0ymISEBKxfvx5ubm4oKSmReheXLl3Cc889h4iICIwePRoAV0kRmQuGBhmEIAjYtm0bLl26hNOnT2PixImorKxEYWEhSktLcfHiRe5QS2SGGBpkMLW1tfjjjz8QGhqKiooK2NnZoVWrVgAAuZx7ZRKZI4YGGYRCoUBkZCTOnTsHlUqFuLg4+Pv7Y8SIEVCpVAgMDGQvg8gMMTTIILRaLR577DHY29tj9+7dAAB3d3fY29vjzTff5PUYRGaKoUF6l5iYiPT0dDg5OeGNN95AWloatFotVCoVr/gmMnMMDdKLu8/E2LdvH2pra/HLL7/gl19+QVhYmLTFOYekiMwbQ4MeWt2ZGL1790b//v0hCAJ+/vlnqFQqCIIg9SwYGETmj6FBD6XuTIz9+/fjp59+wo0bN5CbmwtRFPHss89yKIrIwnDdIz0QQRB0/luhUMDHxwedOnWCj48PsrOzYWVlBRsbG3h7e+u0JyLzx54GNVrdMFRAQAAAID09Hf7+/hBFES4uLvj+++/h6OgIuVyOtm3bol+/fhySIrIwDA1qlLphKADQaDQA7lygl5GRgd69e+Pxxx+Ho6MjgoODERoaChsbGwYGkQViaFCjKBQKBAQEID09HYGBgRBFERkZGfD398fzzz8PAAgPD2dQEFk4mSiKorGLMEWlpaVwcnJCSUmJtPUF/d+cxo4dO1BRUYFJkybB2trayFUR0f3o8/cZJ8LpgWi1WmzYsAGnT5+Gvb09A4OoheHwFDXaggULkJqaik6dOqGiogL//e9/oVAoEBERYezSiKiZsKdB91U3HLVt2zacOXMG2dnZ2LVrFzIyMuDu7o4TJ05wWS1RC8KeBt1T3RLbXr164fTp0+jUqROOHDmCnj174pFHHkGPHj0QEBDAyW+iFoShQQ0SBAEajQbnzp3D1atXYWdnh8LCQkybNg329vYICAiQ9pQiopaDoUEN2rVrF86cOYNTp07B29sbFy9exKBBg7B06VIA3EeKqKUyuzmNFStWYNCgQbCzs0Pr1q0bbJOTk4ORI0fCzs4Obm5ueOONN1BTU9O8hZqxugv5fHx84O/vD7lcDjc3NwQHB0OhUDAwiFows+tpaLVajB07FgMHDsTnn39e73lBEDBy5Ei4u7sjKSkJ165dw4svvghra2usXLnSCBWbp9atW6O4uBgREREIDw8HwN4FEZnxxX2bN2/GrFmzUFxcrPP4nj178NxzzyEvLw/t2rUDAGzatAkLFizA9evXG73raku9uE8URWzfvh0VFRUYN24cVCqVsUsioofEi/vuIzk5Gb6+vlJgAEBoaChKS0uRlZV1z9dVVVWhtLRU59ZS3L1kViaTwdvbGxMmTGBgEFE9Zjc89Vfy8/N1AgOAdD8/P/+er1u1apU0yduSqNVqaDQa9O3bF3K5HP3794efn5+xyyIiE2USPY2FCxdCJpPd93bmzBmD1hAdHY2SkhLpduXKFYN+nikQBAFxcXE4dOgQDh8+jFu3bt1zcQEREWAiPY25c+di6tSp923TpUuXRr2Xu7s7jh07pvNYQUGB9Ny9KJVKKJXKRn2GpenVqxcUCgUcHR2xevVqBAQESJPfRER3M4nQcHV1haurq17ea+DAgVixYgUKCwvh5uYGANi3bx9atWoFHx8fvXyGpZDL5Rg/fjw0Gg18fHxw8uRJAHcOV+KFe0TUEJMIjQeRk5ODW7duIScnR+dgoG7dusHBwQHDhw+Hj48PXnjhBaxZswb5+flYtGgRXn311Rbbk2iIIAiIj49HQEAAamtrceLECVRVVUGpVHJrECK6J7MLjcWLF+Orr76S7vft2xcA8Msvv2DIkCFQKBTYvXs3/vGPf2DgwIGwt7fHlClTsGzZMmOVbHK0Wi0++eQTFBcXQy6XSz0MpVKJN998s9HLkomo5THb6zQMzVKv01Cr1fjtt99QUVEBOzs7AICvry8yMzM5l0FkofT5+8zsehrUdNXV1dBoNJDL5bhy5Qq6d++OwMBAhIeH86hWImoUhkYLUHfx3saNG1FYWIji4mKMHz9eZ7KbgUFEjcHQsHB1Z2LUdU3d3d3h5ubG1VFE1CQmcXEfGUbd6jJRFFFSUoLevXsDAAIDAxkYRNQk7GlYuKqqKhw/fhzBwcEYO3YsIiIiGBhE1GQMDQslCAJ27NgBpVKJgQMHQi6XQxAEBgYRPRQOT1mgugv3Kisr4evrC7lczgv2iEgv2NOwQMeOHUNFRQUmTJgAGxsbLqclIr1haFiIumW1lZWV6N+/P4KCgqQruxkYRKQvDA0LULestnXr1ujSpQtGjRrFoCAig+Cchpm7e9PG4uJiPP3008YtiIgsGkPDzCkUCnh5eQG4s4cUj2glIkPi8JQZEwQBRUVFmDp1Kqqrq7k7LREZHHsaZqpuWe3+/fshk8kYGETULBgaZqguMCoqKvD8888buxwiakEYGmYoNzcXVVVV0nUYRETNhXMaZkQQBOTm5sLLywuTJ0+GTCYzdklE1MKwp2Em6oakfv31V4iiyMAgIqNgaJiBu+cwoqKiGBhEZDQMDTNQXFwMURQ5h0FERsfQMGGCICAzMxMuLi6IiopiYBCR0TE0TFTdkJRGo0Ftba2xyyEiAsDQMEl3z2FMmDCBmw8SkcngklsTVFlZCVtbW4SHh3NIiohMCnsaJkQQBCQlJcHW1hajRo1iYBCRyWFomIi6Ialz585JByoREZkahoYJqAuM27dvY+LEiexhEJHJ4pyGCRBFEW3btsVjjz3GwCAik8aehhEJgoB9+/ZBq9Vi6NChDAwiMnnsaRjJ3ctqraz4YyAi88CehhHU1tbqXIfBHgYRmQv+E9cIZDIZunTpAj8/PwYGEZkV9jSakSAI2LVrF27evIng4GAGBhGZHfY0msndcxitWrUydjlERE3CnkYzEEURiYmJnMMgIrPHnkYzkMlk8Pf3h5eXFwODiMwaexoGVDcklZ2dje7duzMwiMjssadhIHfPYXh6ehq7HCIivWBPw0B2797NOQwisjjsaeiZKIqQyWQICQmBi4sLA4OILAp7GnokCAK2b9+OjIwMuLu7MzCIyOIwNPTk7jmMXr16GbscIiKDYGjoyb59+ziHQUQWj3MaD6HuhD2ZTIZBgwbB1taWgUFEFo2h0URqtRrp6elo3bo1goKCMHjwYGOXRERkcByeagJBEJCeng4AKC4uRnBwsHELIiJqJgyNJlAoFPDw8AAA+Pr6QqVSGbkiIqLmweGpByQIAqqrq/HSSy+hpqaGgUFELQp7Gg+gblntgQMHYG1tzcAgohaHodFId1+HMWzYMGOXQ0RkFAyNRsrIyOB1GETU4pldaKxYsQKDBg2CnZ0dWrdu3WAbmUxW7xYXF9ekzxMEAcXFxejbty8mTZrEwCCiFs3sQkOr1WLs2LH4xz/+cd92X375Ja5duybdwsPDm/R5O3fuxM8//wyZTAYrK64bIKKWzex+Cy5duhQAsHnz5vu2a926Ndzd3R/68yorKzFx4sSHfh8iIktgdqHRWK+++ipefvlldOnSBTNmzMC0adMgk8nu2b6qqgpVVVXS/ZKSEgBAaGgoKisrUVlZafCaiYgMobS0FMCdoxselkWGxrJlyzB06FDY2dnhp59+wsyZM1FWVobXX3/9nq9ZtWqV1Iu5W5cuXQxZKhFRs7l58yacnJwe6j1koj6i5yEtXLgQq1evvm+b06dPw9vbW7q/efNmzJo1C8XFxX/5/osXL8aXX36JK1eu3LPNn3saxcXF8PLyQk5OzkP/IZuL0tJSdOjQAVeuXEGrVq2MXU6z4fduOd+7JX5n4M7ISceOHVFUVHTPBUSNZRI9jblz52Lq1Kn3bfMw/+IPCQnB8uXLUVVVBaVS2WAbpVLZ4HNOTk4t6n8uAGjVqlWL+84Av3dL0hK/MwDI5Q+/9skkQsPV1RWurq4Ge//09HQ4OzvfMzCIiKhxTCI0HkROTg5u3bqFnJwcnd1mu3XrBgcHB+zatQsFBQUYMGAAbG1tsW/fPqxcuRLz5s0zbuFERBbA7EJj8eLF+Oqrr6T7ffv2BQD88ssvGDJkCKytrbFx40bMnj0boiiiW7duWLduHV555ZUH+hylUoklS5a0qN5JS/zOAL93S/reLfE7A/r93iYxEU5ERObB7K4IJyIi42FoEBFRozE0iIio0RgaRETUaAyNBjT39uumoDHfOScnByNHjoSdnR3c3NzwxhtvoKampnkLNbBOnTrV+7m+++67xi5L7zZu3IhOnTrB1tYWISEhOHbsmLFLMqi333673s/17h0mLMWvv/6KsLAweHp6QiaTQa1W6zwviiIWL14MDw8PqFQqDBs2DOfPn3+gz2BoNKC5t183BX/1nQVBwMiRI6HVapGUlISvvvoKmzdvxuLFi5u5UsNbtmyZzs/1n//8p7FL0qutW7dizpw5WLJkCTQaDfz9/REaGorCwkJjl2ZQvXv31vm5Hj582Ngl6V15eTn8/f2xcePGBp9fs2YN1q9fj02bNiElJQX29vbSpqyNJtI9ffnll6KTk1ODzwEQExMTm7We5nCv7/zDDz+IcrlczM/Plx7797//LbZq1UqsqqpqxgoNy8vLS/zggw+MXYZB9e/fX3z11Vel+4IgiJ6enuKqVauMWJVhLVmyRPT39zd2Gc3qz7+jamtrRXd3d3Ht2rXSY8XFxaJSqRS3bNnS6PdlT+MhvPrqq2jbti369++PL774Qi/bDpuq5ORk+Pr6ol27dtJjoaGhKC0tRVZWlhEr0793330Xbdq0Qd++fbF27VqLGoLTarVIS0vTOedeLpdj2LBhSE5ONmJlhnf+/Hl4enqiS5cumDRpEnJycoxdUrO6dOkS8vPzdX72Tk5OCAkJeaCfvdldEW4qmrL9ujnLz8/XCQwA0v38/HxjlGQQr7/+OgIDA+Hi4oKkpCRER0fj2rVrWLdunbFL04sbN25AEIQGf5ZnzpwxUlWGFxISgs2bN6Nnz564du0ali5disGDB+PkyZNwdHQ0dnnNou7vaUM/+wf5O9xiehoLFy5scPL67tuD/KV566238Oijj6Jv375YsGAB5s+fj7Vr1xrwGzw4fX9nc/Ugfw5z5szBkCFD4OfnhxkzZuD999/Hhg0bdLbNJ/MzYsQIjB07Fn5+fggNDcUPP/yA4uJibNu2zdilmZ0W09Mwhe3Xm5s+v7O7u3u9FTYFBQXSc6bsYf4cQkJCUFNTg+zsbPTs2dMA1TWvtm3bQqFQSD+7OgUFBSb/c9Sn1q1bo0ePHrhw4YKxS2k2dT/fgoICeHh4SI8XFBQgICCg0e/TYkKjJW6/rs/vPHDgQKxYsQKFhYVwc3MDAOzbtw+tWrWCj4+PXj7DUB7mzyE9PR1yuVz6zubOxsYGQUFB2L9/v7Tar7a2Fvv378drr71m3OKaUVlZGS5evIgXXnjB2KU0m86dO8Pd3R379++XQqK0tBQpKSl/uVL0bi0mNB5ES9x+/a++8/Dhw+Hj44MXXngBa9asQX5+PhYtWoRXX33VpILyYSQnJyMlJQVPPvkkHB0dkZycjNmzZ2Py5MlwdnY2dnl6M2fOHEyZMgXBwcHo378/PvzwQ5SXl2PatGnGLs1g5s2bh7CwMHh5eSEvLw9LliyBQqHAhAkTjF2aXpWVlen0ni5duoT09HS4uLigY8eOmDVrFt555x10794dnTt3xltvvQVPT88Hu1xAjyu8LMaUKVNEAPVuv/zyiyiKorhnzx4xICBAdHBwEO3t7UV/f39x06ZNoiAIxi38IfzVdxZFUczOzhZHjBghqlQqsW3btuLcuXPF6upq4xWtZ2lpaWJISIjo5OQk2trair169RJXrlwpVlZWGrs0vduwYYPYsWNH0cbGRuzfv7949OhRY5dkUFFRUaKHh4doY2MjPvLII2JUVJR44cIFY5eld7/88kuDf4+nTJkiiuKdZbdvvfWW2K5dO1GpVIpPPfWUePbs2Qf6DG6NTkREjdZiVk8REdHDY2gQEVGjMTSIiKjRGBpERNRoDA0iImo0hgYRETUaQ4OIiBqNoUFERI3G0CAiokZjaBARUaMxNIj0pH379vjkk090HktKSoKdnR0uX75spKqI9IuhQaQnISEhSE1Nle6LoohZs2Zh9uzZ8PLyMmJlRPrD0CDSkwEDBuiExjfffIMrV64gOjoamzZtQkBAAHx9fWFjY4OAgAAEBARg48aNRqyY6MFxl1siPTl06BCGDBmCkpISyGQy9OzZE0uXLsXf/vY3qc2JEyfwyiuvICUlpcH3EAQBCoWiuUomemDsaRDpSVBQEORyOTQaDVavXg1XV9d6BxtlZWWhd+/eOo+NGjUKM2fORL9+/fDll18iMDAQRUVFAO7MiURFRQEAzp8/j5EjRyIoKAiPP/44CgsLm+eLEd2FoUGkJ3Z2dvD19UV8fDzee+89fPDBB5DLdf+KnTx5sl5oZGZmomfPnkhNTcXUqVNRUlIinRSYmZkJX19fVFVVYebMmfj000+RlpaGiRMn4rPPPmu270ZUh6FBpEcDBgzAhg0bEBoaiiFDhtR7PisrC3369JHu//HHHxAEAf/zP/8DADh37hy6d+8uPX/y5En06dMHarUaWVlZeO655xAQEICPPvoI1tbWBv8+RH/GM8KJ9Mjf3x/W1tZYu3Ztg8//uaeRlZWFQYMG6Tx/d6gcP34cs2bNwpdffon333/f4s60JvPDngaRHsXFxeG1115Dt27d6j1XUVGBoqIitG/fXnqsbvipzq1bt9C6dWsAwJEjR5CVlYUuXbrA3d0de/fuldqdOHHCcF+C6D7Y0yB6SLW1tbh+/To+//xznD9/Hjt37myw3enTp+Ht7a3zWGZmJoYNGybdHzFiBEaPHo1z587By8sLvXr1gkwmw7Rp0/Dzzz/D29sbSqUSoaGhWLNmjUG/F1FDuOSW6CH997//xdChQ+Ht7Y0vv/wSISEhxi6JyGAYGkRE1Gic0yAiokZjaBARUaMxNIiIqNEYGkRE1GgMDSIiajSGBhERNRpDg4iIGo2hQUREjcbQICKiRmNoEBFRo/0/z6NsfN65dKYAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "r2 = pearsonr(pred[\"f\"], f)[0] ** 2\n", "fig, axes = plt.subplots(1, 1, figsize=(4, 4))\n", "axes.scatter(x=pred[\"f\"], y=f, c=\"black\", alpha=0.5, s=5, lw=0)\n", "ticks = np.arange(-10, 9, 2)\n", "axes.axline((0, 0), (1, 1), lw=0.75, linestyle=\"--\", c=\"grey\")\n", "axes.set(\n", " xlabel=r\"$y_{True}$\",\n", " ylabel=r\"$y_{pred}$\",\n", " aspect=\"equal\",\n", " xlim=(-15, 10),\n", " ylim=(-15, 10),\n", ")\n", "axes.text(\n", " 0.03,\n", " 0.97,\n", " r\"$R^2$=\" + \"{:.3f}\".format(r2),\n", " transform=axes.transAxes,\n", " va=\"top\",\n", ")\n" ] }, { "cell_type": "markdown", "id": "78636627", "metadata": {}, "source": [ "### How to calculate uncertainty of the predictions\n", "\n", "In the previous section, we have shown how to compute the posterior mean of the complete genotype-phenotype given the data and the estimated variance components. However, in cases where the ground truth is not known, it can be useful to have an idea about the uncertainty of the phenotypic predictions for new sequences. As we are using Gaussian process models with Gaussian likelihood function, we can compute, not only the posterior mean, but also the posterior variance and 95% probability credible interval for these sequences by setting `calc_variance=True`.\n", "\n", "> **Note**: Computing the variance for every possible sequence is usually unfeasible because we need to solve a system of $~\\alpha^\\ell$ equations for computing the variance of each sequence. Thus, in practice, this calculation can only be done for a small subset of sequences of interest.\n", "\n" ] }, { "cell_type": "code", "execution_count": 9, "id": "1b2ad2fb", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 403/403 [00:16<00:00, 24.33it/s]\n" ] }, { "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", "
ff_varf_stdci_95_lowerci_95_upper
AAAACG-1.6611660.0228020.151005-2.026398-1.422378
AAAACT1.7390730.0217530.1474881.3611761.951128
AAAAGA1.8571920.0217620.1475201.4397202.029800
AAACGG-5.3959390.0207710.144121-5.487868-4.911382
AAAGAT1.5547740.0228720.1512341.2772051.882139
..................
TTTGCC-8.3407580.0217560.147500-8.462849-7.872850
TTTGCG-4.5011580.0217030.147320-4.511932-3.922653
TTTGTA-3.3208640.0207720.144126-3.539676-2.963171
TTTTCA5.3932700.0207950.1442064.9176855.494508
TTTTTT4.1101440.0253900.1593423.9352404.572607
\n", "

403 rows × 5 columns

\n", "
" ], "text/plain": [ " f f_var f_std ci_95_lower ci_95_upper\n", "AAAACG -1.661166 0.022802 0.151005 -2.026398 -1.422378\n", "AAAACT 1.739073 0.021753 0.147488 1.361176 1.951128\n", "AAAAGA 1.857192 0.021762 0.147520 1.439720 2.029800\n", "AAACGG -5.395939 0.020771 0.144121 -5.487868 -4.911382\n", "AAAGAT 1.554774 0.022872 0.151234 1.277205 1.882139\n", "... ... ... ... ... ...\n", "TTTGCC -8.340758 0.021756 0.147500 -8.462849 -7.872850\n", "TTTGCG -4.501158 0.021703 0.147320 -4.511932 -3.922653\n", "TTTGTA -3.320864 0.020772 0.144126 -3.539676 -2.963171\n", "TTTTCA 5.393270 0.020795 0.144206 4.917685 5.494508\n", "TTTTTT 4.110144 0.025390 0.159342 3.935240 4.572607\n", "\n", "[403 rows x 5 columns]" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pred = model.predict(X_test, calc_variance=True)\n", "pred['f'] = f[model.likelihood.idx[X_test]]\n", "pred" ] }, { "cell_type": "markdown", "id": "7f3de01f", "metadata": {}, "source": [ "We can now check that predictions are well calibrated, this is, that the true value lies withing the 95% probability predicted interval close to the expected 95% probability; and show the error bars in the scatterplot to visualize if uncertainty is uniformly distributed along the whole range of true phenotypic values." ] }, { "cell_type": "code", "execution_count": 10, "id": "f6fdaad7", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Text(0.03, 0.97, 'Calibration=92.06%')" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "perc = np.mean((f_test > pred['ci_95_lower']) & (f_test < pred['ci_95_upper'])) * 100\n", "fig, axes = plt.subplots(1, 1, figsize=(5, 5))\n", "axes.errorbar(\n", " x=f_test,\n", " y=pred[\"f\"],\n", " yerr=2 * pred[\"f_std\"],\n", " c=\"black\",\n", " markersize=3,\n", " fmt=\"o\",\n", " alpha=0.2,\n", ")\n", "axes.axline((0, 0), (1, 1), lw=0.5, c='grey', linestyle='--')\n", "axes.set(\n", " xlabel=r\"$y_{True}$\",\n", " ylabel=r\"$y_{pred}$\",\n", " aspect=1,\n", " xlim=(-15, 10),\n", " ylim=(-15, 10),\n", ")\n", "axes.text(0.03, 0.97, 'Calibration={:.2f}%'.format(perc), transform=axes.transAxes, va='top')" ] }, { "cell_type": "markdown", "id": "1367584e", "metadata": {}, "source": [ "### How to estimate mutational effects and epistatic coefficients under the prior\n", "\n", "Because the posterior distribution of the sequence function relationship is also a multivariate gaussian, \n", "\n", "$$\n", "f \\sim MvNormal(\\mu, \\Sigma)\n", "$$\n", "\n", "We can easily compute the posterior for any linear combination represented by $B$ of a multivariate normal distribution\n", "\n", "$$\n", "Bf \\sim MvNormal(B\\mu, B\\Sigma B^T)\n", "$$\n", "\n", "Without any prior distribution, we can assume that $\\Sigma=D_{\\sigma^2}$ and $\\mu=y$, and use the following function to compute the posterior distribution for specific linear combinations given by the contrast matrix $B$ \n" ] }, { "cell_type": "code", "execution_count": 11, "id": "6ffa31e3", "metadata": {}, "outputs": [], "source": [ "def make_contrasts(df, contrast_matrix):\n", " f = df['y']\n", " Sigma = np.diag(df['y_var'])\n", " B = contrast_matrix.T.values\n", " mu = B @ f\n", " std = np.sqrt(np.diag(B @ Sigma @ B.T))\n", " posterior = norm(mu, std)\n", " p = posterior.cdf(0.)\n", " p = np.max(np.vstack([p, 1-p]), axis=0)\n", " contrasts = pd.DataFrame({'estimate': mu, 'std': std, \n", " 'ci_95_lower': mu - 2 * std, \n", " 'ci_95_upper': mu + 2 * std, \n", " 'p(|x|>0)': p}, \n", " index=contrast_matrix.columns)\n", " return(contrasts)" ] }, { "cell_type": "markdown", "id": "36d4871b", "metadata": {}, "source": [ "Lets start by estimating mutational effects from`TTTTTT` to `TTTTTC`:" ] }, { "cell_type": "code", "execution_count": 12, "id": "4cd6a1cb", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
yy_varf
TTTTTA3.755850.043.650933
TTTTTC1.187770.041.162799
\n", "
" ], "text/plain": [ " y y_var f\n", "TTTTTA 3.75585 0.04 3.650933\n", "TTTTTC 1.18777 0.04 1.162799" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "seqs = ['TTTTTA', 'TTTTTC']\n", "df = data.loc[seqs, :]\n", "df" ] }, { "cell_type": "code", "execution_count": 13, "id": "888fe516", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
A6C
TTTTTA1
TTTTTC-1
\n", "
" ], "text/plain": [ " A6C\n", "TTTTTA 1\n", "TTTTTC -1" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "contrast_matrix = pd.DataFrame({'A6C': [1, -1]}, index=['TTTTTA', 'TTTTTC'])\n", "contrast_matrix" ] }, { "cell_type": "markdown", "id": "720804de", "metadata": {}, "source": [ "Lets start by computing the true mutational effect from the simulated genotype-phenotype map" ] }, { "cell_type": "code", "execution_count": 14, "id": "97e01c55", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "True mutational effect = 2.49\n" ] } ], "source": [ "true_effect = (contrast_matrix.T.values @ df['f'].values)[0]\n", "print('True mutational effect = {:.2f}'.format(true_effect))" ] }, { "cell_type": "markdown", "id": "99fea43b", "metadata": {}, "source": [ "and compare it with our naive posterior estimate." ] }, { "cell_type": "code", "execution_count": 15, "id": "1a345131", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Estimated mutational effect = 2.57 (95% CI = [2.00, 3.133766])\n" ] } ], "source": [ "contrasts = make_contrasts(df, contrast_matrix)\n", "mu = contrasts.loc['A6C', 'estimate']\n", "lower = contrasts.loc['A6C', 'ci_95_lower']\n", "upper = contrasts.loc['A6C', 'ci_95_upper']\n", "print('Estimated mutational effect = {:.2f} (95% CI = [{:.2f}, {:2f}])'.format(mu, lower, upper))" ] }, { "cell_type": "markdown", "id": "60d5b06e", "metadata": {}, "source": [ "We can see that the true effect is relatively close to the inferred one, and is within the 95% credible interval. However, the 95% credible interval is quite wide. Thus, can we do better by including taking into account our prior distribution?\n", "\n", "We can do the same calculations using the `make_contrast` method provided any user-defined `contrast_matrix`" ] }, { "cell_type": "code", "execution_count": 16, "id": "8d1c03a6", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 2/2 [00:00<00:00, 18.83it/s]" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Estimated mutational effect with GP prior = 2.37 (95% CI = [2.06, 2.672019])\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\n" ] } ], "source": [ "contrasts = model.make_contrasts(contrast_matrix=contrast_matrix)\n", "mu = contrasts.loc['A6C', 'estimate']\n", "lower = contrasts.loc['A6C', 'ci_95_lower']\n", "upper = contrasts.loc['A6C', 'ci_95_upper']\n", "print('Estimated mutational effect with GP prior = {:.2f} (95% CI = [{:.2f}, {:2f}])'.format(mu, lower, upper))" ] }, { "cell_type": "markdown", "id": "e99ad755", "metadata": {}, "source": [ "Thus, we can see how the estimate now is closer to the true simulated mutational effect and that the posterior distribution is tighter around it, illustrating that we have less uncertainty about its effect when taking into account the observed mutational effects across all genetic backgrounds appropriately.\n", "\n", "We can do these analyses not only for mutational effects, but also for epistatic coefficients of any order. Lets see how the previous mutational effect changes when we add a T0A mutation at the first position:" ] }, { "cell_type": "code", "execution_count": 17, "id": "52e541a8", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
yy_varf
TTTTTA3.7558500.043.650933
TTTTTC1.1877700.041.162799
ATTTTA2.5896060.042.611931
ATTTTC2.9044880.042.793064
\n", "
" ], "text/plain": [ " y y_var f\n", "TTTTTA 3.755850 0.04 3.650933\n", "TTTTTC 1.187770 0.04 1.162799\n", "ATTTTA 2.589606 0.04 2.611931\n", "ATTTTC 2.904488 0.04 2.793064" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "seqs = ['TTTTTA', 'TTTTTC', 'ATTTTA', 'ATTTTC']\n", "df = data.loc[seqs, :]\n", "df" ] }, { "cell_type": "markdown", "id": "08cb27cb", "metadata": {}, "source": [ "Lets do it again first without using our prior distribution" ] }, { "cell_type": "code", "execution_count": 18, "id": "d2b3789d", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
epistatic_coeff
TTTTTA1
TTTTTC-1
ATTTTA-1
ATTTTC1
\n", "
" ], "text/plain": [ " epistatic_coeff\n", "TTTTTA 1\n", "TTTTTC -1\n", "ATTTTA -1\n", "ATTTTC 1" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "contrast_matrix = pd.DataFrame({'epistatic_coeff': [1, -1, -1, 1]},\n", " index=seqs)\n", "contrast_matrix" ] }, { "cell_type": "code", "execution_count": 19, "id": "4d9ae388", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "True epistatic coefficient = 2.67\n" ] } ], "source": [ "true_effect = (contrast_matrix.T.values @ df['f'].values)[0]\n", "print('True epistatic coefficient = {:.2f}'.format(true_effect))" ] }, { "cell_type": "code", "execution_count": 20, "id": "e6a98f72", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Estimated epistatic coefficient = 2.88 (95% CI = [2.08, 3.682962])\n" ] } ], "source": [ "contrasts = make_contrasts(df, contrast_matrix)\n", "mu = contrasts.loc['epistatic_coeff', 'estimate']\n", "lower = contrasts.loc['epistatic_coeff', 'ci_95_lower']\n", "upper = contrasts.loc['epistatic_coeff', 'ci_95_upper']\n", "print('Estimated epistatic coefficient = {:.2f} (95% CI = [{:.2f}, {:2f}])'.format(mu, lower, upper))" ] }, { "cell_type": "code", "execution_count": 21, "id": "8c8e1555", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 2/2 [00:00<00:00, 14.18it/s]" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Estimated epistatic coefficient with GP prior = 2.46 (95% CI = [2.11, 2.806350])\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\n" ] } ], "source": [ "contrasts = model.make_contrasts(contrast_matrix=contrast_matrix)\n", "mu = contrasts.loc['epistatic_coeff', 'estimate']\n", "lower = contrasts.loc['epistatic_coeff', 'ci_95_lower']\n", "upper = contrasts.loc['epistatic_coeff', 'ci_95_upper']\n", "print('Estimated epistatic coefficient with GP prior = {:.2f} (95% CI = [{:.2f}, {:2f}])'.format(mu, lower, upper))" ] }, { "cell_type": "markdown", "id": "0d3fb04e", "metadata": {}, "source": [ "Again, we see how incorporation the prior knowledge about how well mutational effects generalize across genetic backgrounds provides a better estimate of the true epistatic coefficient and a tighter credible interval around it." ] }, { "cell_type": "markdown", "id": "97d9d6d9", "metadata": {}, "source": [ "## Inference from real data: protein GB1\n", "\n", "In the next section, we are going to infer the complete combinatorial landscape of the protein G domain B1 from experimental data [[Wu et. al (2016)](https://elifesciences.org/articles/16965)]. In this study, a library containing nearly all possible aminoacid combinations at positions 39, 40, 41 and 54 was selected for binding to the constant fraction of IgG using an mRNA display approach. Thus, by sequencing the mRNA library before and after selection, we can obtain estimates of how strongly each sequence in the library binds its target. \n", "\n", "### Data preprocessing\n", "\n", "We take the number of times a sequence is observed in the input and selected samples as raw data for our purposes as provided by the authors [here](https://elifesciences.org/articles/16965/figures#SD1-data)." ] }, { "cell_type": "code", "execution_count": 22, "id": "0626c440", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
inputselected
sequence
VDGV92735338346
ADGV3443
CDGV850641
DDGV6363
EDGV841190
.........
YYYR2031
YYYS1863
YYYT18114
YYYW301
YYYY572
\n", "

149361 rows × 2 columns

\n", "
" ], "text/plain": [ " input selected\n", "sequence \n", "VDGV 92735 338346\n", "ADGV 34 43\n", "CDGV 850 641\n", "DDGV 63 63\n", "EDGV 841 190\n", "... ... ...\n", "YYYR 203 1\n", "YYYS 186 3\n", "YYYT 181 14\n", "YYYW 30 1\n", "YYYY 57 2\n", "\n", "[149361 rows x 2 columns]" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "gb1 = DataSet('gb1')\n", "counts = gb1.raw_data\n", "counts" ] }, { "cell_type": "markdown", "id": "0388a572", "metadata": {}, "source": [ "We first filter sequences that are poorly represented in the input library (<20 sequencing counts)." ] }, { "cell_type": "code", "execution_count": 23, "id": "413e0901", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
inputselected
sequence
VDGV92735338346
ADGV3443
CDGV850641
DDGV6363
EDGV841190
.........
YYYR2031
YYYS1863
YYYT18114
YYYW301
YYYY572
\n", "

142820 rows × 2 columns

\n", "
" ], "text/plain": [ " input selected\n", "sequence \n", "VDGV 92735 338346\n", "ADGV 34 43\n", "CDGV 850 641\n", "DDGV 63 63\n", "EDGV 841 190\n", "... ... ...\n", "YYYR 203 1\n", "YYYS 186 3\n", "YYYT 181 14\n", "YYYW 30 1\n", "YYYY 57 2\n", "\n", "[142820 rows x 2 columns]" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "counts = counts.loc[counts['input'] >= 20, :]\n", "counts" ] }, { "cell_type": "markdown", "id": "c562d852", "metadata": {}, "source": [ "And use [Enrich2](https://genomebiology.biomedcentral.com/articles/10.1186/s13059-017-1272-5) approach to derive the enrichment score and the associated error. \n", "\n", "$$y_i = log\\left(\\frac{ c_{i,sel} + 0.5}{c_{wt,sel} + 0.5} \\right) - log\\left(\\frac{ c_{i,inp} + 0.5}{c_{wt,inp} + 0.5} \\right)$$\n", "\n", "\n", "$$y_{var,i} = \\frac{1}{c_{i,inp} + 0.5} + \\frac{1}{c_{wt,inp} + 0.5} + \\frac{1}{c_{i,sel} + 0.5} +\\frac{1}{c_{wt,sel} + 0.5}$$\n" ] }, { "cell_type": "code", "execution_count": 24, "id": "3de864df", "metadata": {}, "outputs": [], "source": [ "wt = 'VDGV'\n", "c_wt_input, c_wt_sel = counts.loc[wt]\n", "X = counts.index.values\n", "y = (np.log((counts['selected'] + 0.5)/(c_wt_sel + 0.5)) - np.log((counts['input'] + 0.5)/(c_wt_input + 0.5))).values\n", "y_var = (1/(counts['input'] + 0.5) + 1/(counts['selected'] + 0.5) + 1/(c_wt_sel + 0.5) + 1/(c_wt_input + 0.5)).values\n", "data = pd.DataFrame({'y': y, 'y_var': y_var}, index=X)" ] }, { "cell_type": "markdown", "id": "b8e24eba", "metadata": {}, "source": [ "To be able to evaluate model performance, we first split the data into training and test sets keeping approximately 90% of the data for training and 10% for testing" ] }, { "cell_type": "code", "execution_count": 25, "id": "7a256fc9", "metadata": {}, "outputs": [], "source": [ "u = np.random.uniform(size=y.shape[0]) < 0.9\n", "X_train, y_train, y_var_train = X[u], y[u], y_var[u]\n", "X_test, y_test = X[~u], y[~u]" ] }, { "cell_type": "markdown", "id": "0b7777dc", "metadata": {}, "source": [ "### Computing the minumum epistasis interpolation solution" ] }, { "cell_type": "code", "execution_count": 26, "id": "a6ce6299", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
f
AAAA0.460831
AAAC-2.478059
AAAD-3.579738
AAAE-4.836451
AAAF-3.947928
......
YYYS-5.269987
YYYT-3.821426
YYYV-3.143536
YYYW-4.306581
YYYY-4.429813
\n", "

160000 rows × 1 columns

\n", "
" ], "text/plain": [ " f\n", "AAAA 0.460831\n", "AAAC -2.478059\n", "AAAD -3.579738\n", "AAAE -4.836451\n", "AAAF -3.947928\n", "... ...\n", "YYYS -5.269987\n", "YYYT -3.821426\n", "YYYV -3.143536\n", "YYYW -4.306581\n", "YYYY -4.429813\n", "\n", "[160000 rows x 1 columns]" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "model = MinimumEpistasisInterpolator(P=2, seq_length=4, alphabet_type='protein')\n", "model.set_data(X_train, y_train)\n", "mei = model.predict()\n", "mei" ] }, { "cell_type": "code", "execution_count": 27, "id": "b5727d24", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Text(0.05, 0.95, '$R^2$=0.833')" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "lim = (-9, 3)\n", "r2 = pearsonr(mei.loc[X_test, 'f'], y_test)[0] ** 2\n", "bins = np.linspace(lim[0] + 0.5, lim[1] - 0.5, 100)\n", "\n", "fig, axes = plt.subplots(1, 1, figsize=(4, 4))\n", "axes.hist2d(x=mei.loc[X_test, 'f'], y=y_test, cmap=\"binary\", bins=bins)\n", "axes.axline((0, 0), (1, 1), lw=0.5, linestyle=\"--\", c=\"grey\")\n", "axes.set(\n", " xlabel=r\"$y_{pred}$\",\n", " ylabel=r\"$y_{obs}$\",\n", " xlim=(lim[0] + 0.5, lim[1] - 0.5),\n", " ylim=(lim[0] + 0.5, lim[1] - 0.5),\n", ")\n", "axes.text(\n", " 0.05,\n", " 0.95,\n", " r\"$R^2$=\" + \"{:.3f}\".format(r2),\n", " transform=axes.transAxes,\n", " color=\"black\",\n", " ha=\"left\",\n", " va=\"top\",\n", ")\n", "\n" ] }, { "cell_type": "markdown", "id": "fc49dc28", "metadata": {}, "source": [ "### Estimating Variance Components" ] }, { "cell_type": "code", "execution_count": 28, "id": "5de115a7", "metadata": {}, "outputs": [], "source": [ "model = VCregression(seq_length=4, alphabet_type='protein')\n", "model.fit(X=X_train, y=y_train, y_var=y_var_train)" ] }, { "cell_type": "code", "execution_count": 29, "id": "7e901ebc", "metadata": {}, "outputs": [], "source": [ "lambdas = model.lambdas\n", "x = np.arange(0, lambdas.shape[0])\n", "variance = model.lambdas_to_variance(lambdas)\n", "p_variance = variance / variance.sum() * 100" ] }, { "cell_type": "code", "execution_count": 30, "id": "f2037d9b", "metadata": {}, "outputs": [ { "data": { "image/png": "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1RWyU6dO1euvv250DAAAADRRqytkR44cqU6dOhkdAwDccvToUa1du1bvvPOO/vOf/xgdBwC8gk8Vsvn5+crIyFBUVJRMJpPWrFnTYB+r1arY2FiFhIQoNTVVW7dubfmgAOBBf//739W3b1/NnTtXc+bM0WWXXabXXnvN6FgAYDifKmTtdrvi4+Mv+ESbVatWKTs7W3PmzNH27dsVHx+v9PR0VVRUtHBSAGi8qqqqeq/nzp2rrVu3auvWrdqxY4feeust/c///I9B6QDAe/hUITt69GjNmzdPY8eOPe/7zzzzjCZOnKisrCzFxcVp8eLFat++vV599dVGna+6ulqVlZX1NgBobomJiXr77bedr9u0aVPvH+Tl5eUKCgoyIhoAeBWfKmQvpqamRkVFRTKbzc62gIAAmc1mFRQUNOqYubm5CgsLc27R0dGeigsAF/TBBx/o5Zdf1tixY3X48GE999xzuu222xQZGalu3bpp5syZeuGFF4yOCQCG85tC9ujRo6qtrVVERES99oiICJWVlTlfm81m3XrrrXrvvffUq1evixa5OTk5stlsevrpp9W/f3/17du32fIDwDmxsbFau3atfvOb32jEiBEqLi7WgQMHtH79en300Uc6ePCgbrjhBqNjAoDh/KaQddVHH32kI0eO6OTJkzp06JDS0tIuuG9wcLBCQ0M1Y8YM7d27V0VFRS2YFEBrd/vtt6uwsFA7d+7UyJEjVVdXp4SEBIWEhBgdDQC8QhujA3hKt27dFBgYqPLy8nrt5eXlioyMbNKxrVarrFaramtrm3QcAHDVe++9pz179ig+Pl6vvPKKNm3apAkTJmj06NF69NFH1a5dO6MjAoDh/OaKbFBQkBITE5WXl+dsq6urU15e3kWvurrCYrFo9+7dKiwsbGpMAPhZM2bMUFZWlgoLC3Xffffpscce04gRI7R9+3aFhIRoyJAhev/9942OCQCG86lCtqqqSsXFxSouLpYklZSUqLi4WAcPHpQkZWdna8mSJVq2bJn27NmjSZMmyW63Kysrq0nntVqtiouLU3JyclO7AAA/a+nSpXrvvfe0cuVKFRYW6o033pB09h/sjz32mP7xj39o/vz5BqcEAOP51NSCbdu2adSoUc7X2dnZkqTMzEwtXbpUt912m44cOaLZs2errKxMCQkJWrduXYMbwNxlsVhksVhUWVmp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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig, subplots = init_fig(1, 2, colsize=3.5, rowsize=3.5)\n", "\n", "axes = subplots[0]\n", "axes.bar(x=x, height=lambdas, color='black')\n", "axes.set(xlabel='$k$', ylabel='$\\lambda_k$', yscale='log')\n", "\n", "axes = subplots[1]\n", "axes.bar(x=x[1:], height=p_variance, color='black')\n", "axes.set(xlabel='$k$', ylabel='% variance explained', ylim=(0, 100), xticks=[1, 2, 3])\n", "\n", "fig.tight_layout()" ] }, { "cell_type": "markdown", "id": "281407df", "metadata": {}, "source": [ "### Inferring the complete GB1 landscape\n", "\n", "Now that we have inferred the variance components, we obtain inferences for the complete combinatorial landscape and check the prediction accuracy for the held-out test data. Moreover, we can also see the distribution of phenotypic values within and outside the data" ] }, { "cell_type": "code", "execution_count": 31, "id": "d74cd75d", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
fyy_var
AAAA0.6328880.4608310.046009
AAAC-2.361377NaNNaN
AAAD-3.231004NaNNaN
AAAE-4.600692NaNNaN
AAAF-3.443787NaNNaN
............
YYYS-4.954946-5.2699870.291090
YYYT-3.854892-3.8214260.074489
YYYV-3.438228-3.1435360.074682
YYYW-4.949506-4.3065810.699467
YYYY-5.092643-4.4298130.417405
\n", "

160000 rows × 3 columns

\n", "
" ], "text/plain": [ " f y y_var\n", "AAAA 0.632888 0.460831 0.046009\n", "AAAC -2.361377 NaN NaN\n", "AAAD -3.231004 NaN NaN\n", "AAAE -4.600692 NaN NaN\n", "AAAF -3.443787 NaN NaN\n", "... ... ... ...\n", "YYYS -4.954946 -5.269987 0.291090\n", "YYYT -3.854892 -3.821426 0.074489\n", "YYYV -3.438228 -3.143536 0.074682\n", "YYYW -4.949506 -4.306581 0.699467\n", "YYYY -5.092643 -4.429813 0.417405\n", "\n", "[160000 rows x 3 columns]" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pred = model.predict().join(data)\n", "pred" ] }, { "cell_type": "code", "execution_count": 32, "id": "06a1ec7f", "metadata": {}, "outputs": [ { "data": { "image/png": "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Tz8pHZLJyf0brl27VunQqJms9b5iC/cQa7lXWNN9wdq+/y3lu55zLIiIiIiIqNUsq3COiIiIiIjMEhMLIiIiIiJqNSYWRERERETUakwsiIiIiIio1ZhYEBERERFRqzGxICIiIiKiVmNiQURERERErcbEgoiIiIiIWo2JBRERERERtRoTCyIT6NKlCz744AOdbQcPHoSbmxt+/fVXhaIiIiKl8f5AtoSJBZEJxMXF4fDhw+JrQRDwwgsv4M9//jO6deumYGRERKQk3h/IljCxIDKBIUOG6Nw4vvzyS1y5cgULFixok89LSEjAuXPn2uTcRERkOrw/kC1hYkFkAkOGDEFubi4qKipQWVmJv/3tb3jzzTfh7u5u9Dk0Go3R+547dw5hYWEtCZWIiNoR7w9kSxyUDoDIGsTExMDOzg45OTnYvXs3OnXqhKSkJPH9KVOmwNnZGRcuXEBJSQnS0tIwaNAg/O53v0OXLl1w+PBhPPXUUxg1ahReeOEFFBYWokOHDtiwYQP8/f1x6tQp/L//9/9QXV2NadOmITAwEHZ2/LsAEZG54/2BbAn/yyMyATc3N/Tr1w8bN27Eu+++i/fee0/ni/348eMYOHAgDh8+jNdffx3Lli0DAJw4cQLh4eE4fPgwnnjiCTz77LP46KOPkJ2djccffxwff/wx1Go1pk2bhk8//RTHjx/H4cOH0b9/f6UulYiImoH3B7IlTCyITGTIkCFYuXIlEhMTMXr0aHF7RUUFampqMG/ePABAnz59cPv2bdy5cwcajQZz584FAGzevBmnTp3CxIkTER0djX/84x9wdHTE5s2bMWrUKPTr1088njcOIiLLwfsD2QqWQhGZSFRUFBwdHbF06VKd7SdOnMA999wDe3t7AEBOTg769euHU6dOYdiwYTr7LVu2DI899pjO8a+88gqio6PF19nZ2Rg3blzbXQgREZkU7w9kKzhiQWQi69evR3JyMnr27Kmz/fjx4/j1119RV1eHW7duYeXKlXj66adx4sQJ8a9MABAYGIgdO3boHAcAvr6+OHnyJABg586d2L17N/8iRURkQXh/IFvBxIKoFbRaLYqKirB48WKcO3cOixYtarTP8ePHMWHCBMTExGD06NFYsmQJwsLCGt04kpKSUFpaioiICERFReFf//oXAOAPf/gD9u/fjwEDBuDLL79Et27d4OPj027XSEREzcf7A9kilSAIgtJBEFmqzMxM3HvvvYiIiMDatWsRFxfXaJ/4+Hh8/fXXCAkJUSBCIiJSAu8PZIuYWBC1sR49euDixYtKh0FERGaG9weyNkwsiIiIiIio1TjHgoiIiIiIWo2JBRERERERtRoTCyIiIiIiajUmFkRERERE1GpMLIiIiIiIqNWYWBARERERUasxsSAiIiIiolZjYkFERERERK3GxIKIiIiIiFqNiQUREREREbUaEwsiIiIiImo1JhZERERERNRq/x9k/BYeV5w0iwAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "test = pred.loc[X_test, :]\n", "r2 = pearsonr(test['f'], test['y'])[0] ** 2\n", "lim = (-9, 3)\n", "bins = np.linspace(lim[0] + 0.5, lim[1] - 0.5, 100)\n", "\n", "fig, subplots = plt.subplots(1, 2, figsize=(8, 4))\n", "\n", "axes = subplots[0]\n", "axes.hist2d(x=test['f'], y=test['y'], cmap='binary', bins=bins)\n", "axes.axline((0, 0), (1, 1), lw=0.5, linestyle='--', c='grey')\n", "axes.set(xlabel=r'$y_{pred}$', ylabel=r'$y_{obs}$',\n", " xlim=(lim[0] + 0.5, lim[1] - 0.5),\n", " ylim=(lim[0] + 0.5, lim[1] - 0.5))\n", "axes.text(0.05, 0.95, r'$R^2$=' + '{:.3f}'.format(r2),\n", " transform=axes.transAxes, color='black', ha='left', va='top')\n", "\n", "axes = subplots[1]\n", "axes.hist(pred.dropna()['f'], label='Observed', alpha=0.3, density=True, bins=bins, color='black')\n", "axes.hist(pred.loc[np.isnan(pred['y']), 'f'], label='New', alpha=0.3, density=True, bins=bins, color='grey')\n", "axes.set(xlabel=r'$y_{pred}$', ylabel='% of sequences')\n", "axes.legend(loc=0)\n", "\n", "fig.tight_layout()" ] }, { "cell_type": "markdown", "id": "7010e01d", "metadata": {}, "source": [ "### Estimating local epistatic coefficients under the prior\n", "\n", "As previously shown, we are not only restricted to making calibrated predictions for previously uncharacterized or held out sequences, but we can also get calibrated estimates for linear combinations of them and use them to answer questions about specific mutational effects and how they change as we introduced more mutations.\n", "\n", "One of the main interactions in the GB1 dataset is that taking place between positions 41 and 54. In the wild-type sequence VDGV, G41L is highly deleterious, but becomes advantageous in the presence of V54G. Now, we can use our model to compute the posterior distribution for this epistatic coefficient given the whole dataset. \n", "\n", "We can select the 4 relevant sequences and show their measurement values" ] }, { "cell_type": "code", "execution_count": 33, "id": "9a36fe70", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
yy_var
VDGV0.0000000.000027
VDGG0.3341530.003038
VDLV-3.5124870.105615
VDLG1.1403570.013197
\n", "
" ], "text/plain": [ " y y_var\n", "VDGV 0.000000 0.000027\n", "VDGG 0.334153 0.003038\n", "VDLV -3.512487 0.105615\n", "VDLG 1.140357 0.013197" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "seqs = ['VDGV', 'VDGG', 'VDLV', 'VDLG']\n", "df = data.loc[seqs, :]\n", "df" ] }, { "cell_type": "markdown", "id": "4b58446b", "metadata": {}, "source": [ "We then define the contrast matrices for the coefficients of interest: the single point mutational effects as well as the epistatic coefficient between them." ] }, { "cell_type": "code", "execution_count": 34, "id": "7e2f77c2", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 3/3 [01:08<00:00, 23.00s/it]\n" ] }, { "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", "
estimatestdci_95_lowerci_95_upperp(|x|>0)
G41L-3.4974720.276578-4.050627-2.9443171.000000
V54G-1.0941770.515773-2.125724-0.0626300.983057
G41L:V54G5.7394080.5932064.5529966.9258201.000000
\n", "
" ], "text/plain": [ " estimate std ci_95_lower ci_95_upper p(|x|>0)\n", "G41L -3.497472 0.276578 -4.050627 -2.944317 1.000000\n", "V54G -1.094177 0.515773 -2.125724 -0.062630 0.983057\n", "G41L:V54G 5.739408 0.593206 4.552996 6.925820 1.000000" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "contrast_matrix = pd.DataFrame({'G41L' : [-1, 0, 1, 0],\n", " 'V54G' : [-1, 1, 0, 0],\n", " 'G41L:V54G': [ 1, -1, -1, 1]},\n", " index=seqs)\n", "contrast = model.make_contrasts(contrast_matrix)\n", "contrast" ] }, { "cell_type": "markdown", "id": "93f38a16", "metadata": {}, "source": [ "We can see that there is strong support in the posterior for the deleterious effect of G41L in the wild-type background, but also that this is strongly reversed in the presence of V54G. Lets now compare these estimates with the naive comparisons using the estimated measurement errors alone" ] }, { "cell_type": "code", "execution_count": 35, "id": "69545135", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
estimatestdci_95_lowerci_95_upperp(|x|>0)
G41L-3.5124870.325026-4.162539-2.8624351.0
V54G0.3341530.0553700.2234130.4448921.0
G41L:V54G4.3186910.3491093.6204725.0169101.0
\n", "
" ], "text/plain": [ " estimate std ci_95_lower ci_95_upper p(|x|>0)\n", "G41L -3.512487 0.325026 -4.162539 -2.862435 1.0\n", "V54G 0.334153 0.055370 0.223413 0.444892 1.0\n", "G41L:V54G 4.318691 0.349109 3.620472 5.016910 1.0" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "make_contrasts(df, contrast_matrix)" ] }, { "cell_type": "markdown", "id": "cfa8b3bf", "metadata": {}, "source": [ "We can see how estimates are then shrunk towards 0 and uncertaintly is slightly reduced by using the prior that was estimated across the complete dataset" ] }, { "cell_type": "markdown", "id": "2d87e2c7", "metadata": {}, "source": [ "## Inference from real data: the Shine-Dalgarno sequence\n", "\n", "In this section, we will show how to use `MinimumEpistasisInterpolator` and `VCregression` to infer and analyze the genotype-phenotype map of the Shine-Dalgarno (SD) sequence. We use data from a high-throuhgput experimental Sort-Seq assay in which translational efficiency of a library of about 250,000 9-nucleotide sequences was measured [(Kuo et al. 2020)](https://genome.cshlp.org/content/30/5/711) as in our original gpmap-tools paper [(Martí-Gómez et al. 2025)](https://www.biorxiv.org/content/10.1101/2025.03.09.642267v3). For full reproducibility of the analysis of the Shine-Dalgarno landscape, including processing of the raw data, see the associated [repository](https://github.com/cmarti/shine_dalgarno). \n", "\n", "### Loading high-throughput measurements\n", "\n", "Here, for simplicity, we use the built-in dataset provided by `gpmap-tools` for the Shine-Dalgarno sequence as over 250,000 measured 9-nucleotide sequences with the associated noise estimates from the replicate experiments. " ] }, { "cell_type": "code", "execution_count": null, "id": "7517ec25", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
yy_var
Genotype
AAAAAAAAA0.5630000.017082
AAAAAAAAC0.6640000.017082
AAAAAAAAG0.6430000.017082
AAAAAAAAU0.6543330.017082
AAAAAAACA0.5946670.017082
.........
UUUUUUUGU0.7056670.017082
UUUUUUUUA0.5906670.017082
UUUUUUUUC0.5513330.017082
UUUUUUUUG0.5236670.017082
UUUUUUUUU0.5383330.017082
\n", "

257565 rows × 2 columns

\n", "
" ], "text/plain": [ " y y_var\n", "Genotype \n", "AAAAAAAAA 0.563000 0.017082\n", "AAAAAAAAC 0.664000 0.017082\n", "AAAAAAAAG 0.643000 0.017082\n", "AAAAAAAAU 0.654333 0.017082\n", "AAAAAAACA 0.594667 0.017082\n", "... ... ...\n", "UUUUUUUGU 0.705667 0.017082\n", "UUUUUUUUA 0.590667 0.017082\n", "UUUUUUUUC 0.551333 0.017082\n", "UUUUUUUUG 0.523667 0.017082\n", "UUUUUUUUU 0.538333 0.017082\n", "\n", "[257565 rows x 2 columns]" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "dmsc = DataSet('dmsc')\n", "dmsc.data" ] }, { "cell_type": "markdown", "id": "db68d8c2", "metadata": {}, "source": [ "First, we split the dataset into training and test sets to evaluate the performance of the different models" ] }, { "cell_type": "code", "execution_count": null, "id": "cb85f643", "metadata": {}, "outputs": [], "source": [ "np.random.seed(0)\n", "u = np.random.uniform(size=dmsc.data.shape[0])\n", "train = dmsc.data.loc[u < 0.999, :]\n", "test = dmsc.data.loc[u > 0.999, :]\n", "X_train, y_train, y_var_train = train.index.values, train.y.values, train.y_var.values\n", "X_test, y_test = test.index.values, test.y.values" ] }, { "cell_type": "markdown", "id": "ee7e8551", "metadata": {}, "source": [ "### Minimum epistasis interpolation\n", "\n", "Now we fit a model using the training data and make predictions for the complete sequence-space" ] }, { "cell_type": "code", "execution_count": null, "id": "6918cd73", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
f
AAAAAAAAA0.563000
AAAAAAAAC0.664000
AAAAAAAAG0.643000
AAAAAAAAU0.654333
AAAAAAACA0.594667
......
UUUUUUUGU0.705667
UUUUUUUUA0.590667
UUUUUUUUC0.551333
UUUUUUUUG0.523667
UUUUUUUUU0.538333
\n", "

262144 rows × 1 columns

\n", "
" ], "text/plain": [ " f\n", "AAAAAAAAA 0.563000\n", "AAAAAAAAC 0.664000\n", "AAAAAAAAG 0.643000\n", "AAAAAAAAU 0.654333\n", "AAAAAAACA 0.594667\n", "... ...\n", "UUUUUUUGU 0.705667\n", "UUUUUUUUA 0.590667\n", "UUUUUUUUC 0.551333\n", "UUUUUUUUG 0.523667\n", "UUUUUUUUU 0.538333\n", "\n", "[262144 rows x 1 columns]" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "model = MinimumEpistasisInterpolator(P=2, seq_length=9, alphabet_type='rna')\n", "model.fit(X_train, y_train)\n", "mei = model.predict()\n", "mei" ] }, { "cell_type": "markdown", "id": "4b8741e0", "metadata": {}, "source": [ "We can now also compute the predictive uncertainty under the model with the minimum amount of epistasis for a few sequences of interest. Lets try with the test sequences" ] }, { "cell_type": "code", "execution_count": null, "id": "326c8b54", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 274/274 [00:20<00:00, 13.41it/s]\n" ] } ], "source": [ "pred = model.predict(X_pred=X_test, calc_variance=True)" ] }, { "cell_type": "markdown", "id": "5ba41d17", "metadata": {}, "source": [ "Lets now see how similar the predictions are to the measurements in these held-out sequences" ] }, { "cell_type": "code", "execution_count": null, "id": "f7c552ff", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Text(0.05, 0.95, '$R^2$=0.86\\nn=274')" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "test_mei = test.join(pred, rsuffix=\"_pred\")\n", "\n", "fig, axes = plt.subplots(1, 1, figsize=(4, 4))\n", "x, xerr = test_mei[\"f\"], 2 * test_mei[\"f_std\"]\n", "y, yerr = test_mei[\"y\"], 2 * np.sqrt(test_mei[\"y_var\"])\n", "lims = (-0.5, 3.25)\n", "r2 = pearsonr(y, x)[0] ** 2\n", "axes.errorbar(\n", " x,\n", " y,\n", " xerr=xerr,\n", " yerr=yerr,\n", " color=\"black\",\n", " fmt=\"o\",\n", " alpha=0.2,\n", " markeredgewidth=0,\n", " markersize=2.5,\n", " lw=0.5,\n", ")\n", "axes.set(\n", " xlim=lims,\n", " ylim=lims,\n", " xticks=np.arange(4),\n", " xlabel=\"Predicted log(GFP)\",\n", " ylabel=\"Measured log(GFP)\",\n", ")\n", "axes.axline((0, 0), (1, 1), lw=0.5, c=\"grey\", linestyle=\"--\")\n", "axes.text(\n", " 0.05,\n", " 0.95,\n", " \"$R^2$\" + \"={:.2f}\\nn={}\".format(r2, test_mei.shape[0]),\n", " transform=axes.transAxes,\n", " va=\"top\",\n", " ha=\"left\",\n", ")" ] }, { "cell_type": "markdown", "id": "6ae0911e", "metadata": {}, "source": [ "### Estimating Variance Components\n", "\n", "We next use `VCregression` to better understand the complexity of genetic interactions and achieve more accurate and calibrated phenotypic predictions.\n", "We first estimate the variance components of a prior under which the expected distance-covariance function matches as best as possible the observed one in the empirical data. " ] }, { "cell_type": "code", "execution_count": null, "id": "ec61f27e", "metadata": {}, "outputs": [], "source": [ "model = VCregression(seq_length=4, alphabet_type='protein')\n", "model.fit(X=X_train, y=y_train, y_var=y_var_train)" ] }, { "cell_type": "markdown", "id": "1bb6389d", "metadata": {}, "source": [ "We can easily extract the inferred variance components" ] }, { "cell_type": "code", "execution_count": null, "id": "62aa4999", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
klambdasvar_percvar_perc_cum
0098904.0423810.0000000.000000
11373.77752634.79709334.797093
2220.42049822.81273557.609829
332.52775019.76710877.376937
440.28737510.11277387.489710
550.0501275.29192992.781639
660.0163963.46180196.243440
770.0085502.32117298.564612
880.0056021.14065299.705264
990.0043430.294736100.000000
\n", "
" ], "text/plain": [ " k lambdas var_perc var_perc_cum\n", "0 0 98904.042381 0.000000 0.000000\n", "1 1 373.777526 34.797093 34.797093\n", "2 2 20.420498 22.812735 57.609829\n", "3 3 2.527750 19.767108 77.376937\n", "4 4 0.287375 10.112773 87.489710\n", "5 5 0.050127 5.291929 92.781639\n", "6 6 0.016396 3.461801 96.243440\n", "7 7 0.008550 2.321172 98.564612\n", "8 8 0.005602 1.140652 99.705264\n", "9 9 0.004343 0.294736 100.000000" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "prior_vc = model.get_variance_components()\n", "prior_vc" ] }, { "cell_type": "code", "execution_count": null, "id": "2e0792bc", "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig, subplots = plt.subplots(1, 2, figsize=(6.5, 3))\n", "\n", "axes = subplots[0]\n", "axes.scatter(prior_vc[\"k\"], prior_vc[\"lambdas\"], color=\"black\")\n", "axes.plot(prior_vc[\"k\"], prior_vc[\"lambdas\"], color=\"black\")\n", "axes.set(xlabel=\"$k$\", ylabel=\"$\\lambda_k$\", yscale=\"log\", xticks=prior_vc['k'])\n", "\n", "# Plot percentage variance explained\n", "vcs = prior_vc.loc[prior_vc['k'] > 0, :]\n", "axes = subplots[1]\n", "axes.bar(x=vcs[\"k\"], height=vcs[\"var_perc\"], color=\"black\")\n", "axes.set(\n", " xlabel=\"Interaction order $k$\",\n", " ylabel=\"% variance explained\",\n", " xticks=np.arange(1, 10),\n", " ylim=(0, 50),\n", ")\n", "\n", "# Plot cumulative percentage variance explained\n", "axes = axes.twinx()\n", "axes.scatter(vcs[\"k\"], vcs[\"var_perc_cum\"], color=\"grey\", s=25)\n", "axes.plot(vcs[\"k\"], vcs[\"var_perc_cum\"], color=\"grey\", lw=2)\n", "axes.tick_params(axis=\"y\", colors=\"grey\")\n", "axes.spines[\"right\"].set_color(\"grey\")\n", "axes.set(ylim=(0, 105))\n", "axes.set_ylabel(\"% cumulative variance\", color=\"grey\")\n", "fig.tight_layout()" ] }, { "cell_type": "markdown", "id": "a489cafd", "metadata": {}, "source": [ "We can see that the inferred $\\lambda_k$ monotonically decrease with the interaction order $k$, and that the decay is slower than exponential. Moreover, the second plot showing the total variance explained by interactions of every possible order $k$ and cumulative variance explained by interactions up to order $k$ suggests a large contribution of higher order epistatic interactions ($k>2$) to the genotype-phenotype map of the SD sequence.\n", "\n", "### Inference with VCregression\n", "\n", "We next infer the complete combinatorial landscape under the inferred variance component prior distribution using `VCregression`" ] }, { "cell_type": "code", "execution_count": null, "id": "f7c87017", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
f
AAAAAAAAA0.563857
AAAAAAAAC0.701509
AAAAAAAAG0.619187
AAAAAAAAU0.628770
AAAAAAACA0.594684
......
UUUUUUUGU0.615908
UUUUUUUUA0.539057
UUUUUUUUC0.548780
UUUUUUUUG0.536609
UUUUUUUUU0.564958
\n", "

262144 rows × 1 columns

\n", "
" ], "text/plain": [ " f\n", "AAAAAAAAA 0.563857\n", "AAAAAAAAC 0.701509\n", "AAAAAAAAG 0.619187\n", "AAAAAAAAU 0.628770\n", "AAAAAAACA 0.594684\n", "... ...\n", "UUUUUUUGU 0.615908\n", "UUUUUUUUA 0.539057\n", "UUUUUUUUC 0.548780\n", "UUUUUUUUG 0.536609\n", "UUUUUUUUU 0.564958\n", "\n", "[262144 rows x 1 columns]" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "pred = model.predict()\n", "pred" ] }, { "cell_type": "markdown", "id": "79ea12d3", "metadata": {}, "source": [ "and compute the posterior distribution for the same test sequences as before" ] }, { "cell_type": "code", "execution_count": null, "id": "5dbac094", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 274/274 [35:43<00:00, 7.82s/it]\n" ] } ], "source": [ "pred = model.predict(X_pred=X_test, calc_variance=True)" ] }, { "cell_type": "code", "execution_count": null, "id": "43b026b4", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Text(0.05, 0.95, '$R^2$=0.87\\nn=274')" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "test_vc = test.join(pred, rsuffix=\"_pred\")\n", "\n", "fig, axes = plt.subplots(1, 1, figsize=(4, 4))\n", "x, xerr = test_vc[\"f\"], 2 * test_vc[\"f_std\"]\n", "y, yerr = test_vc[\"y\"], 2 * np.sqrt(test_vc[\"y_var\"])\n", "lims = (-0.5, 3.25)\n", "r2 = pearsonr(y, x)[0] ** 2\n", "axes.errorbar(\n", " x,\n", " y,\n", " xerr=xerr,\n", " yerr=yerr,\n", " color=\"black\",\n", " fmt=\"o\",\n", " alpha=0.2,\n", " markeredgewidth=0,\n", " markersize=2.5,\n", " lw=0.5,\n", ")\n", "axes.set(\n", " xlim=lims,\n", " ylim=lims,\n", " xticks=np.arange(4),\n", " xlabel=\"Predicted log(GFP)\",\n", " ylabel=\"Measured log(GFP)\",\n", ")\n", "axes.axline((0, 0), (1, 1), lw=0.5, c=\"grey\", linestyle=\"--\")\n", "axes.text(\n", " 0.05,\n", " 0.95,\n", " \"$R^2$\" + \"={:.2f}\\nn={}\".format(r2, test_vc.shape[0]),\n", " transform=axes.transAxes,\n", " va=\"top\",\n", " ha=\"left\",\n", ")\n" ] }, { "cell_type": "markdown", "id": "b6642bb4", "metadata": {}, "source": [ "fitting `VCregression` is substantially slower because of the higher expressivity of the prior distribution. In this particular case, we have measurements over a large fraction of all possible sequences, the performance of both `VCregression` and `MinimumEpistasisInterpolator` are very similar when evaluated on the same test set.\n", "\n", "### Estimating context-dependent mutational effects\n", "\n", "In addition to computing the posterior distribution for a specific subset of sequences, `gpmap-tools` also enables the computation of the posterior distribution of any possible linear combination of phenotypes. This can be used, for instance, to compute the posterior distribution for the effects of a series of mutations in different genetic backgrounds. In this case, we wanted to test the effects of mutations in two genetic backgrounds `'UUAAGGAGC'` and `'UAAGGAGCA'`, characterized by having an AGGAG motif at adjacent positions in the sequence. \n", "\n", "To do this, as in any linear model, we need to define a contrast matrix, with a series of sequences on the rows and the specified contrasts on the columns. " ] }, { "cell_type": "code", "execution_count": null, "id": "2c2496f0", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
U-12A_in_UUAAGGAGCU-12A_in_UAAGGAGCAA-10G_in_UUAAGGAGCA-10G_in_UAAGGAGCAG-8A_in_UUAAGGAGCG-8A_in_UAAGGAGCAA-7G_in_UUAAGGAGCA-7G_in_UAAGGAGCAG-6C_in_UUAAGGAGCG-6C_in_UAAGGAGCAC-5A_in_UUAAGGAGCC-5A_in_UAAGGAGCA
UUAAGGAGC-1.00.0-1.00.0-1.00.0-1.00.0-1.00.0-1.00.0
UAAAGGAGC1.00.00.00.00.00.00.00.00.00.00.00.0
UUAGGAGCA0.0-1.00.00.00.00.00.00.00.00.00.00.0
UAAGGAGCA0.01.00.01.00.01.00.01.00.01.00.01.0
UUAGGGAGC0.00.01.00.00.00.00.00.00.00.00.00.0
UAAAGAGCA0.00.00.0-1.00.00.00.00.00.00.00.00.0
UUAAGAAGC0.00.00.00.01.00.00.00.00.00.00.00.0
UAAGGGGCA0.00.00.00.00.0-1.00.00.00.00.00.00.0
UUAAGGGGC0.00.00.00.00.00.01.00.00.00.00.00.0
UAAGGAACA0.00.00.00.00.00.00.0-1.00.00.00.00.0
UUAAGGACC0.00.00.00.00.00.00.00.01.00.00.00.0
UAAGGAGGA0.00.00.00.00.00.00.00.00.0-1.00.00.0
UUAAGGAGA0.00.00.00.00.00.00.00.00.00.01.00.0
UAAGGAGCC0.00.00.00.00.00.00.00.00.00.00.0-1.0
\n", "
" ], "text/plain": [ " U-12A_in_UUAAGGAGC U-12A_in_UAAGGAGCA A-10G_in_UUAAGGAGC \\\n", "UUAAGGAGC -1.0 0.0 -1.0 \n", "UAAAGGAGC 1.0 0.0 0.0 \n", "UUAGGAGCA 0.0 -1.0 0.0 \n", "UAAGGAGCA 0.0 1.0 0.0 \n", "UUAGGGAGC 0.0 0.0 1.0 \n", "UAAAGAGCA 0.0 0.0 0.0 \n", "UUAAGAAGC 0.0 0.0 0.0 \n", "UAAGGGGCA 0.0 0.0 0.0 \n", "UUAAGGGGC 0.0 0.0 0.0 \n", "UAAGGAACA 0.0 0.0 0.0 \n", "UUAAGGACC 0.0 0.0 0.0 \n", "UAAGGAGGA 0.0 0.0 0.0 \n", "UUAAGGAGA 0.0 0.0 0.0 \n", "UAAGGAGCC 0.0 0.0 0.0 \n", "\n", " A-10G_in_UAAGGAGCA G-8A_in_UUAAGGAGC G-8A_in_UAAGGAGCA \\\n", "UUAAGGAGC 0.0 -1.0 0.0 \n", "UAAAGGAGC 0.0 0.0 0.0 \n", "UUAGGAGCA 0.0 0.0 0.0 \n", "UAAGGAGCA 1.0 0.0 1.0 \n", "UUAGGGAGC 0.0 0.0 0.0 \n", "UAAAGAGCA -1.0 0.0 0.0 \n", "UUAAGAAGC 0.0 1.0 0.0 \n", "UAAGGGGCA 0.0 0.0 -1.0 \n", "UUAAGGGGC 0.0 0.0 0.0 \n", "UAAGGAACA 0.0 0.0 0.0 \n", "UUAAGGACC 0.0 0.0 0.0 \n", "UAAGGAGGA 0.0 0.0 0.0 \n", "UUAAGGAGA 0.0 0.0 0.0 \n", "UAAGGAGCC 0.0 0.0 0.0 \n", "\n", " A-7G_in_UUAAGGAGC A-7G_in_UAAGGAGCA G-6C_in_UUAAGGAGC \\\n", "UUAAGGAGC -1.0 0.0 -1.0 \n", "UAAAGGAGC 0.0 0.0 0.0 \n", "UUAGGAGCA 0.0 0.0 0.0 \n", "UAAGGAGCA 0.0 1.0 0.0 \n", "UUAGGGAGC 0.0 0.0 0.0 \n", "UAAAGAGCA 0.0 0.0 0.0 \n", "UUAAGAAGC 0.0 0.0 0.0 \n", "UAAGGGGCA 0.0 0.0 0.0 \n", "UUAAGGGGC 1.0 0.0 0.0 \n", "UAAGGAACA 0.0 -1.0 0.0 \n", "UUAAGGACC 0.0 0.0 1.0 \n", "UAAGGAGGA 0.0 0.0 0.0 \n", "UUAAGGAGA 0.0 0.0 0.0 \n", "UAAGGAGCC 0.0 0.0 0.0 \n", "\n", " G-6C_in_UAAGGAGCA C-5A_in_UUAAGGAGC C-5A_in_UAAGGAGCA \n", "UUAAGGAGC 0.0 -1.0 0.0 \n", "UAAAGGAGC 0.0 0.0 0.0 \n", "UUAGGAGCA 0.0 0.0 0.0 \n", "UAAGGAGCA 1.0 0.0 1.0 \n", "UUAGGGAGC 0.0 0.0 0.0 \n", "UAAAGAGCA 0.0 0.0 0.0 \n", "UUAAGAAGC 0.0 0.0 0.0 \n", "UAAGGGGCA 0.0 0.0 0.0 \n", "UUAAGGGGC 0.0 0.0 0.0 \n", "UAAGGAACA 0.0 0.0 0.0 \n", "UUAAGGACC 0.0 0.0 0.0 \n", "UAAGGAGGA -1.0 0.0 0.0 \n", "UUAAGGAGA 0.0 1.0 0.0 \n", "UAAGGAGCC 0.0 0.0 -1.0 " ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "backgrounds = [\"UUAAGGAGC\", \"UAAGGAGCA\"]\n", "positions = np.arange(-13, -4)\n", "contrasts = {}\n", "for bc1, bc2 in combinations(backgrounds, 2):\n", " for p, (pos, a1, a2) in enumerate(zip(positions, bc1, bc2)):\n", " if a1 == a2:\n", " continue\n", " label = \"{}{}{}\".format(a1, pos, a2)\n", "\n", " for bc in [bc1, bc2]:\n", " s = [c for c in bc]\n", " s[p] = a1\n", " s1 = \"\".join(s)\n", " s[p] = a2\n", " s2 = \"\".join(s)\n", " contrasts[\"{}_in_{}\".format(label, bc)] = {s1: -1, s2: 1}\n", "contrasts_matrix = pd.DataFrame(contrasts).fillna(0)\n", "contrasts_matrix" ] }, { "cell_type": "code", "execution_count": null, "id": "7970f6b3", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 12/12 [03:28<00:00, 17.36s/it]\n" ] } ], "source": [ "mut_eff_contrasts = model.make_contrasts(contrasts_matrix)" ] }, { "cell_type": "code", "execution_count": null, "id": "4cb2c3c2", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
estimatestdci_95_lowerci_95_upperp(|x|>0)mutationbackground
U-12A_in_UUAAGGAGC0.0364030.120603-0.2048020.2776080.618614U-12AUUAAGGAGC
U-12A_in_UAAGGAGCA0.4390550.1205750.1979050.6802040.999864U-12AUAAGGAGCA
A-10G_in_UUAAGGAGC-1.2963040.125055-1.546413-1.0461951.000000A-10GUUAAGGAGC
A-10G_in_UAAGGAGCA1.8683710.1243461.6196802.1170631.000000A-10GUAAGGAGCA
G-8A_in_UUAAGGAGC-1.6353270.124599-1.884525-1.3861291.000000G-8AUUAAGGAGC
G-8A_in_UAAGGAGCA1.8374950.1204701.5965552.0784351.000000G-8AUAAGGAGCA
A-7G_in_UUAAGGAGC-1.4344280.120734-1.675896-1.1929601.000000A-7GUUAAGGAGC
A-7G_in_UAAGGAGCA0.7670230.1306340.5057561.0282911.000000A-7GUAAGGAGCA
G-6C_in_UUAAGGAGC-1.4651850.124660-1.714505-1.2158641.000000G-6CUUAAGGAGC
G-6C_in_UAAGGAGCA-0.6023130.139946-0.882205-0.3224210.999992G-6CUAAGGAGCA
C-5A_in_UUAAGGAGC0.4271330.1259270.1752800.6789860.999653C-5AUUAAGGAGC
C-5A_in_UAAGGAGCA0.3601640.1253180.1095280.6108010.997973C-5AUAAGGAGCA
\n", "
" ], "text/plain": [ " estimate std ci_95_lower ci_95_upper p(|x|>0) \\\n", "U-12A_in_UUAAGGAGC 0.036403 0.120603 -0.204802 0.277608 0.618614 \n", "U-12A_in_UAAGGAGCA 0.439055 0.120575 0.197905 0.680204 0.999864 \n", "A-10G_in_UUAAGGAGC -1.296304 0.125055 -1.546413 -1.046195 1.000000 \n", "A-10G_in_UAAGGAGCA 1.868371 0.124346 1.619680 2.117063 1.000000 \n", "G-8A_in_UUAAGGAGC -1.635327 0.124599 -1.884525 -1.386129 1.000000 \n", "G-8A_in_UAAGGAGCA 1.837495 0.120470 1.596555 2.078435 1.000000 \n", "A-7G_in_UUAAGGAGC -1.434428 0.120734 -1.675896 -1.192960 1.000000 \n", "A-7G_in_UAAGGAGCA 0.767023 0.130634 0.505756 1.028291 1.000000 \n", "G-6C_in_UUAAGGAGC -1.465185 0.124660 -1.714505 -1.215864 1.000000 \n", "G-6C_in_UAAGGAGCA -0.602313 0.139946 -0.882205 -0.322421 0.999992 \n", "C-5A_in_UUAAGGAGC 0.427133 0.125927 0.175280 0.678986 0.999653 \n", "C-5A_in_UAAGGAGCA 0.360164 0.125318 0.109528 0.610801 0.997973 \n", "\n", " mutation background \n", "U-12A_in_UUAAGGAGC U-12A UUAAGGAGC \n", "U-12A_in_UAAGGAGCA U-12A UAAGGAGCA \n", "A-10G_in_UUAAGGAGC A-10G UUAAGGAGC \n", "A-10G_in_UAAGGAGCA A-10G UAAGGAGCA \n", "G-8A_in_UUAAGGAGC G-8A UUAAGGAGC \n", "G-8A_in_UAAGGAGCA G-8A UAAGGAGCA \n", "A-7G_in_UUAAGGAGC A-7G UUAAGGAGC \n", "A-7G_in_UAAGGAGCA A-7G UAAGGAGCA \n", "G-6C_in_UUAAGGAGC G-6C UUAAGGAGC \n", "G-6C_in_UAAGGAGCA G-6C UAAGGAGCA \n", "C-5A_in_UUAAGGAGC C-5A UUAAGGAGC \n", "C-5A_in_UAAGGAGCA C-5A UAAGGAGCA " ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "items = [x.split(\"_\") for x in mut_eff_contrasts.index.values]\n", "mut_eff_contrasts[\"mutation\"] = [x[0] for x in items]\n", "mut_eff_contrasts[\"background\"] = [x[-1] for x in items]\n", "mut_eff_contrasts" ] }, { "cell_type": "markdown", "id": "f2f54602", "metadata": {}, "source": [ "while we can already see the differences in the effects of mutations across the two genetic backgrounds in the table, we can also plot these posterior distributions" ] }, { "cell_type": "code", "execution_count": null, "id": "cdcdb841", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig, axes = plt.subplots(1, 1, figsize=(4, 1.5))\n", "\n", "palette = dict(zip(backgrounds, ['grey', 'black']))\n", "dx = dict(zip(backgrounds, [-0.125, 0.125]))\n", "kwargs = {\n", " \"fmt\": \"o\",\n", " \"lw\": 0,\n", " \"elinewidth\": 2,\n", " \"capsize\": 3,\n", " \"markersize\": 5,\n", "}\n", "\n", "for background, df in mut_eff_contrasts.groupby('background'):\n", " df[\"x\"] = np.arange(df.shape[0]) - 0.125\n", " axes.errorbar(\n", " df[\"x\"] + dx[background],\n", " df[\"estimate\"],\n", " yerr=2 * df[\"std\"],\n", " color=palette[background],\n", " label=background,\n", " **kwargs,\n", " )\n", "axes.set(\n", " xlabel=\"Mutation\",\n", " ylabel=\"$\\Delta$log(GFP)\",\n", " xticks=df[\"x\"],\n", " xticklabels=df[\"mutation\"],\n", ")\n", "axes.axhline(0, linestyle=\"--\", c=\"grey\", lw=0.75)\n", "axes.legend(loc=(0.02, 1.025), ncol=2)" ] }, { "cell_type": "markdown", "id": "52cbe16a", "metadata": {}, "source": [ "### Estimating average phenotype across genetic backgrounds\n", "\n", "In some cases, when measurements are not accurate enough, it is hard to draw solid conclusions about the phenotypes or mutational effects at specific sequences. However, we can often reliably estimate the average across a series of genetic backgrounds that we believe behave in the same manner. For instance, in the SD sequence, we hypothesized that we can obtain functional sequences by having at least one of two overlapping AGGAG motifs but that only a partial AGG match would be insufficient to drive high translationa efficiency. \n", "\n", "To investigate this question, we define a contrast matrix to compute these average phenotypes across uniformly sampled genetic backgrounds, and compare it with the wild-type sequence `'AAGGAGGUG'` and the average of all possible sequences `'NNNNNNNNN'`." ] }, { "cell_type": "code", "execution_count": null, "id": "296f62ff", "metadata": {}, "outputs": [], "source": [ "bc1 = np.array([\"\".join(x) for x in product(\"ACGU\", repeat=3)])\n", "bc2 = np.array([\"\".join(x) for x in product(\"ACGU\", repeat=6)])\n", "bc3 = np.array([\"\".join(x) for x in product(\"ACGU\", repeat=9)])\n", "bc4 = np.array([\"\".join(x) for x in product(\"ACGU\", repeat=2)])\n", "p1, p2, p3 = 1.0 / bc1.shape[0], 1.0 / bc2.shape[0], 1.0 / bc3.shape[0]\n", "p4 = 1.0 / bc4.shape[0]\n", "contrasts = {\n", " \"AGGAGGNNN\": {\"AGGAGG{}\".format(x): p1 for x in bc1},\n", " \"NGGAGGAGN\": {\"{}GGAGGAG{}\".format(x[0], x[-1]): p4 for x in bc4},\n", " \"NNNAGGNNN\": {\"{}AGG{}\".format(x[:3], x[3:]): p2 for x in bc2},\n", " \"NNNAGGAGG\": {\"{}AGGAGG\".format(x): p1 for x in bc1},\n", " \"AAGGAGGUG\": {\"AAGGAGGUG\": 1.0},\n", " \"NNNNNNNNN\": {x: p3 for x in bc3},\n", "}\n", "contrast_matrix = pd.DataFrame(contrasts).fillna(0)" ] }, { "cell_type": "code", "execution_count": null, "id": "70af014e", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 6/6 [00:26<00:00, 4.39s/it]\n" ] } ], "source": [ "avg_phenotypes_contrasts = model.make_contrasts(contrast_matrix)" ] }, { "cell_type": "code", "execution_count": null, "id": "c4872e18", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
estimatestdci_95_lowerci_95_upperp(|x|>0)
AGGAGGNNN2.3892340.0193622.3505102.4279581.0
NGGAGGAGN2.7691550.0392002.6907552.8475541.0
NNNAGGNNN1.0261400.0030141.0201121.0321691.0
NNNAGGAGG2.4739230.0208752.4321742.5156731.0
AAGGAGGUG2.0262920.0854221.8554482.1971371.0
NNNNNNNNN0.6200930.0004850.6191230.6210641.0
\n", "
" ], "text/plain": [ " estimate std ci_95_lower ci_95_upper p(|x|>0)\n", "AGGAGGNNN 2.389234 0.019362 2.350510 2.427958 1.0\n", "NGGAGGAGN 2.769155 0.039200 2.690755 2.847554 1.0\n", "NNNAGGNNN 1.026140 0.003014 1.020112 1.032169 1.0\n", "NNNAGGAGG 2.473923 0.020875 2.432174 2.515673 1.0\n", "AAGGAGGUG 2.026292 0.085422 1.855448 2.197137 1.0\n", "NNNNNNNNN 0.620093 0.000485 0.619123 0.621064 1.0" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "avg_phenotypes_contrasts" ] }, { "cell_type": "code", "execution_count": null, "id": "db77329c", "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig, axes = plt.subplots(1, 1, figsize=(2, 1.5))\n", "\n", "seqs = [\"AGGAGGNNN\", \"NGGAGGAGN\", \"NNNAGGNNN\", \"NNNAGGAGG\"]\n", "labels = [\n", " r\"$\\bf{AGGAGG}$NNN\",\n", " r\"N$\\bf{GGAGGAG}$N\",\n", " r\"NNN$\\bf{AGG}$NNN\",\n", " r\"NNN$\\bf{AGGAGG}$\",\n", "]\n", "df = avg_phenotypes_contrasts.loc[seqs, :].copy()\n", "df[\"step\"] = np.arange(1, df.shape[0] + 1)\n", "kwargs = {\n", " \"fmt\": \"o\",\n", " \"lw\": 0,\n", " \"elinewidth\": 2,\n", " \"capsize\": 3,\n", " \"markersize\": 2,\n", "}\n", "axes.errorbar(\n", " df[\"step\"],\n", " df[\"estimate\"],\n", " yerr=2 * df[\"std\"],\n", " color='black',\n", " **kwargs,\n", ")\n", "\n", "axes.set(\n", " xlabel=\"Genetic background\",\n", " ylabel=\"log(GFP)\",\n", " xticks=df[\"step\"],\n", " xlim=(0.5, 4.5),\n", ")\n", "axes.set_xticklabels(labels, rotation=45, ha=\"right\")\n", "\n", "for s in ['NNNNNNNNN', 'AAGGAGGUG']:\n", " axes.axhline(\n", " avg_phenotypes_contrasts.loc[s, \"estimate\"],\n", " linestyle=\"--\",\n", " c=\"grey\",\n", " lw=0.75,\n", " label=\"Average\",\n", " )\n", " axes.axhspan(\n", " ymin=avg_phenotypes_contrasts.loc[s, \"ci_95_lower\"],\n", " ymax=avg_phenotypes_contrasts.loc[s, \"ci_95_upper\"],\n", " color=\"grey\",\n", " alpha=0.3,\n", " lw=0,\n", " )" ] }, { "cell_type": "markdown", "id": "2b8c3299", "metadata": {}, "source": [ "Here, we see that by averaging across genetic backgrounds, our uncertaintly about average phenotypes is very small, as shown by the posterior standard deviation. Moreover, these results clearly show that having an AGG triplet, is in general insufficient for inducing efficient translation initiation, as opposed to having either one or two overlapping binding sites. " ] } ], "metadata": { "kernelspec": { "display_name": "gpmap", "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.8.18" } }, "nbformat": 4, "nbformat_minor": 5 }