{ "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": 1, "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 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": "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", "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": "iVBORw0KGgoAAAANSUhEUgAAAxYAAAGGCAYAAADmRxfNAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy89olMNAAAACXBIWXMAAA9hAAAPYQGoP6dpAABtSElEQVR4nO3de1xUdf4/8NdwB7mLgCCKooKkgqLgDS9Foqab2sUtN42f63aRssV206207SKWaW5q2WXTamtl09Q1DS8Y5q0w8C7iPRQFUQTkNsDM+f3Rl7NnBs44wMCZy+v5eMzjMXPmnDPvgzWHN5/35/1RCYIggIiIiIiIqBXslA6AiIiIiIgsHxMLIiIiIiJqNSYWRERERETUakwsiIiIiIio1ZhYEBERERFRqzGxICIiIiKiVmNiQURERERErcbEgoiIiIiIWs1B6QDam1arxbVr1+Dh4QGVSqV0OEREihMEAXfu3EFQUBDs7Gz77028RxAR6WrOPcLmEotr164hJCRE6TCIiMzOlStX0KVLF6XDUBTvEURETTPmHmFziYWHhweA3344np6eCkdDRKScuro6bNmyBX369MGwYcPE70dbxnsEEZGu8vJyhISEGHWPsLnEomFo29PTkzcNIrJpBw8exOjRo+Hn5wcALP0B7xFERHKMuUfYXGJBRGTr6urqcPjwYQwbNgzAb3+NIiIiai3bnqVHRGRj6urqsGHDBnTu3FnpUIiIyMpwxIKIyEZoNBrU1tZi+PDh6Nq1q9LhEBGRlWFiQURkA2pra7FhwwZMmDCBSQURmYxGo0FdXZ3SYVArODo6wt7e3iTnYmJBRGQDtm3bhuHDh8Pb21vpUIjICgiCgMLCQpSWliodCpmAt7c3AgMDW93Eg4kFEZEVq62tRUFBASZNmgQHB37lE5FpNCQV/v7+cHNzY1c5CyUIAqqqqnDjxg0AaPX8O95liIislFqtxsaNGzFixAgmFURkMhqNRkwqOnbsqHQ41Equrq4AgBs3bsDf379VZVEW1RUqNTUVgwcPhoeHB/z9/TF58mTk5eUpHRYRkVm6evUqRowYwTkVRGRSDXMq3NzcFI6ETKXh37K182UsKrHYu3cv5syZg59++gm7du1CXV0dxo4di8rKSqVDIyIyG2q1Gps2bUJoaCiTCiJqMyx/sh6m+re0qLHx9PR0ndfr1q2Dv78/srOzMXLkSIWiIiIyHw3rVIwaNcpkXT6IiIiMYVEjFvrKysoAAL6+vgpHQkTUvjQajc4DAGpqalBXV4dx48ahc+fO4nYiImq+0NBQrFixQukwTKY9rseiRiyktFotXnjhBQwfPhx9+/aV3U+tVkOtVouvy8vL2yM8IqJ2VVNTgw0bNuDee+9FQECA0uEQkY3aunVru37epEmTWnTclStXsGjRIqSnp+PmzZvo3LkzJk+ejIULF3JCeitY7IjFnDlzcPLkSaxfv97gfqmpqfDy8hIfISEh7RQhEVH7OXz4MMaMGYOgoCClQyGyCHl5eeKDbMvFixcxaNAgnDt3Dv/+979x/vx5rFmzBhkZGRg6dChKSkoUiUuj0UCr1Sry2aZikYlFcnIyvvvuO/zwww/o0qWLwX0XLFiAsrIy8XHlypV2ipKIqO3Y29vD3t4edXV1+PnnnxEfH4/g4GCd95qaY6FfPkVEZGvmzJkDJycn7Ny5E6NGjULXrl0xfvx47N69GwUFBXj55ZfFfe/cuYPHHnsMHTp0QHBwMFavXi2+JwgCXnvtNXTt2hXOzs4ICgrC888/L76vVqvx4osvIjg4GB06dEBcXBwyMzPF99etWwdvb2/897//RWRkJJydnfHpp5/CxcWl0cKDc+fOxb333iu+3r9/P+Lj4+Hq6oqQkBA8//zzOs2Mbty4gUmTJsHV1RXdu3fHV199ZcKfoDyLSiwEQUBycjI2bdqEPXv2oHv37nc9xtnZGZ6enjoPIiJrUF1djQ0bNiA0NFTpUIiILEJJSQl27NiBZ599Vly/oUFgYCCmT5+OtLQ0CIIAAFi6dCmioqJw5MgRzJ8/H3PnzsWuXbsAABs3bsR7772Hjz76COfOncPmzZvRr18/8XzJyck4dOgQ1q9fj+PHj+ORRx7BuHHjcO7cOXGfqqoqvP322/j0009x6tQpTJ8+Hd7e3ti4caO4j0ajQVpaGqZPnw4AuHDhAsaNG4eHHnoIx48fR1paGvbv34/k5GTxmCeffBJXrlzBDz/8gA0bNuCDDz4QF8FrSxY1x2LOnDn4+uuvsWXLFnh4eKCwsBAA4OXl1eg/DnNx5coVPPHEE7hx4wYcHBzw6quv4pFHHlE6LCKycPX19aivr0dCQgICAwOVDoeIyCKcO3cOgiCgT58+Tb7fp08f3L59G8XFxQCA4cOHY/78+QCA3r1748CBA3jvvfdw//33Iz8/H4GBgUhISICjoyO6du2K2NhYAEB+fj7Wrl2L/Px8sUT1xRdfRHp6OtauXYvFixcD+K2T3wcffICoqCgxht///vf4+uuvMWvWLABARkYGSktL8dBDDwH4rcx/+vTpeOGFFwAAvXr1wvvvv49Ro0bhww8/RH5+Pr7//ntkZWVh8ODBAIB//vOfstdsShY1YvHhhx+irKwMo0ePRufOncVHWlqa0qHJcnBwwIoVK3D69Gns3LkTL7zwAtfdIKJWqa6uxr///W+oVComFURELdAwInE3Q4cObfQ6NzcXAPDII4+guroaPXr0wOzZs7Fp0ybU19cDAE6cOAGNRoPevXvD3d1dfOzduxcXLlwQz+fk5IT+/fvrfMb06dORmZmJa9euAQC++uorPPDAA/D29gYAHDt2DOvWrdM5b2JiIrRaLS5duoTc3Fw4ODggJiZGPGdERIR4fFuyqBELY/8jMCcNyQ/w2xCbn58fSkpK0KFDB4UjIyJLJAgCvvvuO9x///1wd3e/6/76cym4tgXZMk7Upp49e0KlUiE3NxdTpkxp9H5ubi58fHzQqVOnu54rJCQEeXl52L17N3bt2oVnn30WS5cuxd69e1FRUQF7e3tkZ2c3+t6Vfne7uro2Wpxu8ODBCAsLw/r16/HMM89g06ZNWLdunfh+RUUFnnrqKZ35HA26du2Ks2fP3jX2tmJRIxbmaNSoUVCpVFCpVHByckKfPn3w9ddfN7lvdnY2NBpNqzpTrV69GqGhoXBxcUFcXByysrIM7q/RaPDqq6+ie/fucHV1RVhYGN544w3ZJG3JkiVQqVTi8FqDH3/8EZMmTUJQUBBUKhU2b97c4msgopapqqrC5cuXMXXqVI5UEBG1QMeOHXH//ffjgw8+QHV1tc57hYWF+OqrrzBt2jTxl/2ffvpJZ5+ffvpJp6TI1dUVkyZNwvvvv4/MzEwcOnQIJ06cwIABA6DRaHDjxg307NlT52HM9/f06dPx1VdfYevWrbCzs8MDDzwgvjdw4ECcPn260Xl79uwJJycnREREoL6+HtnZ2eIxeXl5jSaEtwUmFq0gCAKOHDmCd999F9evX0deXh7GjRuHGTNm4NKlSzr7lpSUYMaMGfj4449b/HlpaWlISUnBokWLkJOTg6ioKCQmJhqcjPP222/jww8/xKpVq5Cbm4u3334b77zzDlauXNlo38OHD+Ojjz5qNCQHAJWVlYiKitLphkBE7aeqqgobN26Eq6srRx2IiFph1apVUKvVSExMxI8//ogrV64gPT0d999/P4KDg/HWW2+J+x44cADvvPMOzp49i9WrV+Obb77B3LlzAfzW1emf//wnTp48iYsXL+Jf//oXXF1d0a1bN/Tu3RvTp0/HjBkz8O233+LSpUvIyspCamoqtm3bdtcYp0+fjpycHLz11lt4+OGH4ezsLL730ksv4eDBg0hOTsbRo0dx7tw5bNmyRZy8HR4ejnHjxuGpp57Czz//jOzsbPzxj39sl/nITCxa4dy5c7hz5w7GjRuHwMBAdO/eHbNmzYJGo9EZblWr1Zg8eTLmz5+PYcOGtfjzli9fjtmzZyMpKQmRkZFYs2YN3Nzc8Nlnn8kec/DgQTz44IN44IEHEBoaiocffhhjx45tNNJRUVGB6dOn45NPPoGPj0+j84wfPx5vvvlmk8OGRPQ/+itim6q969WrVzF27FjZv3TV1taKDylp61l7e3u2myUim9erVy/88ssv6NGjBx599FGEhYXhT3/6E8aMGYNDhw7B19dX3HfevHn45ZdfMGDAALz55ptYvnw5EhMTAQDe3t745JNPMHz4cPTv3x+7d+/G1q1bxQX21q5dixkzZmDevHkIDw/H5MmTcfjwYXTt2vWuMfbs2ROxsbE4fvy42A2qQf/+/bF3716cPXsW8fHxGDBgABYuXKizjtHatWsRFBSEUaNGYerUqfjTn/4Ef39/U/z4DFIJljhxoRXKy8vh5eWFsrKyVree/fe//405c+bg1q1bUKlUuHr1KubMmYMdO3bg4sWLCAoKgiAIePzxxxEeHo7XXnut0TkWL14sdgaQc/r0aQQGBsLNzQ0bNmzA5MmTxfdmzpyJ0tJSbNmypcljFy9ejI8//hg7d+5E7969cezYMYwdOxbLly/X+Q915syZ8PX1xXvvvYfRo0cjOjpadtl3lUqFTZs26cRBRL8x9At7S0YaKisrsWPHDkyZMqVRHa6UNKFwcnIyKr6GeEz5vWjp+LOwbnJzLMLDw9s5EstWU1ODS5cuoXv37nBxcVE6HDIBQ/+mzfletKjJ2+YmJycHZWVl8PDwgEajQU1NDVxdXbFmzRoxazxw4ADS0tLQv39/cV7Cl19+KfY5fvrpp/Hoo48a/JygoCDcuHEDGo0GAQEBOu8FBATgzJkzssfOnz8f5eXliIiIEP9a+dZbb+kkFevXr0dOTg4OHz7ckh8DEbURtVqNjRs3Yty4cQaTCiIiInPAxKIVcnJyMGfOHDz//PMoLS3Fiy++iOHDh+PJJ58U9xkxYoTB5dl9fX11htxM7T//+Q+++uorfP3117jnnntw9OhRvPDCCwgKCsLMmTNx5coVcbEX/tWByLT0RyikowXSEYam6l4rKyvFCXseHh6ora3VGYnQL3kyNEphKCYiIiJTYWLRCjk5OZg9ezZ69uwJAPjggw/Qv39/zJ492+iVcJtTCmVvb4+ioiKd94qKigx2F/jLX/6C+fPn4/e//z0AoF+/fvj111+RmpqKmTNnIjs7Gzdu3MDAgQPFYzQaDX788UdxchN/ESFqXxUVFfj2228xYcIEluMQtQDbyhIpg4lFC128eBGlpaXo27evuC0yMhJhYWH4+uuv8be//c2o8xhbCtWw0ElGRoY4t0Gr1SIjI0NnCXd9VVVVsLPTnaNvb28vjqLcd999OHHihM77SUlJiIiIwEsvvcSkgkgBv/zyC8aPHw8/P79GIxNERETmiolFC2VnZ8PR0RG9e/fW2X7fffdh06ZNRicWzSmFSklJwcyZMzFo0CDExsZixYoVqKysRFJSkrjPqlWrsGnTJmRkZAAAJk2ahLfeegtdu3bFPffcgyNHjmD58uX4f//v/wEAPDw8dJIjAOjQoQM6duyos72iogLnz58XX1+6dAlHjx6Fr6+vUd0NiMxJUxOY2+N8cvs1bL9z5w5OnjyJ+Ph4cbu0xMnQxHBpP3ZpaVVLS6aIiIiai4lFC+Xk5KBXr16NbtIJCQlYs2YNrl69ii5dupj0M6dNm4bi4mIsXLgQhYWFiI6ORnp6us6E7ps3b+osFb9y5Uq8+uqrePbZZ3Hjxg0EBQXhqaeewsKFC5v12b/88gvGjBkjvk5JSQHwWzcp6WqQRNQyd+7cwZYtWzB+/HilQyEiImoRtpslIpuj1IiFXFmTRqNBdXU16uvrxf7nTZ1P+jn6oxfS180dseD34v/wZ2EdmjvHgu1mm4ftZq2PqdrNcoE8IiIF3blzB//5z3/g7OzcKKkgIiKyJCyFIiKbY+qmBHLnu9vq1oIgYMeOHZgwYYLOX4ik8yXc3d2bPJ/+Z8rNneCcCiIiai8csSAiUkB5eTny8/MxderUNl3LhoiI/ufJJ5+ESqXCkiVLdLZv3ryZC5GaAEcsiIjaWXl5Ob777juMHz++UTtoImp/0jkZnG/ROu29hkhL/r1cXFzw9ttv46mnnoKPj08bRGW7eEcjIpuj0WhkH1K1tbXiQ24f4LfSpYaH9Bj9h5OTExwdHXHz5k0kJibC09OzyRicnJzEh3S7vb297IOIiIyTkJCAwMBApKamyu6zf/9+xMfHw9XVFSEhIXj++edRWVkJ4LfW/tKW/A2jHWvWrNH5jFdeeaXtLsJMMbEgImonpaWl2Lx5M8LDw+Ht7a10OERENsne3h6LFy/GypUrcfXq1UbvX7hwAePGjcNDDz2E48ePIy0tDfv37xcXJB41ahROnz6N4uJiAMDevXvh5+eHzMxMAEBdXR0OHTqE0aNHt9clmQ0mFkRE7aCqqgpbtmzBmDFjWMdLRKSwKVOmIDo6GosWLWr0XmpqKqZPn44XXngBvXr1wrBhw/D+++/jiy++QE1NDfr27QtfX1/s3bsXAJCZmYl58+aJr7OyslBXV4dhw4a16zWZAyYWRGRxjCljMsTYkiJpSZIhcqVLDcrLy2FnZ4eJEyfC2dkZ1dXVcHV1FR/S452cnGTjYekTEZHpvP322/j888+Rm5urs/3YsWNYt24d3N3dxUdiYiK0Wi0uXboElUqFkSNHIjMzE6WlpTh9+jSeffZZqNVqnDlzBnv37sXgwYPh5uam0JUph4kFEVEbKi0txfbt21FbW2uTNxkiInM1cuRIJCYmYsGCBTrbKyoq8NRTT+Ho0aPi49ixYzh37hzCwsIAAKNHj0ZmZib27duHAQMGwNPTU0w29u7di1GjRilxSYpjYkFE1IZOnDiBCRMmcBXnFlq9ejVCQ0Ph4uKCuLg4ZGVlGdy/tLQUc+bMQefOneHs7IzevXtj+/bt7RQtEVmaJUuWYOvWrTh06JC4beDAgTh9+jR69uzZ6NEwgt0wz+Kbb74R51KMHj0au3fvxoEDB2xyfgXAxIKIqE3cvn0bhw8fRnx8PJOKFkpLS0NKSgoWLVqEnJwcREVFITExETdu3Ghy/9raWtx///24fPkyNmzYgLy8PHzyyScIDg5u58iJyFL069cP06dPx/vvvy9ue+mll3Dw4EEkJyfj6NGjOHfuHLZs2SJO3gaA/v37w8fHB19//bVOYrF582ao1WoMHz68vS/FLDCxICKL05YtV6VzJKRtZKXby8rKdB7S/ezt7VFeXo6dO3ciIiJC9txy2w21lbU1y5cvx+zZs5GUlITIyEisWbMGbm5u+Oyzz5rc/7PPPkNJSQk2b96M4cOHIzQ0FKNGjUJUVFQ7R05EluT111+HVqsVX/fv3x979+7F2bNnER8fjwEDBmDhwoUICgoS91GpVIiPj4dKpcKIESPE4zw9PTFo0CB06NCh3a/DHKgEQRCUDqI9lZeXw8vLC2VlZfwrIhE1Iv2lv7a2Vnwu/cW+urpa5xjpe4IgoLq6GnZ2do1uLNJzu7u7N7ld/3ztwRy/FxvmpGzYsAGTJ08Wt8+cOROlpaXYsmVLo2MmTJgAX19fuLm5YcuWLejUqRMef/xxvPTSS7I/U7VaDbVaLb4uLy9HSEiIWf0sqPlas0gbF8i7u5qaGly6dAndu3eHi4uL0uGQCRj6N23OPYIjFkREJnL79m1s3LgRHTp04C+lrXTz5k1oNBoEBATobA8ICEBhYWGTx1y8eBEbNmyARqPB9u3b8eqrr2LZsmV48803ZT8nNTUVXl5e4iMkJMSk10FEZEsclA6AiKi9GWpNKx2lkO4nbTmr/9dvd3d3aLVabN26FZMmTYKjoyMAwNXVVfbcUrZY5tQWtFot/P398fHHH8Pe3h4xMTEoKCjA0qVLm+xVDwALFixASkqK+LphxIKIiJqPiQURUSvdvHkTlZWV+P3vf4+6ujqlw7EKfn5+sLe3R1FRkc72oqIiBAYGNnlM586d4ejoqJOo9enTB4WFhaitrW1yPRJnZ2c4OzubNngiIhvFUigiola4desWtm3bBl9fX66obUJOTk6IiYlBRkaGuE2r1SIjIwNDhw5t8pjhw4fj/PnzOpMwz549i86dO991kUMiImo9JhZEZDZasoq2MefSaDSora0VH3Kdn5qalN3wkB7fQBAE3Lp1Cw899BA8PDzuGpOxK3mb8udgyVJSUvDJJ5+IK+M+88wzqKysRFJSEgBgxowZOgtbPfPMMygpKcHcuXNx9uxZbNu2DYsXL8acOXOUugQiIpvCUigioha4desWDh8+jHHjxul0eCLTmTZtGoqLi7Fw4UIUFhYiOjoa6enp4oTu/Px82Nn97+9jISEh2LFjB/785z+jf//+CA4Oxty5c/HSSy8pdQlEVs3GGotaNVP9WzKxICJqpvLycuzZswcTJkxQOhSrl5ycrLMolVRmZmajbUOHDsVPP/3UxlER2baGBhVVVVWNmlSQZaqqqgLwv3/blmJiQUSNSEtw2rNjkfSzDMUg956hY6QlTIY6POmXQzVouHneunUL7u7umDx5stjrW657lD5jf67sEkVE5sze3h7e3t64ceMGAMDNzY1zzCyUIAioqqrCjRs34O3t3er7DxMLIiIjFRcXY8+ePZg0aRLc3NyUDoeISDEN3dkakguybN7e3rId95qDiQURkZFyc3OZVBARAVCpVOjcuTP8/f3ZZtvC6bfpbg0mFkREd3Hz5k0UFxdj5MiRSodCRDLy8vKUDsEmNXTOIwKYWBBREyz1JiGdw6DfqlU690E6j0J/4qH02svKynDz5k0cPHgQDz30kPiesWsi6MdgqT9XIiIiY3AdCyIiGTU1NXB0dMTYsWNZ/kRERHQXTCyIiJpQWFiIXbt2wd3dXez+RERERPJYCkVEZkmujaz+e9I2stLn+iVOFRUVTe6nz8nJCfX19di/fz8effRR8TwtWQWbpU9ERGRLmFgQEUlcv34dWq0WDz30EBwc+BVJRERkLJZCERH9n8LCQuzduxcdO3bkYk9ERETNxD/HEZHJGVs2ZOzq2IbOL1fWpL+CtlxXqIbtDauPTpo0CY6Ojga7SrHbE1Hzbd26VXw+adIkBSMhorbCEQsisnnXrl1Deno6IiIiOFGbiIiohZhYEJFNu3XrFvbt24cxY8YoHQoREZFFYykUEdmsW7duoWvXrpgyZYrRi94RUeuZc1mUdAXv8PBwBSMhsjxMLIjIJKTzDgzNOTA0/0Kuxayh+Q5y59ZvNyudV+Hr64urV68iJycHwcHBcHZ2Fo81NJeiqTiJiIjoN0wsiMjmCIKA8+fPY/LkyWwpS0REZCK8oxKRTbl27Rru3LmD0aNHA2jZwndERETUmEVO3l69ejVCQ0Ph4uKCuLg4ZGVlKR0SkUXQaDTiw9T72dvbiw9D+xk6t/QchvYrKSkRH66uruLD3d1dfFRUVOg8XF1dcevWLWRnZyM6OhpOTk5wcnLS+UxDDyIiIjLM4hKLtLQ0pKSkYNGiRcjJyUFUVBQSExNx48YNpUMjIjNWVVWFDh06YPLkyZyoTURE1AYsLrFYvnw5Zs+ejaSkJERGRmLNmjVwc3PDZ599pnRoRGSmCgoKsG3bNnh7ezOpICIiaiMWNceitrYW2dnZWLBggbjNzs4OCQkJOHTokIKREVkGY0t62nI/uc5PgG7nJmlXp5KSEp39vLy8mnxPugp3YGAgAECtViM3NxdTp04VJ2rLfY6huImIiMgwi0osbt68CY1Gg4CAAJ3tAQEBOHPmTJPHqNVqqNVq8XV5eXmbxkhE5uPy5ctwcXHB1KlToVKplA6HiIjIqllcKVRzpaamwsvLS3yEhIQoHRIRtYNLly7h559/RseOHZlUEBERtQOLGrHw8/ODvb09ioqKdLYXFRWJZQ/6FixYgJSUFPF1eXk5kwuiZpCWFwHypUzGzl2QHqN/bilpuZK7u7vse9J4OnXqBADQarU4ffo0xo8fj/r6etTX1+ucQ1r+pB8D52AQERG1jEUlFk5OToiJiUFGRgYmT54M4LdfIDIyMpCcnNzkMc7OznB2dm7HKIlISZcuXcL58+cxatQopUMhsnlbt25VOgQiakcWlVgAQEpKCmbOnIlBgwYhNjYWK1asQGVlJZKSkpQOjYgUVlhYiJycHPzud7+DIAhKh0NERGRTLC6xmDZtGoqLi7Fw4UIUFhYiOjoa6enpjSZ0E5FtKSwsREhICB588EE4ODgYLLMiIvMhHdWYNGmSgpEQUWtZXGIBAMnJybKlT0RkWobmHEjnN0h/kddv0yr3S77+ftLX0nkUhlYAd3d3x4ULF3D8+HGEhYWJLWX128hKY5BeE+dUEBERmYbVd4UiIusmCAKuXr2K3/3ud2JSQURERO2Pd2EisliXLl2CRqPhRG0iIiIzwMSCiAzSL0Mypt2stIzJ0Hv6pVDS9yoqKsTn+mVNrq6uuHjxIs6cOYOHH35YHKmQxmOozIqIiIhMj6VQRGRxKioq4Ovri4kTJ7L8iYiIyEwwsSAii3Lx4kX88MMP8PLy4igEERGRGeGf+ogIgG4ZkbErasuVRbWUtBTK19e30edUVVXh119/xaRJk8RtZWVl4n5eXl7N/kxDpV5ERERkPI5YEJFFOHv2LKqqqnSSCiIiIjIfTCyIyOzl5eUhNzcXPj4+SodC7Wz16tUIDQ2Fi4sL4uLikJWVJbvvunXroFKpdB4uLi7tGC0RkW1jKRSRkQx1HDInxpb26O8nV/5kaD9jfybS/aQL1Uk7P+lrOF/DsRMnThS3ST/L3d1d9hzGxGPO/5a2Li0tDSkpKVizZg3i4uKwYsUKJCYmIi8vD/7+/k0e4+npiby8PPG1SqVqr3CJiGweRyyIyGzl5uZi3759CA8PZwJgg5YvX47Zs2cjKSkJkZGRWLNmDdzc3PDZZ5/JHqNSqRAYGCg+AgIC2jFiIiLbxsSCiMzSlStXcO7cOYwcOVLpUEgBtbW1yM7ORkJCgrjNzs4OCQkJOHTokOxxFRUV6NatG0JCQvDggw/i1KlT7REuERGBiQURmaGCggIEBARg4sSJsLPj15QtunnzJjQaTaMRh4CAABQWFjZ5THh4OD777DNs2bIF//rXv6DVajFs2DBcvXpV9nPUajXKy8t1HkRE1DKcY0FkJEspxTE2TmP3MzRnQ+4c0nkU+q+lLWGlrWKB3+Z25Obm4vLly+jfv79sUtHafwtL+bek5hk6dCiGDh0qvh42bBj69OmDjz76CG+88UaTx6SmpuLvf/97e4VIRGTV+KdAIjIbWq0Wt2/fRmJiIkcqbJyfnx/s7e1RVFSks72oqAiBgYFGncPR0REDBgzA+fPnZfdZsGABysrKxMeVK1daFTcRkS3jnZuIzEJeXh7Onz+PYcOGMakgODk5ISYmBhkZGeI2rVaLjIwMnVEJQzQaDU6cOIHOnTvL7uPs7AxPT0+dB1GDvLw88UFEd8dSKCIz05JWqC1p+9rSkilpi1hpiZP0eadOnXSOkb4njcHV1RUAcPr0aVy/fh2TJk0yKqlgu1jbkJKSgpkzZ2LQoEGIjY3FihUrUFlZiaSkJADAjBkzEBwcjNTUVADA66+/jiFDhqBnz54oLS3F0qVL8euvv+KPf/yjkpdBzbB161bx+aRJkxSMhIhagokFESmqrKwMQUFBiIiI4EgF6Zg2bRqKi4uxcOFCFBYWIjo6Gunp6eKE7vz8fJ3/Zm7fvo3Zs2ejsLAQPj4+iImJwcGDBxEZGanUJRAR2RQmFkSkmBMnTuDatWtITExUOhQyU8nJyUhOTm7yvczMTJ3X7733Ht577712iIqIiJrCxILIzJi6/Enu3Pqdm6TvScudpKtw6+/XUMpkKDb9/YqLi8XPKCwsxPjx48XVkeWuieVORERE5o91B0TU7vLy8qDVajFu3DgxqSAiIiLLxsSCiNpVbm4uioqK4OHhoXQoREREZEJMLIio3Wg0Gri6uiI+Pp4jFURERFaGcyyIzIyxcyek77VkvoX+3Imm2sAChudiSDU1j6KBr68vjh8/jurqaowePVr2XG3ZNpeIiIjaFhMLImpzFy9eRHFxMe69916lQyGiNiZdi4KIbAsTCyJqU1euXEFkZCS6d+/O8iciIiIrxsSCyMy0pARIrizK0DH6+0lLo+RW1NZ/LdduNjg4GADwyy+/oKysDA4ODk0mFfoxyNHfj+VPRERE5oeTt4moTdTX16O2thZjx47lSAUREZEN4IgFEZlcVlYWfH19MWzYMKVDISIionbCxILIgrSkBEha4lRWViY+1y9jkr4nVV1drfPay8vL4OcdOXIEJSUl6Nu3b6Nj9RnqCmVoPyIiIjI/TCyIyGRu376NsLAw9OvXj+VPNqi6uhqCIMDNzQ0A8Ouvv2LTpk2IjIzE2LFjFY6OiIjaGudYEJFJZGVl4fjx4/D09GRSYaMefPBBfPHFFwCA0tJSxMXFYdmyZXjwwQfx4YcfKhwdERG1NY5YELVSSxZra8suR4Y6LUlLk/T3c3d3N+r80q5QDXGXlJSgqqoKI0aMgEajabT4ntz1GdsViixDTk4O3nvvPQDAhg0bEBAQgCNHjmDjxo1YuHAhnnnmGYUjJCKitsQRCyJqlZycHDg5OSE+Pp4jFTauqqoKHh4eAICdO3di6tSpsLOzw5AhQ/Drr78qHB0REbU1JhZE1GJZWVmoqqpChw4dlA6FzEDPnj2xefNmXLlyBTt27BDnVdy4cQOenp4KR0dERG2NiQURtUh9fT38/f0xfPhwjlQQAGDhwoV48cUXERoaitjYWAwdOhTAb6MXAwYMUDg6IiJqa5xjQdRKppgfYew8Dbn9DK2ULZ07IW0Vqz+/Qdpu1tDq2u7u7jhw4ABcXFwQExPTZJz6cyzINjz88MMYMWIErl+/jqioKHH7fffdhylTpigYGRERtQcmFkTULKdPn4ZGo8HAgQOVDoXMUGBgICoqKrBr1y6MHDkSrq6uGDx4MEe1qNm2bt0qPp80aZKCkRCRsVgKRURGO3/+PMLDwzlRm5p069Yt3HfffejduzcmTJiA69evAwBmzZqFefPmKRwdERG1NY5YELUhudIlY8ud9BlTdqVfCtVUe9jmfE5DWdPBgwehUqlY5kSy/vznP8PR0RH5+fno06ePuH3atGlISUnBsmXLFIyOrFFeXp7SIRCRBBMLIrqr2tpauLm5ITo6WulQyIzt3LkTO3bsQJcuXXS29+rVi+1miYhsABMLIpIlCAIOHDiAbt26Mamgu6qsrISbm1uj7SUlJXB2dlYgIiLTkY6OhIeHKxgJkfliYkFkpJassG1s6VFLyJU46a+gXVFRIT6XdnjSj0faMarh3D///DMcHR3RrVu3u8ag3z2KbE98fDy++OILvPHGGwAAlUoFrVaLd955B2PGjFE4OiIiamtMLIioEUEQUFJSgnvuuUcn4SAy5J133sF9992HX375BbW1tfjrX/+KU6dOoaSkBAcOHFA6PCIiamPsCkVEOgRBwP79+3Hx4sVGox9EhvTt2xdnz57FiBEj8OCDD6KyshJTp07FkSNHEBYWpnR4RETUxjhiQUQ6ioqK4OLigsGDBysdClkgLy8vvPzyy0qHQURECmBiQWSklqywLTevQv9cxraElb5XXV1t1Lmlow7SY/T3u3PnDn755Rf069cPw4cPb/Lc+ufgiAZJrV27Fu7u7njkkUd0tn/zzTeoqqrCzJkzFYqMiIjaA0uhiAiCIODgwYNwcHCAi4uL0uGQhUpNTYWfn1+j7f7+/li8eLECERERUXviiAWRjRMEAXV1dejWrVuj9QeImiM/Px/du3dvtL1bt27Iz89XICIiImpPFjNicfnyZcyaNQvdu3eHq6srwsLCsGjRokarDBOZE3t7+yYf+pycnMSHRqMRH9Lt+u/JHa//WRUVFeLD1dVVfNjb28POzg4//vgjLl68iG7duonHGIqhJeTiJuvi7++P48ePN9p+7NgxdOzYUYGIiIioPVnMiMWZM2eg1Wrx0UcfoWfPnjh58iRmz56NyspKvPvuu0qHR2SRjh07Bi8vL9xzzz1M0qnVHnvsMTz//PPw8PDAyJEjAQB79+7F3Llz8fvf/17h6IiIqK1ZTGIxbtw4jBs3Tnzdo0cP5OXl4cMPP2RiQdRMgiDg1KlT6N+/P+zsLGbgkszcG2+8gcuXL+O+++6Dg8NvtxetVosZM2ZwjgURkQ2wmMSiKWVlZfD19VU6DLIiLVld21B5j1yHJ0Pnlu6nP4og15HJ2Biqq6shCAL27t2Ljh07QhAE8VjpQnjS1br1zy33uYauqSUdtcjyODk5IS0tDW+88QaOHTsGV1dX9OvXT3bldiIisi4Wm1icP38eK1euvOtohVqthlqtFl+Xl5e3dWhEZksQBNTU1CAgIAB9+/ZVOhyyUr1790bv3r2VDoOIiNqZ4onF/Pnz8fbbbxvcJzc3FxEREeLrgoICjBs3Do888ghmz55t8NjU1FT8/e9/N0msRJZMEAT88MMP6NevH/r06aN0OGSFNBoN1q1bh4yMDNy4cQNarVbn/T179igUGRERtQfFE4t58+bhySefNLhPjx49xOfXrl3DmDFjMGzYMHz88cd3Pf+CBQuQkpIivi4vL0dISEiL4yXr1pKSHWPLmqT0F7eTdlsytACdq6ur+LykpKTJc0v3kcaXmZmJLl26iO1ADZVZSeMxtsSpJWVkZF3mzp2LdevW4YEHHkDfvn2hUqlafc7Vq1dj6dKlKCwsRFRUFFauXInY2Ni7Hrd+/Xo89thjePDBB7F58+ZWx0FERHeneGLRqVMndOrUyah9CwoKMGbMGMTExGDt2rVGTTp1dnaGs7Nza8MksliCIODmzZuIjY1ly09qU+vXr8d//vMfTJgwwSTnS0tLQ0pKCtasWYO4uDisWLECiYmJyMvLg7+/v+xxly9fxosvvoj4+HiTxEHK27p1q/h80qRJCkZCRIZYTDuYgoICjB49Gl27dsW7776L4uJiFBYWorCwUOnQiMyWIAjYvXs3CgsL4ebmpnQ4ZOWcnJzQs2dPk51v+fLlmD17NpKSkhAZGYk1a9bAzc0Nn332mewxGo0G06dPx9///ned0W4iImp7FpNY7Nq1C+fPn0dGRga6dOmCzp07iw8ialpBQQECAwPRr18/pUMhGzBv3jz84x//gCAIrT5XbW0tsrOzkZCQIG6zs7NDQkICDh06JHvc66+/Dn9/f8yaNcuoz1Gr1SgvL9d5EBFRyyheCmWsJ5988q5zMYjaS2vnE+gfI53vYGh1a+nnyrV91Wg0EAQBBw4cQFxcHLp06dLkufTnWEjPZ+q5JmQb9u/fjx9++AHff/897rnnHjg6Ouq8/+233xp9rps3b0Kj0SAgIEBne0BAAM6cOSP7+f/85z9x9OhRoz+HDT6IiEzHYhILIjJOQ/lTcHBwo1/siNqSt7c3pkyZoshn37lzB0888QQ++eQT+Pn5GX0cG3wQEZkOEwsiK6LValFbW4u+ffuyTJDa3dq1a012Lj8/P9jb26OoqEhne1FREQIDAxvtf+HCBVy+fFlnYm9Du1sHBwfk5eUhLCys0XFs8EFEZDpMLIhaydBK2dLyILnWrPrvSUuhysrKZPfTL3/SarXIzMxEZGSkzgRaaftZuVIq/XNLGYqVSF99fT0yMzNx4cIFPP744/Dw8MC1a9fg6enZ6L85Q5ycnBATE4OMjAxMnjwZwG+JQkZGBpKTkxvtHxERgRMnTuhse+WVV3Dnzh384x//4CgEEVE7YGJBZCWOHz+OLl26mLQrD1Fz/Prrrxg3bhzy8/OhVqtx//33w8PDA2+//TbUajXWrFnTrPOlpKRg5syZGDRoEGJjY7FixQpUVlYiKSkJADBjxgwEBwcjNTUVLi4ujVaT9/b2BgCuMt8OpO1gich2MbEgsnBarRa5ubmIiooyyYJkRC01d+5cDBo0CMeOHdNZM2XKlCmYPXt2s883bdo0FBcXY+HChSgsLER0dDTS09PFCd35+flGrWdERETtg4kFUQu0thzI0MrbUl5eXjqvpaVWtbW10Gq12LNnD3r06CGuU6FfuiS3oraxWtrBimzPvn37cPDgwUb/XYSGhqKgoKBF50xOTm6y9An4bTV5Q9atW9eizyQiopZhYkFkoQRBQHV1NcLCwhAeHq50OETQarWNElsAuHr1Kjw8PBSIiIiI2hPHkIkskFarxY4dO1BXV8c5FWQ2xo4dixUrVoivVSoVKioqsGjRIkyYMEG5wIiIqF1wxIIsTmsXp2vJ5+h/ln5HJrl4pCUh0v2knZr0j5OWLlVUVDQZ2+7du9GrVy+xjl16Pv3OVNIYDP28jP25svyJ5CxbtgyJiYmIjIxETU0NHn/8cZw7dw5+fn7497//rXR4RETUxphYEFkQjUaDW7duYcSIEejQoYPS4RDp6NKlC44dO4b169fj+PHjqKiowKxZszB9+vRGyTQREVkfJhZEFkKj0WDHjh3o3bs3/P39lQ6HqEkODg74wx/+oHQYRESkACYWRBbiypUr6N27N+dUkNn64osvDL4/Y8aMdoqEiIiU0KrE4rHHHsNHH30ET09P/Pe//4VarcYjjzxiqtiIRE11mmlr+vMM5FbYlpZ46LeRlWv1auh6pOerqKiARqPBgQMHMHz4cNlVtA3NjzB2HgpX1KbWmjt3rs7ruro6VFVVwcnJCW5ubkwsiIisXKu6Qp06dQqenp44ffo0/va3vyEzMxPPPfecqWIjsnkajQY7d+5Ely5d+Is/mb3bt2/rPCoqKpCXl4cRI0Zw8jYRkQ1o1YiFo6MjBEHA2rVrsWDBAkyfPh0xMTGmio3Ipmk0Gmg0GgwaNAidOnVSOhyiFunVqxeWLFmCP/zhDzhz5ozS4RARURtqVWLxzDPPYODAgSgtLcVrr70GAKisrDRFXEQ6WvvXelO3qJWWNUnLogyVIUlbx+rvV1ZWpvOeRqPB7t27ERMTg5CQkCY/V3pN0pIrQ6t1y12DIYba7hIZw8HBAdeuXVM6DLISW7duFZ/37t1bwUiISF+rEos//vGPePjhh+Hg4IAOHTrg/PnzGDJkiKliI7JZR44cQUREhE5SQWTu/vvf/+q8FgQB169fx6pVqzB8+HCFoiJrU1paqnQIRCSjVYnF2bNn8e677+LmzZvo378/nnvuOaxbt85EoRHZnvr6euTl5SEmJgYqlUrpcIiaZfLkyTqvVSoVOnXqhHvvvRfLli1TJigiImo3rUospk6dirlz5yI6Oho5OTkYP348lixZgnvvvddU8REZZGwZkpShjkzGlkzJlRfpk5Yoya3c3bCfRqPBvn37MHDgQDg7OzcZg1x87u7usjG0dqVslj6RsbRardIhEBGRglqVWLi4uGD27NkAgMGDB2PKlCm4//77cezYMZMER2QrBEFAdXU1evfujdDQUKXDISIiImq2FiUWzz//PKKjozFmzBisWrUKycnJAICOHTvCzq5VHWyJbE59fT327t2L2NhYBAUFKR0OUYulpKQYve/y5cvbMBIiIlJCixKLcePG4fjx4ygoKMD333+P9957D3369MGFCxcwceJEU8dIZNV27dqF3r17w83NTelQiFrlyJEjOHLkCOrq6hAeHg7gt7l49vb2GDhwoLgf5w8REVmnFiUWEyZMwIQJE8TXtbW1OH36NI4dO4YTJ06YLDiiu2lJy1Rj5wzor6ItXfXa0NwOKbkVujUaDerq6lBSUoLRo0frvCc9n6FzG7MSuKFzsI0smdqkSZPg4eGBzz//HD4+PgB+WzQvKSkJ8fHxmDdvnsIREplGXl6e+LwhiSaiVs6xqKurw1dffYXi4mJERkbiiSeeYCkUkRHq6uqwY8cOREVFtXpyNZG5WLZsGXbu3CkmFQDg4+ODN998E2PHjmViQURk5VqVBfz+97/HL7/8AldXV3z33XcYOHAgzp49a6rYiKxWfn4+oqOjuU4FWZXy8nIUFxc32l5cXIw7d+4oEBEREbWnVo1YXLx4ERs3bhRfHz16FH/84x/x448/tjowsmymXum6tYyNQbqf/kiCXOtY6X7S1bUB3VWwq6urUVdXh3379mHYsGGws7MTf07GrKgN6JY5taQ0S8oc/l3IukyZMgVJSUlYtmwZYmNjAQA///wz/vKXv2Dq1KkKR0dERG2tVYmFh4cHzp8/j549ewIAoqOjcfv2bZMERmRt6urqsH37dsTExLBkkKzSmjVr8OKLL+Lxxx9HXV0dAMDBwQGzZs3C0qVLFY6OiIjaWqsSi1WrVuHBBx/EhAkTEBkZidzcXHTr1s1UsRFZjdraWmi1WowYMQIdO3Y0eoE9Ikvi5uaGDz74AEuXLsWFCxcAAGFhYejQoYPCkZG1ysrKEp83jJIRkXKalVhcuXJFpya8f//+yMnJwebNm5Gbm4uwsDC89tprpo6RLFBbdiKSWzlb/1xy5UGG9pOWHul3V5K+LisrE5/rlz9JlZSUoLa2FhkZGYiKioKfnx/Kysrg6+sre4z0c/TLsaSxSp+bYgK4uZWvkeW6fv06rl+/jpEjR8LV1RWCILDFLBGRDWhWYhEREYF58+Zh/vz5Ys99Z2dnTJs2rU2CI7IGR44cwYABAwwmE0TW4NatW3j00Ufxww8/QKVS4dy5c+jRowdmzZoFHx8fLFu2TOkQiYioDTWr0HvXrl3YsWMHevXqhXXr1rVRSETWoWF9l9jYWAQGBiodDlGb+/Of/wxHR0fk5+frLPg4bdo0pKenKxgZERG1h2aNWAwbNgw///wzvvjiC7z88stYuXIlVqxYgfj4+LaKj6yMsSU2hkqm5EqhjFVSUqLzWlpGJLdQHaBbeiRXNtRwLrVajT179mDYsGHw8PBo9Ln655bGYOhajVk8z1AnKUNa8m/DkimS2rlzJ3bs2IEuXbrobO/Vqxd+/fVXhaIiIqL20qLWNDNmzEBeXh4eeOABjB8/Hg8//DAuXbpk6tiILJJWq0V1dTWGDBmCoKAgpcMhajeVlZU6IxUNSkpK4OzsrEBERETUnlrV83Ls2LH44x//iE2bNiEyMhJ//etfDU5kJbJ2arUa//3vf+Hi4oLOnTsrHQ5Ru4qPj8cXX3whvlapVNBqtXjnnXcwZswYBSMjIqL20KxSqDVr1uDw4cM4fPgwcnNzYWdnh759++Lpp59GVFQU1q9fj8jISHz77bcYNGhQW8VMZJYEQcCOHTswZMgQuLi4KB0OUbt75513cN999+GXX35BbW0t/vrXv+LUqVMoKSnBgQMHlA6PiIjaWLMSi7feegtxcXGYMWMGhgwZgpiYGJ367T/96U9YvHgxnnzySZw8edLkwZLlMLYlrBxD+8nV+OuvDdGSuQDSNrKG5ljor5StVqtRVlaGkSNHwsHBQRy5k8bQqVMn8bn+yJ60Y5Sxccvtpz+nQm6/lrb+5bwKktO3b1+cPXsWq1atgoeHByoqKjB16lTMmTOHI3hERDag2etY3M2sWbPw6quvtjggIktTU1ODnTt3YsiQIXBwaNWak0QWz8vLCy+//LLSYRARkQJaNceiKf7+/tizZ4+pT0tktq5cuYIhQ4bA399f6VCIFJWeno79+/eLr1evXo3o6Gg8/vjjuH37toKRERFRezD5n1dVKhVGjRpl6tOShTF25W1jSY+TPpeWJOm3WZVrzapfKlRcXNzk+fRLq/SPq6mpwcGDBzFmzBhxVWFDZUjS+Ly8vHT2k36WofawxpQ1taR8isgU/vKXv+Dtt98GAJw4cQIpKSmYN28efvjhB6SkpGDt2rUKR0hERG2JdRtELaBWq5Geno7hw4eLSQWRrbt06RIiIyMBABs3bsSkSZOwePFi5OTkYMKECQpHR0REbY2JBVEz1dTUwM7ODmPGjGk08kBky5ycnFBVVQUA2L17N2bMmAHgt+YE5eXlSoZGNiArK0t8Hhsbq2AkRLaLiQWZjDFlOsauJK1fhmSolKmBu7u7zmtp5yW5cidAt1tTQUGB7Pmqq6tRU1ODPXv2IDExUTxOek2Gypik1yTtPqUfg6FypZaUP3FFbWovI0aMQEpKCoYPH46srCykpaUBAM6ePdtoNW5jrV69GkuXLkVhYSGioqKwcuVK2V8av/32WyxevBjnz59HXV0devXqhXnz5uGJJ55o8TUREZHxTD55m8iaHTt2DHFxcTrtYYnoN6tWrYKDgwM2bNiADz/8EMHBwQCA77//HuPGjWv2+dLS0pCSkoJFixYhJycHUVFRSExMxI0bN5rc39fXFy+//DIOHTqE48ePIykpCUlJSdixY0errovIkLy8PPFBZOtUgiAISgfRnsrLy+Hl5YWysjJ4enoqHY5Vaa8RC2NJRyykz/VHLKQjE3IjFtXV1bh48SIiIiIA6E6+bsmIhf5Ec2NHLKRMPcLAEQvbZa7fi3FxcRg8eDBWrVoFANBqtQgJCcFzzz2H+fPnG3WOgQMH4oEHHsAbb7xh1P7m+rMwd1u3bm23zyotLb3rPkqVQoWHhyvyuURtqTnfixyxILqL6upqZGRkICAgQOlQiGxGbW0tsrOzkZCQIG6zs7NDQkICDh06dNfjBUFARkYG8vLyMHLkyLYMlYiI/g/nWFCzGFv/byzpSIKhv/br/4X/btsB+ZES/dGQkpIS8bl0lMLJyQkajQYajQajRo1Cx44dmzxHS1b/lo5Q6FNqBWyOUpA5uXnzJjQaTaOEPiAgAGfOnJE9rqysDMHBwVCr1bC3t8cHH3yA+++/X3Z/tVoNtVotvuYkcyKiluOIBZGMqqoqbN26Fe7u7jpJBRGZLw8PDxw9ehSHDx/GW2+9hZSUFGRmZsrun5qaCi8vL/EREhLSfsESEVkZjlgQNUGr1WL37t0YOXJkozkZRPQ/x48fR9++fWFnZ9q/U/n5+cHe3h5FRUU624uKihAYGCh7nJ2dHXr27AkAiI6ORm5uLlJTUzF69Ogm91+wYAFSUlLE1+Xl5UwujNSe8yqIyDJYZGKhVqsRFxeHY8eO4ciRI4iOjlY6JJtkaBVtufIg/XIbafmTtKxJfz9pe1bpMdJf+qUtZQHodG6SK3fS36+iogJVVVWorKxEQkICHBwcxPilnyt3Tfo/E/3PkttPWhJmaG2M1q68TWRqAwYMwPXr1+Hv748ePXrg8OHDJhnhc3JyQkxMDDIyMjB58mQAvyX8GRkZSE5ONvo8Wq1Wp9RJn7OzM5ydnVsbLhERwUJLof76178iKChI6TDIClVWViIjIwOOjo5wcLDIvJuoXXl7e+PSpUsAgMuXL0Or1Zrs3CkpKfjkk0/w+eefIzc3F8888wwqKyuRlJQEAJgxYwYWLFgg7p+amopdu3bh4sWLyM3NxbJly/Dll1/iD3/4g8liIiIieRb3m9P333+PnTt3YuPGjfj++++VDoesTEFBAeLj4+Ht7a10KEQW4aGHHsKoUaPQuXNnqFQqDBo0SHbU7OLFi80697Rp01BcXIyFCxeisLAQ0dHRSE9PFyd05+fn65RgVVZW4tlnn8XVq1fh6uqKiIgI/Otf/8K0adNafoFERGQ0i0osioqKMHv2bGzevBlubm5Kh2Mz5MpsDK01IVcmpd/FSVpeJC0H0u+apL9SdQPpuhP6JUTSz5Lu17VrV539SkpKUFlZiWPHjqF///7QarUoKSlpFIP0fNLSKul++r9QyXWj0i+Rau08DpY/kVI+/vhjTJ06FefPn8fzzz+P2bNnw8PDw2TnT05Oli190p+U/eabb+LNN9802WcTEVHzWExiIQgCnnzySTz99NMYNGgQLl++bNRxbCVId1NdXY19+/Zh2LBhSodCZJEaVtXOzs7G3LlzTZpYEBGR5VB8jsX8+fOhUqkMPs6cOYOVK1fizp07OvW0xmArQTKkuroaDg4OiI+P5yq7RK20du1aMam4evUqrl69qnBERETUnlSCIAhKBlBcXIxbt24Z3KdHjx549NFHsXXrVqhUKnG7RqOBvb09pk+fjs8//7zJY5sasQgJCTFqWXJbpV/GJC3hkZYu6e8nLceRljVJGSqFkp7P0H7SsiZpSZJ+idOJEyfE59LOYefPnwcA1NTU4MyZM4iPj0eHDh0afY5+aZUxJWH6i/xJS5ykxxgqmTKkJSVP7BhFd1NeXg4vL69Wfy9qtVq8+eabWLZsmfgd4OHhgXnz5uHll182eUvatmCqn4UtUKrdbGlp6V33iY2NbftAmhAeHq7I5xK1peZ8LypeCtWpUyeDqxA3eP/993VqZ69du4bExESkpaUhLi5O9ji2EiQ5V65cQXh4uJhUEFHrvPzyy/jnP/+JJUuWYPjw4QCA/fv347XXXkNNTQ3eeusthSMkIqK2pHhiYSz9v0Y3TH4NCwtDly5dlAiJLFRNTQ1KSkrQq1cvpUMhsiqff/45Pv30U/zud78Tt/Xv3x/BwcF49tlnmVhQu8nKyhKfKzV6QWSLzH9cmsiE7ty5gzNnzsDHx0fpUIisTklJCSIiIhptj4iI0ClbJCIi62QxIxb6QkNDofD0EKtlaHVs6XwCQ3Ms5Fam1p+DID2HXEtZ/fek5zbUprVnz546x2g0GlRVVWHYsGE65U9ybWD1r0/6Wvq50mvSvz5jVyCXO7c+Y+Zi6J+b8yqovURFRWHVqlV4//33dbavWrUKUVFRCkVFRETtxWITC6LmqKiowKFDh3Dvvfc2Wn+DiEzjnXfewQMPPIDdu3dj6NChAIBDhw7hypUr2L59u8LRERFRW2MpFFk9jUaDQ4cOYejQofzrPVEbGjVqFM6ePYspU6agtLQUpaWlmDp1KvLy8hAfH690eERE1MY4YkEA5FeIBuTLefRLduRKiqStZ4uLi2VjkB6fn5+v855c6dGlS5eavAYAKCwshFqthlarxbBhw2BnZ4fq6upGtd6BgYHic2mHMv39pO1npe1wfX19m7wG/dfSa9CPVe49ljWRpQkKCuIkbSIiG8URC7JaarUaV69ehb29vUX0zyciIiKyZPxti6xWZWUlQkJCDE6GJiIiIiLTYCmUDZMr0zFU4iRXFgXolg5Jy4akpVCGukJJy4v09yssLGwyBmkZU3BwMIDfOkidPn0a3bt3b/Lc0tIl/RikpVr6Pwe5MiRjS5eMLWNiuRMRERFZIo5YkFWpqKjAwYMH0b9/f6VDISIiIrIpHLEgq1FRUQFnZ2eMHj260YgHEbWvmzdv4ueff4ZGo8HgwYPRuXNnpUMiIqI2xsTCShgqx2ktaRmRtDxIuh3QLV+Sli5J99M/RloyJT3G2M5UDc+rq6uRlZUFX19fcV/pMQ099QHDi8xJu1lJnxvaz9DidsYsaEdkbTZu3IhZs2ahd+/eqKurQ15eHlavXo2kpCSlQyMiojbExIKsQlFRkU5SQUTtp6KiQifZ/vvf/46srCz07t0bALBt2zbMnj2biQVZvby8PPF5eHi4gpEQKYNzLMiiVVdXo7i4GKGhoUwqiBQSExODLVu2iK8dHBxw48YN8XVRURG7sxER2QCOWJDFUqvVKCoqQs+ePZUOhcim7dixA3PmzMG6deuwevVq/OMf/8C0adOg0WhQX18POzs7rFu3TukwyUZlZWWJz2NjYxWMhMj6MbGwcoZq/OVWe9af3yAlfU9/voTcXyQNtZGVDhtLjy8rK9PZTzoX4/Tp0xAEAQAQFRUFOzs7aDQaREZG6hwj125W//rk5khI2+TqxyDXgteQtpwHQ6Sk0NBQbNu2Df/+978xatQoPP/88zh//jzOnz8PjUaDiIgIuLi4KB0mERG1MZZCkcVpSCoAwNHRUcFIiEjqsccew+HDh3Hs2DGMHj0aWq0W0dHRTCqIiGwERyzIokj/6q9SqRSMhIiktm/fjtzcXERFReHTTz/F3r17MX36dIwfPx6vv/46W0ATEdkAJhZWQlpaI1f+pF9+Iy3nkZYeGVpx+vz5800eA/xv5Wv9GKTP8/PzZWM4ceKE+FxadtQQU01NDYDfJoo2JBXS4/V/cZHGKl2hW3/lbf3PkjufHENlTSx5Ilswb948/Otf/8KYMWPwwQcf4Mknn8Srr76KnJwcvPHGGxgwYADee+89jB8/XulQiYioDbEUiixCTU0NCgsL4eDgwJEKIjOzbt06bN++HevXr8fhw4fx5ZdfAvjtDwJvvPEGvv32WyxevFjhKImIqK0xsSCzJwgCqqur0aVLFzg4cJCNyNx06NABly5dAgBcuXKl0ZyKyMhI7Nu3T4nQiIioHfG3NCskV36jXyIl3U+uQxTQuDtSA/2SIrnSI6muXbvqvD59+rT4XNo2tiG2mpoalJWVQa1WQ61WAwCio6PF/UpKSsTn+qVL0s+SXquhkjBDpUvSn4v0s+TKvvTPx65QZK1SU1MxY8YMPP/886iqqsLnn3+udEhERKQAJhZkttRqNW7cuIHg4GCdBIKIzMv06dMxbtw4XLx4Eb169YK3t7fSIRERkQKYWJBZUqvVcHBwQHBwMP+6T2QBOnbsiI4dOyodBlmp0tJSpUMgIiNwjgWZnZqaGty4cQMAS4aIiIiILAVHLKyQ3Crahlaclj4vLi7W2U96nLRdrKG2tNK5E9LzFRQU6BwjXR0b+G2idmVlJaqrq3VW5XZ3d2/y3NLt+tdXWFgoPpfOB9GfM9KpU6cmr8nU8yUMtQRmAkVERESWjiMWZDbq6+tRW1urkywQERERkWXgiAWZhbq6OlRXVzOpICKiNpOVlSU+j42NbdPPko66h4eHt+lnEZkLJhZWSK61qn47VrmVt/X3k5Y/SVfX1l9FW1pGJNeiNjIyUud1Q+97AHB0dBQn6EnLk/SPk8YtXTVbWvoE6LavlV6ToRIuQyVO1dXVTZ6vJUxR+sT2tURERGROWApFilKpVOIvxVxRm4iIiMhyMbEgxWi1WtjZ2TWayExEREREloelUFZIrgxJ/xd4aYcmaWmPdAVtQHd160OHDonPpWVMgG65kjQGaZmV/mrd0vfkYgN0S6Ok8zCkZU36HabkyoP0y5jkumPpHy89Tr8DVVPxNIdccmWoxInlT0RERGROOGJBimDZExEZY/Xq1QgNDYWLiwvi4uJ0Jt/q++STTxAfHw8fHx/4+PggISHB4P5ERGRaTCxIEYIgKB0CEZm5tLQ0pKSkYNGiRcjJyUFUVBQSExPFBTT1ZWZm4rHHHsMPP/yAQ4cOISQkBGPHjm00AkpERG1DJdjYb3jl5eXw8vJCWVkZPD09lQ6nxfRLZ+RKeKTb9cuOpAvXSfc7evSozn5yN+X9+/frvJaWIkljaPhcZ2dndO7cWWe0IjAwsMnP6devn865pd2opOVU0muSnks/BkNdoeQWxdP/GUv3kytDMlSeZGguCcuaSEnm+r0YFxeHwYMHY9WqVQB+m5cVEhKC5557DvPnz7/r8RqNBj4+Pli1ahVmzJhh1Gea68/CXGzdulWRz23oGGhKbd1uVortZsmSNed7kSMW1C6cnJx0WsMSERlSW1uL7OxsJCQkiNvs7OyQkJCgM9fLkKqqKtTV1TWa2yWlVqtRXl6u8yAiopZhYkFtztHREXV1dSguLubcCiIyys2bN6HRaBAQEKCzPSAgoNGaNXJeeuklBAUF6SQn+lJTU+Hl5SU+QkJCWhU3EZEtY2JBbcrBwQE+Pj4AOK+CiNrPkiVLsH79emzatAkuLi6y+y1YsABlZWXi48qVK+0YJRGRdWG7WQul3+5UOodAukK0tO2r/lwJaRvZEydONLld/9zSDiv68wKk5294r2HeQ4cOHZo8t1y7WP1z5+Xlic9HjBiBpugfI30tLcPSb8fbkra0xhzf0v2ICPDz84O9vT2Kiop0thcVFTWaT6Xv3XffxZIlS7B7927079/f4L7Ozs5wdnZudbxERMQRC2ojHTp0gKenp9ElC0REUk5OToiJiUFGRoa4TavVIiMjA0OHDpU97p133sEbb7yB9PR0DBo0qD1CJSKi/8MRCzI5d3d3dOzYkSUFRNQqKSkpmDlzJgYNGoTY2FisWLEClZWVSEpKAgDMmDEDwcHBSE1NBQC8/fbbWLhwIb7++muEhoaKf9hwd3fXWViTiIjaBhMLCyItxdFvmSotjZJ7rn+MtCRI7hhAt3xJWlIkLU8Cfit7srOzQ319Pa5duwY7O7tGccfExDQ6poG09Ei/7EjablaqZ8+eTW4H5NvuGvrZ6Zc/yZ2PiNretGnTUFxcjIULF6KwsBDR0dFIT08XJ3Tn5+eL3zMA8OGHH6K2thYPP/ywznkWLVqE1157rT1DJyKySUwsyGQ8PDzg4+OD/Pz8Rr+8ExG1RHJyMpKTk5t8LzMzU+f15cuX2z4gIiKSxTkWZBJOTk7w9fVl+RMRERGRjeKIhZmTlulIS3H0y5WkIwTS0iVphyj9rlD5+fnic+kq3Pq1yNLFqE6fPi0+b1hJ1NfXF1VVVfj111/F96QrYksXp5J2nwJ0S4+k16cfg/71NpBen34Zk1yJk/5oilzJlCFyx7BcioiIiGwVEwtqFT8/P3Tu3BknT56Eh4eH0uEQEREZRdo+PTY2VsFIiKwHS6GoVRwdHXHy5EkufkdERERk4zhiYebkJkHrb5eWHklJS5z0y3QuXbokPpd2Z9q1a5fOftLyp06dOgEAgoKC4OLign379onvyS1w17VrV/G5tKuUfnzScqWGMqsG0rImaYco6XXrl0LJ/ez0fw6GOme1FsukiIiIyFZwxIKarVOnTujatStycnKUDoWIiIiIzAQTC2oWX19f3L59G1lZWdBqtUqHQ0RERERmgokFGa1Hjx7o3bs3NBoNkwoiIiIi0mFxcyy2bduG119/HcePH4eLiwtGjRqFzZs3Kx1Wqxhbhy/dT78tqnR+QWFhYZP7SeczALrzHZYsWSIbg6+vL+zs7BAaGop169aJScW0adN09pPOVZDOt5DGJp3LAei2lZXGI20j29RxTcVq7M9On3RehVx7X0PnN/S5nFdBREREtsKiEouNGzdi9uzZWLx4Me69917U19fj5MmTSodl9UJCQlBfX4+jR49ypIKIiKiZ8vLyxOf6zUmIrInFJBb19fWYO3culi5dilmzZonbIyMjFYzK+oWFhSE4OBg///yz0qEQERERkRmzmMQiJycHBQUFsLOzw4ABA1BYWIjo6GgsXboUffv2VTq8ZpMrfzJUsiN9r6KiQuc9aRmRXGvW7OxsnWOk55Du11B25ODgACcnJ3z77bfiOhUjRoyQjU96Dmk8/fr1E59LVwXXj1V6jH7ZVkObW0C3TMrYlbKNZep2s0RERES2wmImb1+8eBEA8Nprr+GVV17Bd999Bx8fH4wePbrRL6tSarUa5eXlOg+6Oz8/P3Tr1g1VVVVc/I6IiIiI7krxxGL+/PlQqVQGH2fOnBFr+19++WU89NBDiImJwdq1a6FSqfDNN9/Inj81NRVeXl7iIyQkpL0uzWK5uLjA29sbFy5cUDoUIiKyUaWlpeKDiCyD4qVQ8+bNw5NPPmlwnx49euD69esAdOdUODs7o0ePHsjPz5c9dsGCBUhJSRFfl5eXm3VyYWhVaOl70m5KgPwK1NJSIf1jpOdrKH/q2LEjvL29odFoxM5O0hIluS5OwG/doxpIy6KkZU3S7frXJyXtKqV/HYZ+DsZgpyYiIpLKysoSn8fGxioYCZFlUzyx6NSpk079vJyYmBg4OzsjLy9PrPOvq6vD5cuX0a1bN9njnJ2d4ezsbLJ4rVmnTp3g5eVl8nkLRERERGT9FE8sjOXp6Ymnn34aixYtQkhICLp164alS5cCAB555BGFo7Me58+fbzRaQERERKbB1rNkzSwmsQCApUuXwsHBAU888QSqq6sRFxeHPXv2wMfHR+nQLFpdXR2Cg4NRUFCgdChEREREZKEsKrFwdHTEu+++i3fffVfpUNqMfhmSdD6A3HwEQHdehXSug3QV7q5du+oc4+TkhJKSEpSUlCAsLAw9e/YEAJw+fVpnP2nXLWnZWsP+TX2udM6HdC6GNE79mKRtZPX3k/5c5OaQGNsq1tDPuCX7EREREZGFJRZkWuXl5fDy8oKPj4/Blr1ERERERHfDxMJGFRcXo6amBh4eHlCpVEqHQ0REREQWjomFQuRW225puY1cC1Zp2VBDSZJGo8HNmzfRsWNHccFAaRmTtKUvoNt679KlS+Jz/dWxpZPQpOeTljjplytJ3zNU9iU9n9zPS381crlWtPo/Y7kSLJY+ERERERlP8QXyqH0VFBSgvLwcYWFhHKkgIiIiIpNhYmFDCgoKcOfOHXh7eysdChERERFZGZZCtSFDJU5yK2q3lLQLk7QkqOHc1dXV8PLyQlBQkDhSIS0vkj7Xn8gtvY7o6GjZ/aQdqKTdo6TPpZ+jf24p/f2k1yTXfUq/k5SUoZ+xXJcplkIREQFbt25VOgQishBMLGzAmTNnUFlZicDAQKVDISIiIiIrxVIoK3f79m3cuXMHAwcOVDoUIiIiIrJiHLFoQ4ZKaeQWc5MrDdKn3zWpqUXoTpw4AX9/fwwfPhxA4y5J0hIguVIq/Vil5U/6sUq7R0k7Rkk/V/+6pZ9laERFeg65LlPG/uwMYfkTERERUcswsbBSOTk5KC8vR0hIiNKhEBERWYysrCzxufQPZkR0d0wsrJBWq4WbmxsGDBggrlNBRERERNSWmFhYmZ9//hl2dnaIiopSOhQiIiIisiFMLMyMfo2/XPtT/daqtbW1yM3NxZ07dzB69GixpayhY6Tnlj4PDg7W2U86D0LaUjYmJkZnP+l70jkR0vaw+nNDpK1o9a9HSq6VrLFzItqyjSxb1BIRUUvk5eWJz8PDwxWMhMg0mFhYicuXL6Nnz56IiIjgitpERERE1O7YbtYKHDp0CFevXoWDgwOTCiIiIiJSBEcs2ol+K1RjS2bk9msoT6qpqUFdXR2GDx9uVPmTHGkbWf22tNL3unbt2iiGBtKyJunn6p9PStouVvpc2lIW0L0m6XNpyZRcC1/9Y0yN5U9ERNaJHaKImocjFhYsKysLZWVlGDx4MEcqiMgqrV69GqGhoXBxcUFcXJzOL3r6Tp06hYceegihoaFQqVRYsWJF+wVKJlFaWio+iMjyMLGwUIcPH4ZGo4G/v7/SoRARtYm0tDSkpKRg0aJFyMnJQVRUFBITE3Hjxo0m96+qqkKPHj2wZMkSgwtuEhFR22ApVBsytluQoRWjmzqurKwMffv21em2JD2HdBVtaRmSfqclaSmTXHcmAOjevXuTn6Mfm/T80vekZU36ZVFyPxf97dJzSMuspPu1tNyMiMzT8uXLMXv2bCQlJQEA1qxZg23btuGzzz7D/PnzG+0/ePBgDB48GACafJ+IiNoWRywszI8//oiTJ0/qJBVERNamtrYW2dnZSEhIELfZ2dkhISEBhw4dUjAyIiKSwxELC3LlyhWoVCoMHz7c4CgHEZGlu3nzJjQaDQICAnS2BwQE4MyZMyb7HLVaDbVaLb4uLy832bmJiGwNRywsgCAI+Omnn+Dv74/4+HilwyEishqpqanw8vISHyEhIUqHRDYqLy9PfBBZKo5YKERu1Wv9eQGCIOCHH36Ao6MjHBwcxH31W6tK5zfIrXRtaOVt6RyL/Px8o84tbUOrH5N0v4KCgiY/Rz8GKWPnpBiaY8EVsYksl5+fH+zt7VFUVKSzvaioyKQTsxcsWICUlBTxdXl5OZMLIqIW4oiFGRMEARqNBkFBQRypICKb4uTkhJiYGGRkZIjbtFotMjIyMHToUJN9jrOzMzw9PXUeRETUMhyxMFMNIxWdO3dG3759lQ6HiKjdpaSkYObMmRg0aBBiY2OxYsUKVFZWil2iZsyYgeDgYKSmpgL4bXT19OnT4vOCggIcPXoU7u7u6Nmzp2LXQdRc0nKo8PBwBSMhah4mFm1IboVo/fekJUQN+2VnZ8PZ2Rl9+vQRS3paslq39NyGSpek5UqG2tJKj9H/spO2uZWStqs1tkWt/n7GTFZnuRORdZk2bRqKi4uxcOFCFBYWIjo6Gunp6eKE7vz8fNjZ/W/g/dq1axgwYID4+t1338W7776LUaNGITMzs73DJyKyOUwszIwgCDh//jyioqLg4MB/HiKybcnJyUhOTm7yPf1kITQ0FIIgtENUZIukq77HxsYqGAmR+eIcCzPSUP50+/ZtJhVEREREZFH422s70S/Taapsp7KyEr6+voiJiTHqHHL0S5ka6HeFkiuTkpYuAfKrXkvLpwDodGqRli5J49HvZiV3TfqlT/rHEREREZF5YWJhBgRBwK5duzBw4EDZpIKIiKi9bN26VekQiMgCsRTKDOzevRteXl7w8/NTOhQiIiIiohbhiIWJyS3K1lTJjyAIKC0txeDBg+Ht7S27393ODeiWCklLl+T20d9PWsakX+Lk5eXV5DH6pVVyC+G5u7vLxt2SRezkjjHUeYsdo4iIyFQ4kZuoaRyxUIggCEhPT8eFCxfEpIKIiIiIyFJxxEIhFy5cgJ+fHwYNGqR0KERERGSmuFgeWRKOWLQzQRDw448/IjQ0FIMHD1Y6HCIiIiIik+CIRTsSBAHbt29HQEBAi9apkM4T0G/HereVvJsinSMhXTXb19dX9tz68yqkpHMppM+l8zIMtZs1dr6F3DFsSUtERESkHCYW7UQQBNTX1yMiIgJhYWFKh0NEREQmwIncRP/DUqh2IAgCtm3bhsuXLzOpICIiIiKrxBELE2uqhGf//v0IDg5Gr1697nq8oRInY4+TKw/SL4uSljVJS5ekq3DrxyAtk9JvayvdT/qeqdu+tqRFLRERERG1LSYWbUgQBJw5cwbDhg3jL8BERETUKuwQReaOpVBtRBAEbN26FWq1mkkFEREREVk9jli0kbKyMnTv3h39+vUDYJoSp5YkKNLjjV2ZWrrStv570u5R0vIpQ58rLcfS/znIfY4hTNSIiMgccSI32TqOWJiYVqvFf//7X6hUKjGpICIiItuSlZUlPohsBUcsTGzbtm0IDQ1t9Fd/IiIiaqy0tFTpECwS51uQOWJiYQIajQZarRalpaUYNWoUPD09W3wuQ2U+0lImQ4vBSfczVOIkt5+xC80ZKu+SK3liGRMRERGRdWJiYQJarRZbt25Fr169WP5EREQWaevWrUqHYLU494JsBRMLEzh79ix69uyJyMhIpUMhIiIiG8OyKDIXTCxaQavVIjMzE/Hx8bCz4zx4IiIiMqytRy+YZJCSLOq34bNnz+LBBx+En58fPD09MWLECPzwww+KxKLVarF582YEBgbC0dER9vb2BucPNLx/t/0MMXR8bW2t+HB1dRUfTk5O4kOf9D3puTUajc5Dbj/pZ9bW1uq8Z+hzpaSfQ0RERESWy6ISi4kTJ6K+vh579uxBdnY2oqKiMHHiRBQWFrZrHBqNBvX19YiJiWH5ExEREbUIW9KStbGYxOLmzZs4d+4c5s+fj/79+6NXr15YsmQJqqqqcPLkyXaLQ6PRYPPmzSgsLES3bt3a7XOJiIjINjDhIEtlMXMsOnbsiPDwcHzxxRcYOHAgnJ2d8dFHH8Hf3x8xMTHtFkdmZiYiIyPRtWvXJt9v7UrZxtIvHTJ2dWtjGCpfcnV1FZ/rX19Lrl1uv5auVE5ERGSJ5JIIdpQiS2IxiYVKpcLu3bsxefJkeHh4wM7ODv7+/khPT4ePj4/scWq1Gmq1WnxdXl7eos/XaDQ4c+YMxowZw4naRERErcBF8doHJ3JTe1P8N+T58+dDpVIZfJw5cwaCIGDOnDnw9/fHvn37kJWVhcmTJ2PSpEm4fv267PlTU1Ph5eUlPkJCQpodo0ajwbfffgsHBwcmFURERKQIlkiRuVMJgiAoGUBxcTFu3bplcJ8ePXpg3759GDt2LG7fvq2zsnWvXr0wa9YszJ8/v8ljmxqxCAkJQVlZmVErZAuCgFu3bqGkpAS9e/e+6/4tKQcyVLrU2nMYWq1b7tzSY5o6joisS3l5Oby8vIz+XrRmtvazUGpRPI5YmJa0REqudIojFtRSzfleVLwUqlOnTujUqdNd96uqqgKARiMGdnZ20Gq1ssc5OzvD2dm5RbHV19djy5YtGDdunFFJBREREVF7M2YEQ5pETpo0qVnnb82xZFsUTyyMNXToUPj4+GDmzJlYuHAhXF1d8cknn+DSpUt44IEHTP55giBg8+bN6N+/Pzp06GDy8xMRERG1JWnC4e3tLT5vzUhVc4+VJiJyxzJZsR4Wk1j4+fkhPT0dL7/8Mu69917U1dXhnnvuwZYtWxAVFWXSz6qvr0dZWRnGjx/PpIKIiIgsnrT8TJpktDVjEhG5EREmIpbHYhILABg0aBB27NjRpp9RX1+PjRs3YtCgQQgLC2v28S1pi2qKVqpy55DOj9DfR27+hbFzKtgSloiIiEypuYlIc8klLsZsp7uzqMSiPZw+fRoxMTEtSiqIiIioaZywbT7kRi+UGtVoT3JJiVKNDKwNE4v/U1dXh8zMTCQkJEClUikdDhERUZvgL1BExuPoRfMwscBvScXGjRsRGxtrdUmFofKklqx63V4rixMREZFy5EaYrHUkwxjGJOW2nnzYfGJRV1cHrVaLkSNHIigoSOlwiIiIiNpNc0vUbKFcqjVsfcK5TS8jXVdXhw0bNqCkpIRJBRGRGVq9ejVCQ0Ph4uKCuLi4u/br/+abbxAREQEXFxf069cP27dvb6dIqSmlpaXig4isn02PWGRkZGDIkCHo3Lmz0qEoQq6UqSXlU0REppaWloaUlBSsWbMGcXFxWLFiBRITE5GXlwd/f/9G+x88eBCPPfYYUlNTMXHiRHz99deYPHkycnJy0LdvXwWuwHxwXgW1hdZMAjfVPpbCVuZqqARBEJQOoj01LEt+8OBBDBkyxOrmVBARNVfD92JZWRk8PT2VDkcUFxeHwYMHY9WqVQAArVaLkJAQPPfcc5g/f36j/adNm4bKykp899134rYhQ4YgOjoaa9asMeozzfVn0RJKJRMcnaDWkEtQjNlfypikx5jztCdzTTia871ocyMWDXmUSqXCnTt3FI6GiEh55eXlAP73/WgOamtrkZ2djQULFojb7OzskJCQgEOHDjV5zKFDh5CSkqKzLTExEZs3b5b9HLVaDbVaLb4uKysD8L+fiSX4/vvvFfnchp8VkSlVV1ebfH/p+lxy+zf3c6W8vLya3C79f0RuH6m0tDTx+fjx41scj6k15x5hc4lFQzIxdOhQhSMhIjIvd+7cMerm1x5u3rwJjUaDgIAAne0BAQE4c+ZMk8cUFhY2uX9hYaHs56SmpuLvf/97o+0hISEtiJqIyHoZc4+wucQiKCgIV65cgYeHR7PLoMrLyxESEoIrV65Y/BD53fBarZctXS+v1TiCIODOnTs22cRiwYIFOqMcWq0WJSUl6NixY7uUylrrf6O8LsvC67Is7X1dzblH2FxiYWdnhy5durTqHJ6enlb1H6ghvFbrZUvXy2u9O3MZqWjg5+cHe3t7FBUV6WwvKipCYGBgk8cEBgY2a38AcHZ2hrOzs842JWqtrfW/UV6XZeF1WZb2vC5j7xE23W6WiIjMk5OTE2JiYpCRkSFu02q1yMjIkC1lHTp0qM7+ALBr1y6WvhIRtRObG7EgIiLLkJKSgpkzZ2LQoEGIjY3FihUrUFlZiaSkJADAjBkzEBwcjNTUVADA3LlzMWrUKCxbtgwPPPAA1q9fj19++QUff/yxkpdBRGQzmFg0g7OzMxYtWtRo2Nwa8Vqtly1dL6/Vsk2bNg3FxcVYuHAhCgsLER0djfT0dHGCdn5+Puzs/jfwPmzYMHz99dd45ZVX8Le//Q29evXC5s2bzXoNC2v8dwN4XZaG12VZzPm6bG4dCyIiIiIiMj3OsSAiIiIiolZjYkFERERERK3GxIKIiIiIiFqNiQUREREREbUaE4sWOnv2LB588EH4+fnB09MTI0aMwA8//KB0WG1m27ZtiIuLg6urK3x8fDB58mSlQ2pzarUa0dHRUKlUOHr0qNLhmNzly5cxa9YsdO/eHa6urggLC8OiRYtQW1urdGgms3r1aoSGhsLFxQVxcXHIyspSOiSTS01NxeDBg+Hh4QF/f39MnjwZeXl5SodFLWDN9xVrvodY073Cmu4L1vb9bynf9UwsWmjixImor6/Hnj17kJ2djaioKEycOBGFhYVKh2ZyGzduxBNPPIGkpCQcO3YMBw4cwOOPP650WG3ur3/9q1HL11uqM2fOQKvV4qOPPsKpU6fw3nvvYc2aNfjb3/6mdGgmkZaWhpSUFCxatAg5OTmIiopCYmIibty4oXRoJrV3717MmTMHP/30E3bt2oW6ujqMHTsWlZWVSodGzWSt9xVrv4dY073CWu4L1vj9bzHf9QI1W3FxsQBA+PHHH8Vt5eXlAgBh165dCkZmenV1dUJwcLDw6aefKh1Ku9q+fbsQEREhnDp1SgAgHDlyROmQ2sU777wjdO/eXekwTCI2NlaYM2eO+Fqj0QhBQUFCamqqglG1vRs3bggAhL179yodCjWDtd5XrP0eYgv3Cku8L9jC97+5ftdzxKIFOnbsiPDwcHzxxReorKxEfX09PvroI/j7+yMmJkbp8EwqJycHBQUFsLOzw4ABA9C5c2eMHz8eJ0+eVDq0NlNUVITZs2fjyy+/hJubm9LhtKuysjL4+voqHUar1dbWIjs7GwkJCeI2Ozs7JCQk4NChQwpG1vbKysoAwCr+HW2Jtd5XrPkeYiv3Cku7L9jK97+5ftczsWgBlUqF3bt348iRI/Dw8ICLiwuWL1+O9PR0+Pj4KB2eSV28eBEA8Nprr+GVV17Bd999Bx8fH4wePRolJSUKR2d6giDgySefxNNPP41BgwYpHU67On/+PFauXImnnnpK6VBa7ebNm9BoNOIKzQ0CAgIsvqzEEK1WixdeeAHDhw8369WmqTFrva9Y6z3EVu4VlnhfsIXvf3P+rmdiITF//nyoVCqDjzNnzkAQBMyZMwf+/v7Yt28fsrKyMHnyZEyaNAnXr19X+jKMYuy1arVaAMDLL7+Mhx56CDExMVi7di1UKhW++eYbha/CeMZe78qVK3Hnzh0sWLBA6ZBbzNhrlSooKMC4cePwyCOPYPbs2QpFTq01Z84cnDx5EuvXr1c6FPo/1npfsdZ7iLXeK3hfsC7m/F2vEgRBUDoIc1FcXIxbt24Z3KdHjx7Yt28fxo4di9u3b8PT01N8r1evXpg1axbmz5/f1qG2mrHXeuDAAdx7773Yt28fRowYIb4XFxeHhIQEvPXWW20dqkkYe72PPvootm7dCpVKJW7XaDSwt7fH9OnT8fnnn7d1qK1m7LU6OTkBAK5du4bRo0djyJAhWLduHezsLP/vDbW1tXBzc8OGDRt0us/MnDkTpaWl2LJli3LBtZHk5GRs2bIFP/74I7p37650OPR/rPW+Yq33EGu9V9jSfcHav//N/bveQekAzEmnTp3QqVOnu+5XVVUFAI3+R7OzsxP/OmPujL3WmJgYODs7Iy8vT7wp1NXV4fLly+jWrVtbh2kyxl7v+++/jzfffFN8fe3aNSQmJiItLQ1xcXFtGaLJGHutwG9/kRozZoz4V0RLunkY4uTkhJiYGGRkZIg3Fq1Wi4yMDCQnJysbnIkJgoDnnnsOmzZtQmZmplneaGyZtd5XrPUeYq33Clu6L1jr97/FfNcrN2/cchUXFwsdO3YUpk6dKhw9elTIy8sTXnzxRcHR0VE4evSo0uGZ3Ny5c4Xg4GBhx44dwpkzZ4RZs2YJ/v7+QklJidKhtblLly5ZbaePq1evCj179hTuu+8+4erVq8L169fFhzVYv3694OzsLKxbt044ffq08Kc//Unw9vYWCgsLlQ7NpJ555hnBy8tLyMzM1Pk3rKqqUjo0agZrvq/Ywj3EWu4V1nJfsMbvf0v5rmdi0UKHDx8Wxo4dK/j6+goeHh7CkCFDhO3btysdVpuora0V5s2bJ/j7+wseHh5CQkKCcPLkSaXDahfWcrNoytq1awUATT6sxcqVK4WuXbsKTk5OQmxsrPDTTz8pHZLJyf0brl27VunQqJms9b5iC/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" ] } ], "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 }