{ "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 plot_hyperparam_cv, 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", "
y_trueyy_var
AAAAAA-1.212747-1.3983120.04
AAAAAC-3.876249-3.4949290.04
AAAAAG0.140375-0.0660600.04
AAAAAT1.1593271.1238540.04
AAAACA0.3362250.0061490.04
............
TTTTGT-4.808467-4.8189050.04
TTTTTA-6.423852-6.4905320.04
TTTTTC-0.621695-0.6666890.04
TTTTTG-4.882427-4.9860130.04
TTTTTT-2.149232-2.3585590.04
\n", "

3658 rows × 3 columns

\n", "
" ], "text/plain": [ " y_true y y_var\n", "AAAAAA -1.212747 -1.398312 0.04\n", "AAAAAC -3.876249 -3.494929 0.04\n", "AAAAAG 0.140375 -0.066060 0.04\n", "AAAAAT 1.159327 1.123854 0.04\n", "AAAACA 0.336225 0.006149 0.04\n", "... ... ... ...\n", "TTTTGT -4.808467 -4.818905 0.04\n", "TTTTTA -6.423852 -6.490532 0.04\n", "TTTTTC -0.621695 -0.666689 0.04\n", "TTTTTG -4.882427 -4.986013 0.04\n", "TTTTTT -2.149232 -2.358559 0.04\n", "\n", "[3658 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", "data = model.simulate(sigma=0.2, p_missing=0.1)\n", "test = data.loc[np.isnan(data[\"y\"]), :].copy()\n", "train = data.dropna()\n", "train" ] }, { "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", "
y
AAAAAA-1.398312
AAAAAC-3.494929
AAAAAG-0.066060
AAAAAT1.123854
AAAACA0.006149
......
TTTTGT-4.818905
TTTTTA-6.490532
TTTTTC-0.666689
TTTTTG-4.986013
TTTTTT-2.358559
\n", "

4096 rows × 1 columns

\n", "
" ], "text/plain": [ " y\n", "AAAAAA -1.398312\n", "AAAAAC -3.494929\n", "AAAAAG -0.066060\n", "AAAAAT 1.123854\n", "AAAACA 0.006149\n", "... ...\n", "TTTTGT -4.818905\n", "TTTTTA -6.490532\n", "TTTTTC -0.666689\n", "TTTTTG -4.986013\n", "TTTTTT -2.358559\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=train.index.values, y=train['y'].values)\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.990')" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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ZD8MDSI7GTduXKvQ+Pjjj3H27FksWbIE69evh06ng1arhVqthk6ng06nw7p165xYMVHncZdbIjv57rvvMGnSJNTW1kKhUGDUqFFYsWIF7r//fvkxBQUFePDBB5GTk9PuawiCAJVK1VMlE3UaWxpEdpKYmAilUom8vDy89tprCA4OvuJgo8LCQowePbrVfbfeeisee+wx3HDDDfjwww+RkJCA6upqAJfHRObOnQsAOHnyJGbMmIHExERMnDgR5eXlPfPBiKwwNIjsxMfHB1qtFpmZmXjzzTfx17/+FUpl679ix44duyI0DAYDRo0ahcOHD2PBggWora2VTwo0GAzQarUwmUx47LHH8P/+3/9Dbm4u5s+fj3/84x899tmILBgaRHY0btw4vPvuu5g6dSomTZp0xfXCwkKMGTNGvn3x4kUIgoA///nPAIATJ04gKipKvn7s2DGMGTMGer0ehYWFuOWWW6DT6fA///M/8PT0dPjnIWqLZ4QT2VF8fDw8PT3xxhtvtHu9bUujsLAQaWlpra5bh8qRI0ewaNEifPjhh3jrrbfc7kxrcj1saRDZ0caNG/HEE09gxIgRV1xrbGxEdXU1Bg8eLN9n6X6yqKqqQlBQEADgwIEDKCwsRGRkJEJDQ/H111/LjysoKHDchyC6CrY0iLpJFEVcuHAB77//Pk6ePImtW7e2+7jjx48jOjq61X0GgwFTpkyRb0+bNg233XYbTpw4gYiICMTExEChUOC+++7Drl27EB0dDY1Gg6lTp+L111936Ociag+n3BJ10969ezF58mRER0fjww8/REpKirNLInIYhgYREdmMYxpERGQzhgYREdmMoUFERDZjaBARkc0YGkREZDOGBhER2YyhQURENmNoEBGRzRgaRERkM4YGERHZ7P8DwYGQUDucXwcAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "test = test.join(mei, rsuffix=\"_mei\")\n", "r2 = pearsonr(test['y_mei'], test['y_true'])[0] ** 2\n", "fig, axes = plt.subplots(1, 1, figsize=(4, 4))\n", "axes.scatter(x=test['y_true'], y=test['y_mei'], 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=train.index.values, y=train.y.values, y_var=train.y_var.values)\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": "iVBORw0KGgoAAAANSUhEUgAABKUAAAFUCAYAAAD1S49QAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy89olMNAAAACXBIWXMAAA9hAAAPYQGoP6dpAABnS0lEQVR4nO3de3hU5b33/88kkIRTEiCQAznJFsEoJBggpoqAppsiohCw1EOh4MbWPWAw0qey20K1FPxVi9F2lBZFtFsERbRaFK2RQ7QgEAxIQRRNyTnhlIQMksPM/P7wyTzGkDBJJlkzmffruua6mDUraz53CGuR79zr/pocDodDAAAAAAAAQBfyMzoAAAAAAAAAfA9FKQAAAAAAAHQ5ilIAAAAAAADochSlAAAAAAAA0OUoSgEAAAAAAKDLUZQCAAAAAABAl6MoBQAAAAAAgC5HUQoAAAAAAABdrofRAbyJ3W5XSUmJ+vXrJ5PJZHQcAHA7h8Ohc+fOKSoqSn5+fG7RHlwrAHR3XCs6jmsFgO7O1WsFRSkXWCwWWSwW1dXV6csvvzQ6DgB0usLCQkVHRxsdwyuVlJQoJibG6BgA0Om4VrQf1woAvuJS1wqTw+FwdGEer1ZVVaXQ0FAVFhYqODjY6DgA4HbV1dWKiYlRZWWlQkJCjI7jlbhWAOjuuFZ0HNcKAN1VTU2NKisr1a9fP8XGxl7yWsFMqTZonFobHBzMxQNAt8atBO3HtQKAr+Ba0X5cKwB0R2fOnJGfn58SEhJUXV0t6dLXCm4Cd4HFYlFCQoLGjh1rdBQAAAAAAACPUlZWJkmKiIho09dRlHKB2WzWkSNHtG/fPqOjAAAAAAAAeASHw6HCwkL17dtXAwYMaPPXc/seAAAAAAAA2qShoUFFRUWKjIxUYGBgu47BTCkXcPseAAAAAADAN2pra1VUVKSYmJh2F6QkilIu4fY9AAAAAAAA6dy5c6qoqFBcXJz8/f07dCxu3wMAAAAAAMAlnT59Wg0NDYqJiXHL8ZgpBQAAAAAAgBY5HA6VlpbKz89P4eHhbjsuRSkXsKYUAAAAAADwRY0d9oKDg9W/f3+3HpuilAtYUwoAAAAAAPiahoYGnThxQhEREerTp4/bj8+aUl3EZDIZHUHSNxVOAAAAAACA1ly4cEFlZWWKiYnp8ILmLaEoBQAA3MZTPoRpCR/OAAAAXNq5c+dUVVWluLi4Tv3/HbfvuYA1pQAAAAAAgC84ffq0zp8/r+jo6E7/wJGilAtYUwoAAAAAAHRnndVhrzXcvgcAAAAAAODDGjvsDRw4sFMWNG8JRSkAAAAAAAAf1dDQoKKiIkVFRSkgIKBL35uiFAAAAAC0UXx8vIKDg+Xn56f+/ftr+/btRkcCgDbrig57raEoBQAAAADt8M9//lN9+/Y1OgYAtEt1dbWqq6s7vcNeayhKAQAAAAAA+JBTp07JbrcrOjra0Bx033OBxWJRQkKCxo4da3QUAAAAAB20a9cuTZs2TVFRUTKZTHrjjTea7WOxWBQfH6+goCClpKRo7969TV43mUyaMGGCxo4dq5deeqmLkgNAxzgcDpWUlMjf31+DBw82Og5FKVeYzWYdOXJE+/btMzoKAAAAgA6yWq1KTEyUxWK56OubNm1SZmamli9frgMHDigxMVGTJ09WRUWFc58PP/xQubm5evPNN7Vy5UodOnSoq+IDQLvY7XYVFhYqJCRE/fv3NzqOJIpSAAAAAHzMlClTtGLFCs2YMeOir69evVoLFizQvHnzlJCQoDVr1qh3795at26dc58hQ4ZIkiIjI3XzzTfrwIEDLb5fbW2tc+2WxgcAdKWGhgYVFBQoIiJCffr0MTqOE0UpAAAAAPi/6urqlJubq7S0NOc2Pz8/paWlaffu3ZK+mWl17tw5SVJNTY0++OADXXXVVS0ec9WqVQoJCXE+YmJiOncQAPAtFy5cUHFxsWJiYhQQEGB0nCYoSgEAAADA/3Xq1CnZbDaFh4c32R4eHq6ysjJJUnl5ua6//nolJibq2muv1Zw5c1pdf3bp0qWqqqpyPgoLCzt1DADQqLq6WqdOnVJsbKz8/f2NjtMM3fcAAAAAoA2GDh2qgwcPurx/YGCgAgMDOzERADTnKR32WuOTM6XOnz+vuLg4LVmyxOgoAAAAADxIWFiY/P39VV5e3mR7eXm5IiIiDEoFAK5r7LDXo0cPj+iw1xqfLEr97ne/07XXXmt0DAAAAAAeJiAgQMnJycrOznZus9vtys7OVmpqqoHJAODS7Ha7CgoKFBoaqtDQUKPjXJLP3b73xRdf6LPPPtO0adN0+PBho+MAAAAA6GI1NTU6fvy483l+fr7y8vI0YMAAxcbGKjMzU3PnztWYMWM0btw4ZWVlyWq1at68eQamBoDWNTQ0qLCwUEOGDPG4Bc1b4lUzpXbt2qVp06YpKipKJpNJb7zxRrN9LBaL4uPjFRQUpJSUFO3du7fJ60uWLNGqVau6KDEAAAAAT7N//36NHj1ao0ePliRlZmZq9OjRWrZsmSRp9uzZevzxx7Vs2TIlJSUpLy9P27Zta7b4OQB4iq+//lrFxcWKi4vzmoKU5GVFKavVqsTERFkslou+vmnTJmVmZmr58uU6cOCAEhMTNXnyZFVUVEiS/va3v+mKK67QFVdc0ZWxAQAAAHiQiRMnyuFwNHusX7/euc/ChQt14sQJ1dbW6uOPP1ZKSopxgQF0GzabTTt27NDLL7+sHTt2yGazdfiYVVVVOnPmjGJjY+Xn51VlHu+6fW/KlCmaMmVKi6+vXr1aCxYscE6rXbNmjbZu3ap169bpoYce0p49e7Rx40a9+uqrqqmpUX19vYKDg52fiHxXbW2tamtrnc+rq6vdOyAAAAAAAOATtmzZooyMDBUVFTm3RUdH68knn1R6enq7jtnYYW/IkCHuitmlvKuE1oq6ujrl5uYqLS3Nuc3Pz09paWnavXu3JGnVqlUqLCzUv//9bz3++ONasGBBiwWpxv1DQkKcj5iYmE4fBwAAAAAA6F62bNmiWbNmNSlISVJxcbFmzZqlLVu2tOl43tRhrzXdpih16tQp2Wy2Zvd5h4eHq6ysrF3HXLp0qaqqqpyPwsJCd0QFAAAAAAA+wmazKSMjQw6Ho9lrjdsWL17s8q183tZhrzXdpijVVj/5yU/0+OOPt7pPYGCggoOD9de//lXXXnutbrrppi5KBwDoDL/5zW9kMpmaPEaMGOF8/cKFCzKbzRo4cKD69u2rmTNnqry83MDEAAAA8HY5OTnNZkh9m8PhUGFhoXJyci55rPr6ep04cUJRUVHq3bu3O2MaotsUpcLCwuTv79/sl4fy8nJFRER06Nhms1lHjhzRvn37OnQcAIDxrrrqKpWWljofH374ofO1Bx54QG+99ZZeffVV7dy5UyUlJe2+vx8AAACQpNLSUrfs9/XXX6ukpERxcXHq2bOnO6IZrtsUpQICApScnKzs7GznNrvdruzsbKWmpnbo2BaLRQkJCRo7dmxHYwIADNajRw9FREQ4H2FhYZK+6Vry3HPPafXq1brxxhuVnJys559/Xv/85z+1Z88eg1MDAADAW0VGRnZ4P2/usNcarxpJTU2N8vLylJeXJ0nKz89XXl6eCgoKJEmZmZlau3atXnjhBR09elT33XefrFarsxtfezFTCgC6jy+++EJRUVEaOnSo7rrrLuc1JDc3V/X19U0aZowYMUKxsbHOhhkAAABAW40fP17R0dEymUwXfd1kMikmJkbjx4+/6OsnT55UXV2dhgwZ0uIxvFUPowO0xf79+zVp0iTn88zMTEnS3LlztX79es2ePVsnT57UsmXLVFZWpqSkJG3btq3Z4udtZbFYZLFYXF50DADgmVJSUrR+/XoNHz5cpaWlevjhhzV+/HgdPnxYZWVlCggIaLZY5KUaZtTW1qq2ttb5vLq6urPiAwAAwAv5+/vrySef1KxZs2QymZoseN5YZMrKypK/v3+Tr2vssNe3b1+FhIR0aeauYnJcbPl3XFR1dbVCQkJUVVWl4ODgNn2tp1Qz+esG0JqOnOe8UWVlpeLi4rR69Wr16tVL8+bNa1JgkqRx48Zp0qRJ+v/+v//vosf4zW9+o4cffrjZdl/5Hn6Xp1zvWsJ1EOg4X7tWdAa+h4Bv2rJlizIyMposeh4TE6OsrKxm65ja7XYVFhZq8ODB6tWrV1dH7TBXz3NedfseAADuFBoaqiuuuELHjx9XRESE6urqVFlZ2WSfSzXMWLp0qaqqqpyPwsLCTk4NAAAAb5Senq5///vf2r59uzZs2KDt27crPz+/WUHq2x32vLEg1RZedfueUbh9DwC6p5qaGn355Zf68Y9/rOTkZPXs2VPZ2dmaOXOmJOnYsWMqKChotWFGYGCgAgMDuyoyAAAAvJi/v78mTpzY4utff/21KioqFBcX160WNG8JRSkXmM1mmc1m5/QzAIB3WrJkiaZNm6a4uDiVlJRo+fLl8vf31x133KGQkBDdc889yszM1IABAxQcHKxFixYpNTVV1157rdHRAQAA0M1VVVXJarUqNjbW45dEcBeKUgAAn1FUVKQ77rhDp0+f1qBBg3T99ddrz549GjRokCTpiSeekJ+fn2bOnKna2lpNnjxZTz/9tMGpAQAA0N2dPHlSkhQVFWVwkq5FUcoF3L4HAN3Dxo0bW309KCjIec4HAAAAOpsvdNhrTfe/QdENzGazjhw5on379hkdBQAAAAAAdAN2u10FBQUaMGCATxakJGZKAQAAAAAAdKn6+noVFRUpOjpaPXv2NDqOYShKAQAAAAAAdJHz58/r5MmTPtNhrzW+PXoXWSwWJSQkaOzYsUZHAQAAAAAAXqqyslKVlZWKjY31+YKURFHKJawpBQAAAAAAOqKiokINDQ2KioqSyWQyOo5H4PY9AAAAAACATtLYYa9fv34KDg42Oo5HoSgFAAAAAADQCex2uwoLCzV48GD16tXL6Dgeh6IUAAAAAACAm9XV1amkpETR0dHq0YPyy8WwppQLWOgcAAAAAAC46vz58yotLVVsbCwFqVZQlHIBC50DAAAAAABX0GHPdZTrAAAAAAAA3KCiokJ+fn6KiooyOopXoCgFAAAAAADQAQ6HQ8XFxQoODqbDXhtQlAIAAAAAAGgnm82mwsJCRUREKCgoyOg4XoWiFAAAAAAAQDvQYa9j+I4BAAAAAAC0kdVq1enTp1nQvAMoSrnAYrHIYrHIZrMZHQUAfMJTTz3l8r73339/JyYBAAAAmqusrNTXX3+tmJgYmUwmo+N4LZPD4XAYHcJbVFdXKyQkRFVVVW1euMxTfkj56wbQmo6c59zpsssua/L85MmTOn/+vEJDQyV985+A3r17a/Dgwfrqq68MSNgyT/keGsVTrnct4ToIdJyvn+fcge8h4N0aO+yFhYUZHcVjuXqeY34ZAMDj5OfnOx+/+93vlJSUpKNHj+rMmTM6c+aMjh49qmuuuUa//e1vjY4KAAAAH+FwOFRUVKSgoCAKUm5CUQoA4NF+/etf649//KOGDx/u3DZ8+HA98cQT+tWvfmVgMgAAAPgKm82mEydOKCwsjBmObsSaUgAAj1ZaWqqGhoZm2202m8rLyw1IBAAAAF9Ch73O41MzpSorKzVmzBglJSXp6quv1tq1a42OBAC4hJtuukk//elPdeDAAee23Nxc3XfffUpLSzMwGQAAALo7q9WqsrIyxcXFUZDqBD5VlOrXr5927dqlvLw8ffzxx1q5cqVOnz5tdCwAQCvWrVuniIgIjRkzRoGBgQoMDNS4ceMUHh6uZ5991uh4AAAfxIfdgG84e/asqqur6bDXiXyqzOfv76/evXtLkmpra+VwOOjCAwAebtCgQXr77bf1+eef67PPPpMkjRgxQldccYXByQAAvqrxw+7evXvLarXq6quvVnp6ugYOHGh0NABtYLPZlJOTo9LSUkVGRmr8+PHy9/eXJJWXl6tHjx6KjIw0OGX35lUzpXbt2qVp06YpKipKJpNJb7zxRrN9LBaL4uPjFRQUpJSUFO3du7fJ65WVlUpMTFR0dLR+/vOfs2I+AHiJ+Ph4DR8+XDfffDMFKQCAofiwG/B+W7ZsUXx8vCZNmqQ777xTkyZNUnx8vF577TUVFRWpd+/eFJq7gFcVpaxWqxITE2WxWC76+qZNm5SZmanly5frwIEDSkxM1OTJk1VRUeHcJzQ0VAcPHlR+fr42bNjAIrkA4OHOnz+ve+65R71799ZVV12lgoICSdKiRYv06KOPGpwOAOCN+LAb8G1btmzRrFmzVFRU1GR7aWmplixZot27d6tfv34GpfMtXlWUmjJlilasWKEZM2Zc9PXVq1drwYIFmjdvnhISErRmzRr17t1b69ata7ZveHi4EhMTlZOT0+L71dbWqrq6uskDANC1li5dqoMHD2rHjh0KCgpybk9LS9OmTZsMTAYA8FZ82A34LpvNpoyMjGazGwMCAhQTE6OioiI9+OCDstlsBiX0LV5VlGpNXV2dcnNzm3Ri8vPzU1pamnbv3i3pm3tCz507J0mqqqrSrl27NHz48BaPuWrVKoWEhDgfMTExnTsID2AymTziAQCN3njjDf3pT3/S9ddf3+T8cNVVV+nLL780MBkAwFvxYTfgu3JycprNkOrTp4/Cw8N14sQJNTQ0qLCwsNV/03CfblOUOnXqlGw2m8LDw5tsDw8PV1lZmSTpxIkTGj9+vBITEzV+/HgtWrRII0eObPGYS5cuVVVVlfNRWFjYqWMAADR38uRJDR48uNl2q9VKERsA4HZ82A10b6WlpU2e9+/fX/369VNhYWGT2VPf3Q+dw6e6740bN055eXku79/YetxischisTB9DwAMMGbMGG3dulWLFi2SJGch6tlnn1VqaqqR0QAA3VBrH3Y3doE9ceKE7r33XucC56582J2Zmel83thiHkDX+3Y3vfDwcNXX1zsnsrS0HzpPtylKhYWFyd/fv9m93OXl5YqIiOjQsc1ms8xms6qrqxUSEtKhYwEA2mblypWaMmWKjhw5ooaGBj355JM6cuSI/vnPf2rnzp1GxwMA+KD2ftgNwHjjx49XdHS0TCaTzp49q5qamiavm0wmRUdHa/z48QYl9C3d5va9gIAAJScnKzs727nNbrcrOzu7w5+kWywWJSQkaOzYsR2NCQBoo+uvv155eXlqaGjQyJEj9d5772nw4MHavXu3kpOTjY4HAOhmOvPDbgCe4Xe/+50qKipktVqbbG+ckZ+VlSV/f38jovkcr5opVVNTo+PHjzuf5+fnKy8vTwMGDFBsbKwyMzM1d+5cjRkzRuPGjVNWVpasVqvmzZvXofdlphQAGOs//uM/tHbtWqNjdDpPXyPru11qAKA7+vaH3dOnT5f0/z7sXrhwobHhAHRIbW2tSktLdeedd6pv377KyMhosuh5dHS0srKylJ6ebmBK3+JVRan9+/dr0qRJzueN92XPnTtX69ev1+zZs3Xy5EktW7ZMZWVlSkpK0rZt25rdDw4A8C52u13Hjx9XRUWF7HZ7k9duuOEGg1IBALyVUR92AzBOTU2Nzp49q7i4OJlMJqWnp+u2225TTk6OSktLFRkZqfHjxzNDqouZHHzseUnfXuj8888/V1VVlYKDg9t0DE/59PtSf93ekhNA52icEdqe81xn2bNnj+68806dOHGi2bnBZDJ5XBOKjnwPPeUc3BJXzs3dYQwAWueJ14q22rFjR5MPuxs1ftgtSX/605/02GOPOT/sfuqpp5SSkuKW9+8O30PAm5w5c0Z1dXXcgtuFXD3PUZRqg+7wiwZFKQCt8cT/JCclJemKK67Qww8/rMjIyGbnKU+7rbo7XCtaQlEKgOSZ1wpvw/cQ6DplZWUKCAjQgAEDjI7iU1w9z3Wbhc47EwudA4BxvvjiC61cuVJXXnmlQkNDFRIS0uTRXo8++qhMJpMWL17s3HbhwgWZzWYNHDhQffv21cyZM5stdAsAAADP53A4VFhYqD59+lCQ8mAUpVxgNpt15MgR7du3z+goAOBzUlJSmqz74Q779u3Tn//8Z40aNarJ9gceeEBvvfWWXn31Ve3cuVMlJSUsdAkAAOBlbDabTpw4ocGDB6tfv35Gx0ErvGqhcwCA71m0aJEefPBBlZWVaeTIkerZs2eT179bWLqUmpoa3XXXXVq7dq1WrFjh3F5VVaXnnntOGzZs0I033ihJev7553XllVdqz549uvbaazs+GAAAAHSqxg57MTExLFruBShKueDbC50DALrWzJkzJUnz5893bjOZTHI4HO1a6NxsNmvq1KlKS0trUpTKzc1VfX290tLSnNtGjBih2NhY7d69m6IUAACAh/tuhz14PopSLjCbzTKbzc6FugAAXSc/P99tx9q4caMOHDhw0duxGxfBDA0NbbI9PDxcZWVlLR6ztrZWtbW1zufV1dVuywsAAADXNHbYi4mJMToK2oCiFADAo8XFxbnlOIWFhcrIyNA//vEPBQUFueWYkrRq1So9/PDDbjseAAAA2qbxw8WIiAijo6CNKEoBADzOm2++qSlTpqhnz5568803W9331ltvdemYubm5qqio0DXXXOPcZrPZtGvXLv3pT3/Su+++q7q6OlVWVjaZLVVeXt7qf3CWLl2qzMxM5/Pq6mo+oQMAAOgENptNOTk5Ki0tVWRkpK6//nqVlpaqf//+6tu3r9Hx0A4UpVzAmlIA0LWmT5+usrIyDR48WNOnT29xv7asKXXTTTfp008/bbJt3rx5GjFihH7xi18oJiZGPXv2VHZ2tnMdq2PHjqmgoECpqaktHjcwMFCBgYEuZQAAAED7bNmyRRkZGSoqKpIk+fv765prrtHPf/5z3X777QanQ3tRlHIBa0oBQNey2+0X/XNH9OvXT1dffXWTbX369NHAgQOd2++55x5lZmZqwIABCg4O1qJFi5Samsoi5wAAAAbasmWLZs2aJYfDIembDwUjIyN14MABzZ49W/7+/kpPTzc4JdrDz+gAAAB4iieeeEK33HKLZs6cqRtuuEERERHasmWL0bEAAAB8ls1mU0ZGhrMg1bdvXw0aNEgnTpxwzphfvHgxdzZ5KWZKAQA8ntVq1c6dO1VQUKC6uromr91///3tPu6OHTuaPA8KCnLesg0AAADj5eTkOG/ZGzBggHr27Ol8LkkOh0OFhYXKycnRxIkTDUqJ9qIoBQDwaJ988oluvvlmnT9/XlarVQMGDNCpU6fUu3dvDR48uENFKQAAAHi20tJSSVJERIRqa2tVXl7e6n7wLty+5wKLxaKEhASNHTvW6CgA4HMeeOABTZs2TWfPnlWvXr20Z88enThxQsnJyXr88ceNjgcAAIBOFBERoZiYGJ07d05nz55tcb/IyMguTAV3oSjlArPZrCNHjmjfvn1GRwEAn5OXl6cHH3xQfn5+8vf3V21trWJiYvT73/9e//M//2N0PAAAAHSShoYGxcbGqkePHjp//vxF9zGZTIqJidH48eO7OB3cgaIUAMCj9ezZU35+31yuBg8erIKCAklSSEiICgsLjYwGAACATnLhwgUVFRUpPj7eOTveZDI12afxeVZWlvz9/bs8IzqOohQAwKONHj3aOVN1woQJWrZsmV566SUtXrxYV199tcHpAAAA4G7nzp3TyZMnFRcXJ39/f6Wnp2vz5s0aMmRIk/2io6O1efNmpaenG5QUHcVC5wAAj7Zy5UqdO3dOkvS73/1Oc+bM0X333adhw4Zp3bp1BqcDAACAO50+fVoNDQ2KiYlpsj09PV233XabcnJyVFpaqsjISI0fP54ZUl6OohQAwKONGTPG+efBgwdr27ZtBqYBAABAZ3A4HCorK1NQUJDCw8Mvuo+/v78mTpzYtcHQqbh9DwAAAIBHePbZZ42OAMAADodDhYWFCg4OVv/+/Y2Ogy7ETCkXWCwWWSwW2Ww2o6MAgE8YPXp0s4UsW3LgwIFOTgMA6Cp///vfNXToUN14442SpPPnz2v+/PnauHGjwckAdJaGhgYVFRUpKipKAQEBRsdBF6Mo5QKz2Syz2azq6mqFhIQYHQcAur3p06cbHQEAYIAXX3xRN998s6KiouTn56c777xTZrPZ6FgAOsmFCxdUVlammJgY1obyURSl4JVcnUHR2RwOh9ERgG5p+fLlRkcAAHShBx54QElJSUpMTNSzzz6ru+66S3a7Xc8//7ySkpKMjgegE5w7d05VVVWKi4vzmN/v0PUoSgEAvML+/ft19OhRSVJCQoKSk5MNTgQAcJdJkybp0KFD2rp1q44ePari4mKlpqbq3XffVXFxsaZOnWp0RABu1NhhLzo62ugoMBhFKQCARysqKtIdd9yhjz76SKGhoZKkyspKfe9739PGjRv5zwwAdAO33nqrbr31VufzCxcu6PDhwzp06JDef/99ilJAN+FKhz34FrrvAQA82n/913+pvr5eR48e1ZkzZ3TmzBkdPXpUdrtd//Vf/2V0PABAJwgKCtKYMWM0f/58PfHEE0bHAeAGdrudDntoxqdmShUWFurHP/6xKioq1KNHD/3617/W7bffbnQsAEArdu7cqX/+858aPny4c9vw4cP1xz/+UePHjzcwGQDAnWw2mz777DMdPnzY+Xj99deNjgXADRoaGlRYWKghQ4bQYQ9N+FRRqkePHsrKylJSUpLKysqUnJysm2++WX369DE6GgCgBTExMaqvr2+23WazKSoqyoBEAICO+uqrr/Tpp582KUB98cUXqq+vV0BAgK688kqNHDnS6JgA3KCxw15sbCwd9tCMTxWlIiMjFRkZKUmKiIhQWFiYzpw5Q1EKADzYY489pkWLFslisWjMmDGSvln0PCMjQ48//rjB6QAAbXX33Xfr5ZdflslkUu/evWW1WjV16lQtW7ZMI0eO1LBhw/jFFegmqqurVV1dTYc9tMir1pTatWuXpk2bpqioKJlMJr3xxhvN9rFYLIqPj1dQUJBSUlK0d+/eix4rNzdXNptNMTExnZwaANARP/nJT5SXl6eUlBQFBgYqMDBQKSkpOnDggObPn68BAwY4HwAAz7d582Y99dRTqqmpUUlJiRYuXKj33ntP+/btU1xcHAUpoJs4deqULly4oOjoaApSaJFXzZSyWq1KTEzU/PnzlZ6e3uz1TZs2KTMzU2vWrFFKSoqysrI0efJkHTt2TIMHD3bud+bMGc2ZM0dr167tyvgAgHbIysoyOgIAwI0eeOABzZkzR0FBQZKkJ598UnPmzNHPfvYzbd68WU8//bR+8IMfGJwSQHs5HA6Vlpaqd+/ezs7JQEtMDofDYXSI9jCZTHr99dc1ffp057aUlBSNHTtWf/rTnyR9s7p/TEyMFi1apIceekiSVFtbq+9///tasGCBfvzjH7f6HrW1taqtrXU+r66uVkxMjKqqqhQcHNzmvJ7gUn/d5GwbL/3nA7SourpaISEh7TrP4Rsd+R56yrmtJa6c87rDGAC0rrOuFQ6HQ0899ZSWLVumqVOn6sknn9SgQYPcdnxPwvUW3ZXdbldRUZHCwsLUu3dvo+PAQK6e57zq9r3W1NXVKTc3V2lpac5tfn5+SktL0+7duyV9c6H7yU9+ohtvvPGSBSlJWrVqlUJCQpwPbvUDgK63fv36i25vaGjQ0qVLuzYMAKDTmEwmZWRk6MiRI6qtrdWIESOMjgSgDRoaGlRQUKCIiAgKUnBZtylKnTp1SjabTeHh4U22h4eHq6ysTJL00UcfadOmTXrjjTeUlJSkpKQkffrppy0ec+nSpaqqqtLjjz+u4cOH6/LLL+/UMQAAmrv//vt1++236+zZs85tx44dU0pKil5++WUDkwEAOsOQIUP02muv6cUXXzQ6CgAXff311yoqKlJsbKwCAgKMjgMv0m2KUq64/vrrZbfblZeX53y01mo2MDBQwcHBevDBB/XZZ58pNze3C9MCACTpk08+UVFRkUaOHKl//OMfslgsuuaaazRixAgdPHjQ6HgAgE4ydepUoyMAcEF1dbVOnz6tuLg4+fn5VIkBbuBVC523JiwsTP7+/iovL2+yvby8XBEREQalAgB01H/8x3/oo48+0uLFi/WDH/xA/v7+euGFF3THHXcYHQ0AAMCnnTp1Sna7XdHR0UZHgZfqNmXMgIAAJScnKzs727nNbrcrOztbqampHTq2xWJRQkKCxo4d29GYAIB22Lp1qzZu3KjU1FSFhobqueeeU0lJidGxAAA+bMaMGerfv79mzZpldBSgyzkcDpWUlKhHjx5NOt0DbeVVRamamhrnbXeSlJ+fr7y8PBUUFEiSMjMztXbtWr3wwgs6evSo7rvvPlmtVs2bN69D72s2m3XkyBHt27evo0MAALTRT3/6U91+++36xS9+oZycHB06dEgBAQEaOXKkXnnlFaPjAQB8VEZGButewSfZ7XYVFBQoNDRUoaGhRseBl/Oq2/f279+vSZMmOZ9nZmZKkubOnav169dr9uzZOnnypJYtW6aysjIlJSVp27ZtzRY/byuLxSKLxSKbzdah4wAA2u6jjz7Sxx9/rMTERElSRESE3n77bVksFs2fP18//OEPDU4IAGiLxv/Du2L16tWdmKRjJk6cqB07dhgdA+hS9fX1Ki4u1pAhQ9SzZ0+j46Ab8Kqi1MSJE+VwOFrdZ+HChVq4cKFb39dsNstsNqu6ulohISFuPTYAoHW5ubkKDAxstt1sNistLc2ARACAjvjkk0+aPD9w4IAaGho0fPhwSdLnn38uf39/JScnd1qGXbt26bHHHlNubq5KS0v1+uuva/r06U32sVgseuyxx1RWVqbExET98Y9/1Lhx4zotE+Dpvv76a1VUVCg2NpYFzeE2/CS5gDWlAMA4gYGB+vLLL/WrX/1Kd9xxhyoqKiRJ77zzjhoaGgxOBwBoq+3btzsf06ZN04QJE1RUVKQDBw7owIEDKiws1KRJkzq1+57ValViYqIsFstFX9+0aZMyMzO1fPlyHThwQImJiZo8ebLzGgT4mqqqKp05c4aCFNyOnyYXsKYUABhn586dGjlypD7++GNt2bJFNTU1kqSDBw9q+fLlBqcDAHTEH/7wB61atUr9+/d3buvfv79WrFihP/zhD532vlOmTNGKFSs0Y8aMi76+evVqLViwQPPmzVNCQoLWrFmj3r17a926de16v9raWlVXVzd5AN7i5MmTqqur05AhQ2QymYyOg26GohQAwKM99NBDWrFihf7xj38oICDAuf3GG2/Unj17DEwGAOio6upqnTx5stn2kydP6ty5cwYkkurq6pSbm9vkFnE/Pz+lpaVp9+7d7TrmqlWrFBIS4nzExMS4Ky7QaRo77PXs2VODBg0yOg66KYpSAACP9umnn170k+zBgwfr1KlTBiQCALjLjBkzNG/ePG3ZskVFRUUqKirSa6+9pnvuuUfp6emGZDp16pRsNluzZknh4eEqKytzPk9LS9Ptt9+ut99+W9HR0a0WrJYuXaqqqirno7CwsNPyA+5Ahz10Fa9a6NwodN8DAOOEhoaqtLRUl112WZPtn3zyiYYMGWJQKgCAO6xZs0ZLlizRnXfeqfr6eklSjx49dM899+ixxx4zOF3r3n//fZf3DQwMvGjTDsAT1dfXq6ioSNHR0XTYQ6djppQLWFMKAIzzox/9SL/4xS9UVlYmk8kku92ujz76SEuWLNGcOXOMjgcA6IDevXvr6aef1unTp/XJJ5/ok08+0ZkzZ/T000+rT58+hmQKCwuTv7+/ysvLm2wvLy9XRESEIZmArvL111+rpKREcXFxFKTQJShKAQA82sqVKzVixAjFxMSopqZGCQkJuuGGG/S9731Pv/rVr4yOBwBwgz59+mjUqFEaNWqUYcWoRgEBAUpOTlZ2drZzm91uV3Z2tlJTUw1MBnQuOuzBCPykucBisSghIUFjx441OgoA+JyAgACtXbtWX331lf7+97/rf//3f/XZZ5/pr3/9q/z9/dt0rGeeeUajRo1ScHCwgoODlZqaqnfeecf5+oULF2Q2mzVw4ED17dtXM2fObPZJOQDAvXJycnT33XcrNTVVxcXFkqS//vWv+vDDDzvtPWtqapSXl6e8vDxJUn5+vvLy8lRQUCBJyszM1Nq1a/XCCy/o6NGjuu+++2S1WjVv3rxOywQYiQ57MApFKRdw+x4AGC8mJkY333yzfvjDH2rYsGHtOkZ0dLQeffRR5ebmav/+/brxxht122236V//+pck6YEHHtBbb72lV199VTt37lRJSYlhC+0CgC947bXXNHnyZPXq1UuffPKJamtrJX0zY2PlypWd9r779+/X6NGjNXr0aEnfFKFGjx6tZcuWSZJmz56txx9/XMuWLVNSUpLy8vK0bdu2ZoufA97O4XCouLhYAQEBdNiDIUwOh8PR0YM8++yz+q//+i935PFo1dXVCgkJUVVVlYKDg9v0tZ5Sbb7UXzc528YN/3wAj9KR85y3GjBggB577DHNmjVLgwYN0oYNGzRr1ixJ0meffaYrr7xSu3fv1rXXXuvS8brDtaIlrpzzusMYALTOndeK0aNH64EHHtCcOXPUr18/HTx4UEOHDtUnn3yiKVOmNOl215344vUWnsdut6uwsFCDBw9Wr169jI6DbsbV85xbZkr9/e9/1wcffOB8fv78ef3oRz9yx6EBAOgUNptNGzdulNVqVWpqqnJzc1VfX6+0tDTnPiNGjFBsbGyrbb5ra2tVXV3d5AEAcM2xY8d0ww03NNseEhKiysrKrg8E+Ij6+nqdOHFCUVFRFKRgKLcUpV588UUtW7ZMn332mT7//HPdcMMNmjx5sjsODQCAW3366afq27evAgMD9bOf/Uyvv/66EhISVFZWpoCAAIWGhjbZPzw8vNVP6letWqWQkBDnIyYmppNHAADdR0REhI4fP95s+4cffqihQ4cakAjo/s6fP0+HPXiMHh354gceeEBJSUlKTEzUs88+q7vuukt2u13PP/+8kpKS3BTReBaLRRaLRTabzegoAIAOGj58uPLy8lRVVaXNmzdr7ty52rlzZ7uPt3TpUmVmZjqfV1dXU5gCABctWLBAGRkZWrdunUwmk0pKSrR7924tWbJEv/71r42OB3Q7VVVVslqtio2N9fhb7uEbOlSUmjRpkg4dOqStW7fq6NGjKi4uVmpqqt59910VFxdr6tSp7sppKLPZLLPZ7LwnEgDQtXJycvTnP/9ZX375pTZv3qwhQ4bor3/9qy677DJdf/31bTpWQECALr/8cklScnKy9u3bpyeffFKzZ89WXV2dKisrm8yWKi8vV0RERIvHCwwMVGBgYLvGBQC+7qGHHpLdbtdNN92k8+fP64YbblBgYKCWLFmiRYsWGR0P6FZOnjwpSYqKijI4CfD/dOj2vVtvvVW/+tWv9Morr+jTTz9VSUmJHn74YQ0aNEjvv/++uzICAHxYZ3dmstvtqq2tVXJysnr27Kns7Gzna8eOHVNBQYFSU1M7/D4AgKYa1/H74Q9/qDNnzujw4cPas2ePTp48qd/+9rdGxwO6DTrswZN1aKbUdwUFBWnMmDEaM2aMOw8LAPBhK1as0Jo1azRnzhxt3LjRuf26667TihUr2nSspUuXasqUKYqNjdW5c+e0YcMG7dixQ++++65CQkJ0zz33KDMzUwMGDFBwcLAWLVqk1NRUlzvvAQBc17NnTx06dEjSN7NYExISDE4EdD902IOn63BRymaz6bPPPtPhw4edj9dff90d2QAAcGtnpoqKCs2ZM0elpaUKCQnRqFGj9O677+r73/++JOmJJ56Qn5+fZs6cqdraWk2ePFlPP/20O4YBALiIu+++W88995weffRRo6MA3U59fb2KiooUHR3NgubwWG0qSn311Vf69NNPmxSgvvjiC9XX1ysgIEBXXnmlRo4c2VlZAQA+qLEzU3x8fJPt7enM9Nxzz7X6elBQkLO5BQCg8zU0NGjdunV6//33lZycrD59+jR5ffXq1QYlA7zb+fPndfLkScXFxcnPr0Or9gCdyuWi1N13362XX35ZJpNJvXv3ltVq1dSpU7Vs2TKNHDlSw4YNk7+/f2dmBQD4IDozAUD3dfjwYV1zzTWSpM8//7zJa3QGA9qnsrJS58+fp8MevILLRanNmzfrqaee0j333KOGhgb98pe/1J///GeNGDFCt9xyS7cuSDV+am6z2YyOAgA+h85MANB9bd++3egIQLdSUVEhPz8/OuzBa7g8j++BBx7QnDlzFBQUpL59++rJJ5/URx99pO3bt+uqq67Stm3bOjOnocxms44cOaJ9+/YZHQUAfI7JZNIvf/lLOjMBQDdTX1+vm266SV988YXRUQCv53A4VFRUpKCgIIWFhRkdB3CZy0WpVatWqV+/fk22JScna+/evcrIyNDs2bN155136uTJk24PCQDwXVVVVTpz5oyzM9O4cePUt29fnTlzRtXV1UbHAwC007e77wFoP7vdroKCAg0cOFDBwcFGxwHapMMrnplMJmVkZOjIkSOqra3ViBEj3JELAABJ0o9+9CNt3Lix2fZXXnlFP/rRjwxIBABwl8buewDap66uTidOnNCQIUPUq1cvo+MAbdam7nutGTJkiF577TVt3brVXYcEAEAff/zxRbsvTZw4Ub/85S8NSAQAcBe67wGus9lsysnJUWlpqSIjI5WcnKyzZ8/SYQ9ezW1FqUZTp0519yEBAD6strZWDQ0NzbbX19fr66+/NiARAMBd6L4HuGbLli3KyMhQUVGRJCk0NFRxcXH69a9/rdjYWIPTAe3n9qKUp5sxY4Z27Nihm266SZs3bzY6DgDgEsaNG6e//OUv+uMf/9hk+5o1a5ScnGxQKgCAO9B9D7i0LVu2aNasWXI4HJKkwYMHy2az6dChQ7r99tu1efNmpaenG5wSaB+fK0plZGRo/vz5euGFF4yOAgBwwYoVK5SWlqaDBw/qpptukiRlZ2dr3759eu+99wxOBwAA0HlsNpsyMjKcBakhQ4bo3LlzzmYvJpNJixcv1m233SZ/f38jowLt4nM3nk6cOLFZF0EAgOe67rrrtHv3bsXExOiVV17RW2+9pcsvv1yHDh3S+PHjjY4HAOignJwc3X333UpNTVVxcbEk6a9//as+/PBDg5MBxsvJyVFRUZH8/PwUFxen06dPN+k+7HA4VFhYqJycHANTAu3nVUWpXbt2adq0aYqKipLJZNIbb7zRbB+LxaL4+HgFBQUpJSVFe/fu7fqgAAC3SkpK0ksvvaR//etf2r9/v9atW6dhw4YZHQsA0EGvvfaaJk+erF69eumTTz5RbW2tJKmqqkorV640OB1gvNLSUvXs2VOxsbEqLi7WhQsXWtwP8EZeVZSyWq1KTEyUxWK56OubNm1SZmamli9frgMHDigxMVGTJ09WRUVFFycFALiT3W7X559/rg8//FC7du1q8gAAeK8VK1ZozZo1Wrt2rXr27Oncft111+nAgQMGJgM8w8CBAxUZGakTJ05ctPFLo8jIyC5MBbiPV60pNWXKFE2ZMqXF11evXq0FCxZo3rx5kr5ZBHfr1q1at26dHnrooTa/X21trfPTGklNpkkCALrGnj17dOedd+rEiRPO9RQamUwm2Ww2g5IBADrq2LFjuuGGG5ptDwkJUWVlZdcHAjzI2bNnlZCQILvd3uI+JpNJ0dHRLGkAr+VVM6VaU1dXp9zcXKWlpTm3+fn5KS0tTbt3727XMVetWqWQkBDnIyYmxl1xAQAu+tnPfqYxY8bo8OHDOnPmjM6ePet8nDlzxuh4AIAOiIiI0PHjx5tt//DDDzV06FADEgGeoby8XDabTdHR0XryySclfVOA+rbG51lZWSxyDq/VbYpSp06dks1mU3h4eJPt4eHhKisrcz5PS0vT7bffrrffflvR0dGtFqyWLl2qqqoq56OwsLDT8gMALu6LL77QypUrdeWVVyo0NLTJhwUhISFGxwMAdMCCBQuUkZGhjz/+WCaTSSUlJXrppZe0ZMkS3XfffUbHA7qcw+FQUVGRevXqpbCwMElSenq6Nm/erCFDhjTZNzo6Wps3b1Z6eroRUQG38Krb99zh/fffd3nfwMBABQYGymKxyGKxcIsIABggJSVFx48f1+WXX250FACAmz300EOy2+266aabdP78ed1www0KDAzUkiVLtGjRIqPjAS2y2WzKyclRaWmpIiMjNX78+A7PVrLZbCosLFRERISCgoKavJaenq7bbrvN7e8JGK3bFKXCwsLk7++v8vLyJtvLy8sVERHRoWObzWaZzWZVV1fzqTwAdLFFixbpwQcfVFlZmUaOHNlkIVxJGjVqlEHJAADtcejQIV199dXy8/OTyWTSL3/5S/385z/X8ePHVVNTo4SEBPXt29fomECLtmzZooyMDBUVFTm3Nd5m195ZS3V1dSopKVF0dLR69Lj4r+n+/v6aOHFiu44PeKpuU5QKCAhQcnKysrOzNX36dEnfdGvKzs7WwoULO3RsZkoBgHFmzpwpSZo/f75zm8lkksPhYKFzAPBCo0ePVmlpqQYPHqyhQ4dq3759GjhwoBISEoyOBlzSli1bNGvWrGbNV4qLizVr1qx23U5ntVp1+vRpxcXFNVs3CujuvKooVVNT02QhxPz8fOXl5WnAgAGKjY1VZmam5s6dqzFjxmjcuHHKysqS1Wp1duNrL2ZKAYBx8vPzjY4AAHCj0NBQ5efna/Dgwfr3v//damcxwJPYbDZlZGQ0K0hJcn5YtnjxYt12220u31Z39uxZXbhwQTExMRSk4JO8qii1f/9+TZo0yfk8MzNTkjR37lytX79es2fP1smTJ7Vs2TKVlZUpKSlJ27Zta7b4eVsxUwoAjBMXF2d0BACAG82cOVMTJkxQZGSkTCaTxowZ0+Iv8F999VUXpwNalpOT0+SWve9yOBwqLCxUTk6OS7fZlZeXq0ePHoqMjHRjSsC7eFVRauLEiRetSn/bwoULO3y73ncxUwoAjHfkyBEVFBSorq6uyfZbb73VoEQAgPb4y1/+ovT0dB0/flz333+/FixYoH79+hkdC7ik0tJSt+zX2GEvNDSUn334PK8qSgEAfM9XX32lGTNm6NNPP3WuJSXJOcWdWawA4H1+8IMfSJJyc3OVkZHBL+bwCq7OaGptv9Y67AG+iKKUC7h9DwCMk5GRocsuu0zZ2dm67LLLtHfvXp0+fVoPPvigHn/8caPjAQA64Pnnn1d2drays7NVUVHRbH2pdevWGZQMaG78+PGKjo5WcXHxRe/gMZlMio6O1vjx4y/69a502AN8jZ/RAbyB2WzWkSNHtG/fPqOjAIDP2b17tx555BGFhYXJz89Pfn5+uv7667Vq1Srdf//9RscDAHTAI488ov/8z/9Udna2Tp06pbNnzzZ5AJ7E399fTz75pCQ1W5S88XlWVtZF10izWq0qKytTXFwcBSngW/jXAADwaDabzXlbR1hYmEpKSjR8+HDFxcXp2LFjBqcDAHTEM888o/Xr1+vHP/6x0VEAl6Snp2vz5s3KyMhosuh5dHS0srKylJ6e3uxrzp49q9raWjrsARdBUcoF3L4HAMa5+uqrdfDgQV122WVKSUnR73//ewUEBOgvf/mLhg4danQ8AEAH1NXV6Xvf+57RMYA2SU9P12233aacnByVlpYqMjJS48ePv+gMqcYOexEREQYkBTyfyXGpdnZwauy+V1VVpeDg4DZ9radUxC/1103OtuGfD7qbjpznOsu7774rq9Xq7NR0yy236PPPP9fAgQO1adMm3XjjjUZHbKI7XCta4so5rzuMAUDr3Hmt+MUvfqG+ffvq17/+tZvSeQdPvN7CveiwB1/n6nmOmVIAAI82efJk558vv/xyffbZZzpz5oz69+/v8QUQAEDrLly4oL/85S96//33NWrUKPXs2bPJ66tXrzYo2aXNmDFDO3bs0E033aTNmzcbHQcepLHDXmRkpAIDA42OA3g0ilIAAK8zYMAAoyMAANzg0KFDSkpKkiQdPny4yWue/sFDRkaG5s+frxdeeMHoKPAgtbW1Ki0tVUxMzEVv5wPQFEUpF7CmFAB0rfT0dK1fv17BwcEXXTD027Zs2dJFqQAA7rZ9+3ajI7TbxIkTtWPHDqNjwIPU1NTo7NmziouL8/iiKuAp/IwO4A3MZrOOHDmiffv2GR0FAHxCSEiI8z9zISEhrT4AAPiuXbt2adq0aYqKipLJZNIbb7zRbB+LxaL4+HgFBQUpJSVFe/fu7fqg6DbOnDmjmpoaOuwBbcRMKQCAx3n++eclfbNI6MMPP6xBgwapV69eBqcCALjLpWbBNmrvbFir1arExETNnz//ou+1adMmZWZmas2aNUpJSVFWVpYmT56sY8eOafDgwZKkpKQkNTQ0NPva9957T1FRUe3Khe6prKxMAQEBdNgD2oGiFADAYzkcDl1++eX617/+pWHDhhkdBwDgJp0903XKlCmaMmVKi6+vXr1aCxYs0Lx58yRJa9as0datW7Vu3To99NBDkqS8vDy35amtrVVtba3zeXV1tduODeM0dtjr37+/+vbta3QcwCtRlHIBa0oBgDH8/Pw0bNgwnT59mqIUAHQjjTNijVBXV6fc3FwtXbrUuc3Pz09paWnavXt3p7znqlWr9PDDD3fKsWEMOuwB7sGaUi5gTSkAMM6jjz6qn//85826MgEA0B6nTp2SzWZTeHh4k+3h4eEqKytz+ThpaWm6/fbb9fbbbys6OrrVgtbSpUtVVVXlfBQWFrY7P4xXW1urwsJCxcTEUJACOoiiFADAo82ZM0d79+5VYmKievXqpQEDBjR5tMWqVas0duxY9evXT4MHD9b06dN17NixJvtcuHBBZrNZAwcOVN++fTVz5kyVl5e7c0gAgG7g/fff18mTJ3X+/HkVFRUpNTW1xX0DAwMVHBzc5AHvVFNTo4qKCsXFxcnf39/oOIDX4/Y9AIBHy8rKctuxdu7cKbPZrLFjx6qhoUH/8z//o//8z//UkSNH1KdPH0nSAw88oK1bt+rVV19VSEiIFi5cqPT0dH300UduywEAME5YWJj8/f2bfeBQXl7OQtVo1ZkzZ1RXV6eYmBijowDdBkUpAIBHmzt3rtuOtW3btibP169fr8GDBys3N1c33HCDqqqq9Nxzz2nDhg268cYbJX2z7smVV16pPXv26Nprr3VbFgCAMQICApScnKzs7GxNnz5dkmS325Wdna2FCxcaGw4eiw57QOegKAUA8BoXLlxQXV1dk20duQWiqqpKkpy3Aebm5qq+vl5paWnOfUaMGKHY2Fjt3r37okUpOioBgOepqanR8ePHnc/z8/OVl5enAQMGKDY2VpmZmZo7d67GjBmjcePGKSsrS1ar1dmND2hEhz2gc1GUAgB4NKvVql/84hd65ZVXdPr06Wavt7czqt1u1+LFi3Xdddfp6quvlvT/PgUNDQ1tsm9ri9/SUQkAPM/+/fs1adIk5/PMzExJ38y+Xb9+vWbPnq2TJ09q2bJlKisrU1JSkrZt29Zs8XP4toaGBhUVFdFhD+hELHTuAovFooSEBI0dO9boKADgc/7P//k/+uCDD/TMM88oMDBQzz77rB5++GFFRUXpxRdfbPdxzWazDh8+rI0bN3YoHx2VAMDzTJw4UQ6Ho9lj/fr1zn0WLlyoEydOqLa2Vh9//LFSUlKMCwyPU1tbq6KiIjrsAZ2MmVIuMJvNMpvNqq6uVkhIiNFxAMCnvPXWW3rxxRc1ceJEzZs3T+PHj9fll1+uuLg4vfTSS7rrrrvafMyFCxfq73//u3bt2qXo6Gjn9oiICNXV1amysrLJbKnWFr8NDAzkP6sAAHQj586dU2VlpeLi4mQymYyOA3RrzJQCAHi0M2fOaOjQoZK+WT/qzJkzkqTrr79eu3btatOxHA6HFi5cqNdff10ffPCBLrvssiavJycnq2fPnsrOznZuO3bsmAoKClpt9Q0AALqH06dP6/z584qJiaEgBXQBZkoBADza0KFDlZ+fr9jYWI0YMUKvvPKKxo0bp7feeqvZ2k+XYjabtWHDBv3tb39Tv379nOtEhYSEqFevXgoJCdE999yjzMxMDRgwQMHBwVq0aJFSU1PpvAcAQDfmcDhUVlamoKAg1hYDuhBFKQCAR5s3b54OHjyoCRMm6KGHHtK0adP0pz/9SfX19Vq9enWbjvXMM89I+matkW97/vnn9ZOf/ESS9MQTT8jPz08zZ85UbW2tJk+erKefftodQwEAAB7I4XCosLBQAwYMoMMe0MVMDofDYXQIb9G4plRVVVWbW5B7ytTPS/11k7Nt+OeD7qYj57mucuLECeXm5uryyy/XqFGjjI7TTHe4VrTElXNedxgDgNZ5w7XC0/E9vDibzaacnByVlpYqMjJS48ePl7+/f6e+Z2OHvaioKAUEBHTqewG+xNXznM+tKfX3v/9dw4cP17Bhw/Tss88aHQcAcAnf7WYXFxen9PR0jyxIAQCA9tmyZYvi4+M1adIk3XnnnZo0aZLi4+O1ZcuWTnvPCxcuODvsUZACjOFTRamGhgZlZmbqgw8+0CeffKLHHntMp0+fNjoWAKAV8fHxmjBhgtauXauzZ88aHQcAALjZli1bNGvWLBUVFTXZXlxcrFmzZnVKYercuXM6deqU4uLiOn02FoCW+VRRau/evbrqqqs0ZMgQ9e3bV1OmTNF7771ndCwAQCv279+vcePG6ZFHHlFkZKSmT5+uzZs3q7a21uhoAACgg2w2mzIyMi56e3XjtsWLF8tms7ntPRs77EVHR3v8bedAd+dVRaldu3Zp2rRpioqKkslk0htvvNFsH4vFovj4eAUFBSklJUV79+51vlZSUqIhQ4Y4nw8ZMkTFxcVdER0A0E6jR4/WY489poKCAr3zzjsaNGiQ7r33XoWHh2v+/PlGxwMAAB2Qk5PTbIbUtzUuQp6Tk9Ph93I4HCotLZWfnx8d9gAP4VVFKavVqsTERFkslou+vmnTJmVmZmr58uU6cOCAEhMTNXnyZFVUVHRxUgCAu5lMJk2aNElr167V+++/r8suu0wvvPCC0bEAAEAHlJaWunW/ljQWt4KDg9W/f/8OHQuA+3hVUWrKlClasWKFZsyYcdHXV69erQULFmjevHlKSEjQmjVr1Lt3b61bt06SFBUV1WRmVHFxsaKiolp8v9raWlVXVzd5AACMUVRUpN///vdKSkrSuHHj1Ldv3xY/pAAAAN4hMjLSrftdTENDg/79738rIiJCffr0afdxALifVxWlWlNXV6fc3FylpaU5t/n5+SktLU27d++WJI0bN06HDx9WcXGxampq9M4772jy5MktHnPVqlUKCQlxPmJiYjp9HACApv785z9rwoQJio+P14svvqjZs2fryy+/VE5Ojn72s58ZHQ8AAHTA+PHjW13byWQyKSYmRuPHj2/X8Rs77MXGxtJhD/BA3aYoderUKdlstmb3BoeHh6usrEyS1KNHD/3hD3/QpEmTlJSUpAcffFADBw5s8ZhLly5VVVWV8/HdtuQAgM63YsUKpaSkKDc3V4cPH9bSpUsVFxdndCwAAOAG/v7+evLJJyWpWWGq8XlWVla7OuRVV1fTYQ/wcD2MDtDVbr31Vt16660u7RsYGKjAwEBZLBZZLBa3dnyAb/CUbh4X62YCeIuCggKP+bcEAADcLz09XZs3b1ZGRkaTRc+jo6OVlZWl9PT0Nh/z9OnTamhoUHR0tDujAnCzblOUCgsLk7+/v8rLy5tsLy8vV0RERIeObTabZTabVV1drZCQkA4dCwDQNhSkAADo/tLT03XbbbcpJydHpaWlioyM1Pjx49s8w8nhcKisrExBQUF02AO8QLcpSgUEBCg5OVnZ2dmaPn26JMlutys7O1sLFy7s0LGZKQUAAAAAncvf318TJ05s99fb7XYVFRVp4MCBLGgOeAmvKkrV1NTo+PHjzuf5+fnKy8vTgAEDFBsbq8zMTM2dO1djxozRuHHjlJWVJavVqnnz5nXofZkpBQAAAACeq6GhQYWFhRoyZAgLmgNexKuKUvv379ekSZOczzMzMyVJc+fO1fr16zV79mydPHlSy5YtU1lZmZKSkrRt27YOT9tkphQAAAAAeKYLFy6orKxMsbGxLGgOeBmTgxWQXdY4U6qqqkrBwcFt+lpPWRPlUn/d5Gyb7pITaNSR81xXOHXqlD7++GPZbDaNHTtWkZGRRkdqpjtcK1riyrmkO4wBQOs8/VrhDfgeuk91dbWqq6s1ZMgQj78GAb7E1fOcV82UAgD4rtdee0333HOPrrjiCtXX1+vYsWOyWCwdvkUbAAB4p1OnTslut9NhD/BifkYH8AYWi0UJCQkaO3as0VEAwGfU1NQ0ef7www9r79692rt3rz755BO9+uqr+uUvf2lQOgAAYBSHw6GSkhL16NFDgwcPNjoOgA6gKOUCs9msI0eOaN++fUZHAQCfkZycrL/97W/O5z169FBFRYXzeXl5OQuZAgDgY+x2uwoLCxUaGqrQ0FCj4wDoIG7fAwB4pHfffVdms1nr16+XxWLRk08+qdmzZ8tms6mhoUF+fn5av3690TEBAEAXocMe0P1QlHIB3fcAoOvFx8dr69atevnllzVhwgTdf//9On78uI4fPy6bzaYRI0YoKCjI6JgAAKALfP311yovL1dcXJz8/LjhB+gu+NfsAm7fAwDj3HHHHdq3b58OHjyoiRMnym63KykpiYIUAAA+orq6WqdPn6YgBXRDzJQCAHist99+W0ePHlViYqKeffZZ7dy5U3fddZemTJmiRx55RL169TI6IgAA6ER02AO6N8rMAACP9OCDD2revHnat2+ffvrTn+q3v/2tJkyYoAMHDigoKEijR4/WO++8Y3RMAADQCeiwB/gGilIusFgsSkhI0NixY42OAgA+Y/369Xr77be1ceNG7du3T3/9618lSQEBAfrtb3+rLVu2aOXKlQanBAAA7ma321VQUECHPcAHUJRyAWtKAUDX69Onj/Lz8yVJhYWFzdaQSkhIUE5OjhHRAABAJ6mvr9eJEycUFRWl3r17Gx0HQCdjTSkAMplMRkeQ9M00baDRqlWrNGfOHN1///06f/68XnjhBaMjAQCATvT111+roqKCBc0BH0JRCgDgke666y794Ac/0FdffaVhw4YxfR8AgG6sqqpKNTU1io2N9ZgPTAF0PopSAACPNXDgQA0cONDoGAAAoBOdPHlSDodDQ4YMMToKgC7GnEgXsNA5AAAAALhXY4e9gIAAOuwBPoqilAtY6BwAAAAA3OfbHfZCQkKMjgPAINy+BwAAAADoMvX19SoqKlJ0dLR69uxpdBwABmKmFAAAAAC0QWVlpcaMGaOkpCRdffXVWrt2rdGRvMbXX3+tkpISxcXFUZACwEwpAAAAAGiLfv36adeuXerdu7esVquuvvpqpaen05zjEuiwB+C7KEoBAAAAQBv4+/urd+/ekqTa2lo5HA45HA6DU3m2kydPShId9gA0we17AAAAALqVXbt2adq0aYqKipLJZNIbb7zRbB+LxaL4+HgFBQUpJSVFe/fubdN7VFZWKjExUdHR0fr5z3+usLAwN6XvXhwOh4qLixUQEKBBgwYZHQeAh6Eo5QKLxaKEhASNHTvW6CgAgA641C8pDodDy5YtU2RkpHr16qW0tDR98cUXxoQFALSb1WpVYmKiLBbLRV/ftGmTMjMztXz5ch04cECJiYmaPHmyKioqnPs0rhf13UdJSYkkKTQ0VAcPHlR+fr42bNig8vLyLhmbN2nssDdgwAA67AG4KIpSLjCbzTpy5Ij27dtndBQAQAdc6peU3//+93rqqae0Zs0affzxx+rTp48mT56sCxcudHFSAEBHTJkyRStWrNCMGTMu+vrq1au1YMECzZs3TwkJCVqzZo169+6tdevWOffJy8vT4cOHmz2ioqKaHCs8PFyJiYnKyclpMU9tba2qq6ubPLq7+vp6nThxQlFRUerVq5fRcQB4KIpSAACf0dovKQ6HQ1lZWfrVr36l2267TaNGjdKLL76okpKSi972AQDwTnV1dcrNzVVaWppzm5+fn9LS0rR7926XjlFeXq5z585J+mbx7l27dmn48OEt7r9q1SqFhIQ4HzExMR0bhIc7f/48HfYAuISiFAAAkvLz81VWVtbkl5SQkBClpKS4/EsKAMDznTp1SjabTeHh4U22h4eHq6yszKVjnDhxQuPHj1diYqLGjx+vRYsWaeTIkS3uv3TpUlVVVTkfhYWFHRqDJ6usrFRlZaViY2Pl58evmwBaR/c9AAAk5y8ibf0lpba2VrW1tc7nvnBLBgD4unHjxikvL8/l/QMDAxUYGNh5gTxERUWFTCZTs1scAaAlPle6njFjhvr3769Zs2YZHQUA0A342i0ZAODtwsLC5O/v32xh8vLyckVERBiUyrs1dtgLDAykwx6ANvG5olRGRoZefPFFo2MAADxM4y8ibf0lxZduyQCA7iAgIEDJycnKzs52brPb7crOzlZqaqqBybwTHfYAdITPFaUmTpyofv36GR0DAOBhLrvsMkVERDT5JaW6uloff/xxq7+kBAYGKjg4uMkDAGCsmpoa5eXlOW+xy8/PV15engoKCiRJmZmZWrt2rV544QUdPXpU9913n6xWq+bNm2dgau9Dhz0AHeVRRaldu3Zp2rRpioqKkslkumi3I4vFovj4eAUFBSklJUV79+7t+qAAAK/U2i8pJpNJixcv1ooVK/Tmm2/q008/1Zw5cxQVFaXp06cbmhsA0Db79+/X6NGjNXr0aEnfFKFGjx6tZcuWSZJmz56txx9/XMuWLVNSUpLy8vK0bdu2ZusKomV02APgDh610LnValViYqLmz5+v9PT0Zq9v2rRJmZmZWrNmjVJSUpSVlaXJkyfr2LFjGjx4sCQpKSlJDQ0Nzb72vffeY8E9APBx+/fv16RJk5zPMzMzJUlz587V+vXr9X/+z/+R1WrVvffeq8rKSl1//fXatm2bgoKCjIoMAGiHiRMnyuFwtLrPwoULtXDhwi5K1L1UVlbq/Pnzio2NlclkMjoOAC/mUUWpKVOmaMqUKS2+vnr1ai1YsMA5rXbNmjXaunWr1q1bp4ceekiS2tQF41LoqAQA3culfkkxmUx65JFH9Mgjj3RhKgAAvEdFRYX8/Pz4wB+AW3jU7XutqaurU25urtLS0pzb/Pz8lJaWpt27d3fKe9JRCQAAAAC+6bBXVFSkoKAghYWFGR0HQDfhNUWpU6dOyWazNbvPOzw8XGVlZS4fJy0tTbfffrvefvttRUdHt1rQoqMSAAAAAF9nt9t14sQJDRw4kIYeANzKo27f6wrvv/++y/sGBgYqMDBQFotFFotFNputE5MBAAAAgGepq6tTcXGxYmJi1KOHz/36CKCTec1MqbCwMPn7+6u8vLzJ9vLyckVERHTqe5vNZh05ckT79u3r1PcBAAAAAE9htVpVVlamuLg4ClIAOoXXFKUCAgKUnJys7Oxs5za73a7s7GylpqZ26ntbLBYlJCRo7Nixnfo+AAAAAOAJKisrVVVVpZiYGPn5ec2vjQC8jEeVu2tqanT8+HHn8/z8fOXl5WnAgAGKjY1VZmam5s6dqzFjxmjcuHHKysqS1Wp1duPrLGazWWazWdXV1QoJCenU9wIAAAAAI9FhD0BX8aii1P79+zVp0iTn88zMTEnS3LlztX79es2ePVsnT57UsmXLVFZWpqSkJG3btq3Z4ucAAAAAgLZxOBwqLi5WcHAwC5oD6BIeVZSaOHGiHA5Hq/ssXLhQCxcu7KJE32ChcwAAAADdmc1mU2FhoSIiIhQUFGR0HAA+gpuDXcBC5wAAAAC6q7q6OhUWFio6OpqCFIAuRVHKBSx0DgAAAKA7auywFxsbS4c9AF2OopQLmCkFAAAAoLs5e/asqqur6bAHwDCceQAAAADAx5SXl8tutysyMlImk8noOAB8FEUpF3D7HgAAAIDuwOFwqKioSL1799bAgQONjgPAx1GUcgG37wEAAADwdjabTSdOnFBYWJj69etndBwAECvZAQAAAEA3V1dXp5KSEkVHR7OgOQCPwdkIAAAAALoxq9Wq06dPKy4ujvWjAHgUbt9zAWtKAQAAAPBG3+6wR0EKgKehKOUC1pQCAAAA4G3osAfA03H7HgAAAAB0I40d9kJDQ1nQHIBHoygFAAAAAN2EzWZTYWGhIiIiFBQUZHQcAGgVRSkAAAAA6AZqa2tVWlpKhz0AXoM1pVzAQucAAAAAPFlNTY3Ky8sVFxdHQQqA16Ao5QIWOgcAAADgqc6cOaOamhrFxsayoDkAr0JRCgAAAAC8VFlZmRwOhyIiIoyOAgBtxrxOAAAAAPAydNgD0B1QlAIAAAAAL9LYYS8yMlKBgYFGxwGAdqMoBQAAAABeorHDXkxMjPz9/Y2OAwAdQlEKAAAAALxATU2Nzp49q7i4OBY0B9AtUJRygcVikcVikc1mMzoK4NM85T9fDofD6AgAAMDHnDlzRnV1dYqJiTE6CgC4Dd33XGA2m3XkyBHt27fP6CgAAAAAfExZWZkk0WEPQLfDTCkAAAAA8ECNHfb69++vvn37Gh0HANyOohQAAAAAeBg67AHwBRSlAAAAAMCD0GEPgK+gKAUAAAAAHoIOewB8CUUpAAAAAGij+Ph4BQcHy8/PT/3799f27ds7fEw67AHwNXTfAwDgOywWi+Lj4xUUFKSUlBTt3bvX6EjoYiaTyWMfvjQGwNP985//VF5enlsKUnTYA+CLKEoBAPAtmzZtUmZmppYvX64DBw4oMTFRkydPVkVFhdHRAADdkMPhUEFBgfr27asBAwYYHQcAuhRFKQAAvmX16tVasGCB5s2bp4SEBK1Zs0a9e/fWunXrjI4GAHDRrl27NG3aNEVFRclkMumNN95otk9HZ8WaTCZNmDBBY8eO1UsvvdSunA0NDTpx4oTCw8PVt2/fdh0DALwZa0oBAPB/1dXVKTc3V0uXLnVu8/PzU1pamnbv3m1gMgBAW1itViUmJmr+/PlKT09v9nrjrNg1a9YoJSVFWVlZmjx5so4dO6bBgwdLkpKSktTQ0NDsa9977z1FRUXpww8/1JAhQ1RaWqq0tDSNHDlSo0aNalPO4uJiJSQk0GEPgM+iKNUGDodDklRdXW1wkvbzluzkdC9yupe35GyPxrE1nu98zalTp2Sz2RQeHt5ke3h4uD777LOLfk1tba1qa2udz6uqqiR1z5+T7jAmxuAZXB1DSEhIJydpv8Z/677IG64VU6ZM0ZQpU1p8/duzYiVpzZo12rp1q9atW6eHHnpIkpSXl9fqewwZMkSSFBkZqZtvvlkHDhxosSjV0rUiNDRUVqvV5XEBgLdw9VpBUaoNzp07J0le3Q3Dk/9z923kdC9yupe35OyIc+fO+cQ43WHVqlV6+OGHm2335mtFS7rDzwRj8AyMoXvw1muFO2bFWq1W2e129evXTzU1Nfrggw/0wx/+sMX9W7pWxMbGtn0AAOBFLnWtoCjVBlFRUSosLFS/fv26vHNMdXW1YmJiVFhYqODg4C5977Ygp3uR073IeWkOh0Pnzp1TVFRUl76vpwgLC5O/v7/Ky8ubbC8vL2+xG9LSpUuVmZnpfG6323XmzBkNHDjQ0C5j3vLz3hrG4Dm6wzgYg/t4+7WiPbNiv6u8vFwzZsyQJNlsNi1YsEBjx45tcf/vXisqKysVFxengoICryzsucJTfl47E2PsHhhj53D1WkFRqg38/PwUHR1taIbg4GCv+IdCTvcip3uRs3Xd9T/HrggICFBycrKys7M1ffp0Sd8UmbKzs7Vw4cKLfk1gYKACAwObbAsNDe3kpK7zlp/31jAGz9EdxsEY3MOXrxWSNHToUB08eNDl/S92rZC++T4a/XfZ2Tzh57WzMcbugTG6nyvXCopSAAB8S2ZmpubOnasxY8Zo3LhxysrKktVqda47AgDwbu2ZFQsA6Bx+RgcAAMCTzJ49W48//riWLVumpKQk5eXladu2bc1u8wAAeKdvz4pt1DgrNjU11cBkAOB7mCnlJQIDA7V8+fKLTvv1JOR0L3K6FznhqoULF7Z4u5636A4/R4zBc3SHcTAG31JTU6Pjx487n+fn5ysvL08DBgxQbGys4bNifeHvkjF2D4yxe/DkMZocntzLFQAAAADaaMeOHZo0aVKz7XPnztX69eslSX/605/02GOPqaysTElJSXrqqaeUkpLSxUkBwLdRlAIAAAAAAECXY00pAAAAAAAAdDmKUgAAAAAAAOhyFKW8gMViUXx8vIKCgpSSkqK9e/caHamZXbt2adq0aYqKipLJZNIbb7xhdKSLWrVqlcaOHat+/fpp8ODBmj59uo4dO2Z0rGaeeeYZjRo1SsHBwQoODlZqaqreeecdo2O16tFHH5XJZNLixYuNjtLMb37zG5lMpiaPESNGGB2rmeLiYt19990aOHCgevXqpZEjR2r//v1Gx4KX8ZbzcWu85VzdGm88j1+KJ5/nW+It539XcI0AAHRHFKU83KZNm5SZmanly5frwIEDSkxM1OTJk1VRUWF0tCasVqsSExNlsViMjtKqnTt3ymw2a8+ePfrHP/6h+vp6/ed//qesVqvR0ZqIjo7Wo48+qtzcXO3fv1833nijbrvtNv3rX/8yOtpF7du3T3/+8581atQoo6O06KqrrlJpaanz8eGHHxodqYmzZ8/quuuuU8+ePfXOO+/oyJEj+sMf/qD+/fsbHQ1exlvOx63xlnN1a7ztPH4p3nCeb4mnn/9dwTXCt8XHx2vUqFFKSkq66OLt3q6yslJjxoxRUlKSrr76aq1du9boSJ1mxowZ6t+/v2bNmmV0FLfpjmP6Nl/5+TT0POOARxs3bpzDbDY7n9tsNkdUVJRj1apVBqZqnSTH66+/bnQMl1RUVDgkOXbu3Gl0lEvq37+/49lnnzU6RjPnzp1zDBs2zPGPf/zDMWHCBEdGRobRkZpZvny5IzEx0egYrfrFL37huP76642OgW7Gm87HrfGmc3VrPPU8finecJ5viTec/13BNcK3xcXFOc6dO2d0jE7T0NDgsFqtDofD4aipqXHEx8c7Tp06ZXCqzrF9+3bHm2++6Zg5c6bRUdymO47p23zl59PI8wwzpTxYXV2dcnNzlZaW5tzm5+entLQ07d6928Bk3UdVVZUkacCAAQYnaZnNZtPGjRtltVqVmppqdJxmzGazpk6d2uTn1BN98cUXioqK0tChQ3XXXXepoKDA6EhNvPnmmxozZoxuv/12DR48WKNHj+62n8QAbeUN5+rWePp5/FK85TzfEk8//7uCawS6M39/f/Xu3VuSVFtbK4fDIUc3bRA/ceJE9evXz+gYbtUdx/RtvvTzaRSKUh7s1KlTstlsCg8Pb7I9PDxcZWVlBqXqPux2uxYvXqzrrrtOV199tdFxmvn000/Vt29fBQYG6mc/+5lef/11JSQkGB2riY0bN+rAgQNatWqV0VFalZKSovXr12vbtm165plnlJ+fr/Hjx+vcuXNGR3P66quv9Mwzz2jYsGF69913dd999+n+++/XCy+8YHQ0wFCefq5ujTecxy/FW87zLfGG878ruEZ4LlfW8evo+rAmk0kTJkzQ2LFj9dJLL7kpueu6YoyVlZVKTExUdHS0fv7znyssLMxN6V3XFeP0NL4wZneM0RN+PlvjjjEaeZ6hKAWfZTabdfjwYW3cuNHoKBc1fPhw5eXl6eOPP9Z9992nuXPn6siRI0bHciosLFRGRoZeeuklBQUFGR2nVVOmTNHtt9+uUaNGafLkyXr77bdVWVmpV155xehoTna7Xddcc41Wrlyp0aNH695779WCBQu0Zs0ao6MBhvL0c3VrPP08finedJ5viTec/13BNcJzXWodP1fWh21cq+a7j5KSEknShx9+qNzcXL355ptauXKlDh061CVja9QVYwwNDdXBgweVn5+vDRs2qLy8vEvG9m1dMU5P444xezp3jNETfj5b444xGnqeMeSmQbiktrbW4e/v32w9kDlz5jhuvfVWY0K5QF6whonZbHZER0c7vvrqK6OjuOymm25y3HvvvUbHcHr99dcdkhz+/v7OhySHyWRy+Pv7OxoaGoyO2KoxY8Y4HnroIaNjOMXGxjruueeeJtuefvppR1RUlEGJ0B14w/m4Nd54rm6Np53HL8Xbz/Mt8bTzvyu4RniHi51z3b0+7JIlSxzPP/98B1J2TFeM8b777nO8+uqrHYnZYZ05zu3bt3vk+ksdGbOnjum73PH36gk/n61xxxi7+jzDTCkPFhAQoOTkZGVnZzu32e12ZWdne+WaFJ7A4XBo4cKFev311/XBBx/osssuMzqSy+x2u2pra42O4XTTTTfp008/VV5envMxZswY3XXXXcrLy5O/v7/REVtUU1OjL7/8UpGRkUZHcbruuuuatbz//PPPFRcXZ1AiwDjefK5ujaedxy/Fm8/zLfHE878ruEZ4J3esD2u1Wp23m9bU1OiDDz7QVVdd1Sl528MdYywvL3eOsaqqSrt27dLw4cM7JW97+eJav74wZlfG6A0/n61xZYxGn2d6dNk7oV0yMzM1d+5cjRkzRuPGjVNWVpasVqvmzZtndLQmampqdPz4cefz/Px85eXlacCAAYqNjTUwWVNms1kbNmzQ3/72N/Xr18+5NldISIh69eplcLr/Z+nSpZoyZYpiY2N17tw5bdiwQTt27NC7775rdDSnfv36NVvfpU+fPho4cKDHrfuyZMkSTZs2TXFxcSopKdHy5cvl7++vO+64w+hoTg888IC+973vaeXKlfrhD3+ovXv36i9/+Yv+8pe/GB0NXsZbzset8ZZzdWu84Tx+Kd50nm+JN5z/XcE1wju1tj7sZ5995tIxysvLNWPGDEnfNE1YsGCBxo4d6/as7eWOMZ44cUL33nuvcwHpRYsWaeTIkZ0Rt93cMU5JSktL08GDB2W1WhUdHa1XX33VYycbuDpmbxrTd7kyRm/4+WyNK2M0+jxDUcrDzZ49WydPntSyZctUVlampKQkbdu2rdkPldH279+vSZMmOZ9nZmZKkubOnav169cblKq5Z555RtI3XSK+7fnnn9dPfvKTrg/UgoqKCs2ZM0elpaUKCQnRqFGj9O677+r73/++0dG8UlFRke644w6dPn1agwYN0vXXX689e/Zo0KBBRkdzGjt2rF5//XUtXbpUjzzyiC677DJlZWXprrvuMjoavIy3nI9b4y3n6tZwHvcM3nD+dwXXCN81dOhQHTx40OgYnWrcuHHKy8szOkaXeP/9942O4HbdcUzf5gs/n0afZyhKeYGFCxdq4cKFRsdo1cSJE72iNaY3ZJSk5557zugI7bJjxw6jI1yUtyyQfMstt+iWW24xOga8nLecj1vj7fkl7z2PX4qnnudb4i3nf1dwjfA+YWFh8vf3b7Yocnl5uSIiIgxK5V6+MEbJd8b5bb4wZsboGWNkTSkAAAAAcDNfWB/WF8Yo+c44v80XxswYPWOMzJQCAAAAgHa41Dp+3rI+bGt8YYyS74zz23xhzIzRC8bYZX3+AAAAAKAb2b59u0NSs8fcuXOd+/zxj390xMbGOgICAhzjxo1z7Nmzx7jA7eALY3Q4fGec3+YLY2aM3/DkMZocjm6wcAMAAAAAAAC8CmtKAQAAAAAAoMtRlAIAAAAAAECXoygFAAAAAACALkdRCgAAAAAAAF2OohTggSZOnKjFixcbHQMA4MG4VgAAAG9HUQoAAAAAAABdjqIUAAAAAAAAuhxFKcALbN26VSEhIXrppZeMjgIA8FBcKwAAgLfpYXQAAK3bsGGDfvazn2nDhg265ZZbjI4DAPBAXCsAAIA3YqYU4MEsFov++7//W2+99Ra/ZAAALoprBQAA8FbMlAI81ObNm1VRUaGPPvpIY8eONToOAMADca0AAHSWhx56SE888YRmzpypDRs2GB0H3RQzpQAPNXr0aA0aNEjr1q2Tw+EwOg4AwANxrQCA7sFkMrX6+M1vftPlmZYuXao//OEPevnll3X8+PEuf3/4BopSgIf6j//4D23fvl1/+9vftGjRIqPjAAA8ENcKAOgeSktLnY+srCwFBwc32bZkyZJmX1NXV9epmUJCQnTPPffIz89Pn376aae+F3wXRSnAg11xxRXavn27XnvtNS1evNjoOAAAD8S1AgC8X0REhPMREhIik8nUZFvfvn01ceJELVy4UIsXL1ZYWJgmT54sSYqPj1dWVlaT4yUlJTlnV9ntdq1atUqXXXaZevXqpcTERG3evNmlXA0NDerdu7cOHz7szuECTqwpBXi44cOH64MPPtDEiRPl7++vP/zhD0ZHAgB4GK4VAOAbXnjhBd1333366KOPXP6aVatW6X//93+1Zs0aDRs2TLt27dLdd9+tQYMGacKECa1+7a9+9SvV1NRQlEKnoSgFeKAdO3Y0eX7llVeqvLzcmDAAAI/EtQIAfM+wYcP0+9//3uX9a2trtXLlSr3//vtKTU2VJA0dOlQffvih/vznP7dalMrNzdWaNWs0derUixal/va3v2n79u3NZmkBbUFRCgAAAAAAL5CcnNym/Y8fP67z58/r+9//fpPtdXV1Gj16dItfZ7fb9dOf/lQLFy5USkqK7r77btXX16tnz57OfQ4dOqTExMS2DQD4DopSAAAAAAB4gT59+jTb5ufn16wDa319vSSppqZGkrR161YNGTKkyT6BgYEtvs8f//hHnTp1So888ogKCgpUX1+vzz77TCNHjnTuc+jQIU2dOlXV1dX68Y9/rKlTp+ree+9t99jgmyhKAQAAAADgpQYNGqTS0lLn8+rqauXn50uSEhISFBgYqIKCgkuuH9WouLhYv/71r/Xyyy+rT58+GjZsmAIDA3X48OEmRamjR4+qV69emjJlin7zm980m40FuIKiFAAAAAAAXurGG2/U+vXrNW3aNIWGhmrZsmXy9/eXJPXr109LlizRAw88ILvdruuvv15VVVX66KOPFBwcrLlz5zY73v33368pU6Zo6tSpkqQePXroyiuvbLKu1Ndff63i4mLdeeed+t///V9dddVVXTNYdDsUpQAAAAAA8FJLly5Vfn6+brnlFoWEhOi3v/2tc6aUJP32t7/VoEGDtGrVKn311VcKDQ3VNddco//5n/9pdqy///3v+uCDD3T06NEm20eOHNmkKHX48GGlpqaquLhYPXpQVkD7mRzfvfkUAAAAAACgBc8995wqKio0efJkLViwQDt37lTfvn2NjgUv5Gd0AAAAAAAA4D0OHTqkq6++Wtdcc43++7//W/Pnzzc6ErwUM6UAAAAAAADQ5ZgpBQAAAAAAgC5HUQoAAAAAAABdjqIUAAAAAAAAuhxFKQAAAAAAAHQ5ilIAAAAAAADochSlAAAAAAAA0OUoSgEAAAAAAKDLUZQCAAAAAABAl6MoBQAAAAAAgC5HUQoAAAAAAABdjqIUAAAAAAAAuhxFKQAAAAAAAHS5/x/2kL3oPp1AkwAAAABJRU5ErkJggg==", "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": "code", "execution_count": 7, "id": "d1050335", "metadata": { "scrolled": true }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 100/100 [00:10<00:00, 9.20it/s]\n" ] } ], "source": [ "cvmodel = VCregression(cross_validation=True, cv_loss_function='logL', max_log_beta=5)\n", "cvmodel.fit(X=train.index.values, y=train.y.values, y_var=train.y_var.values)" ] }, { "cell_type": "markdown", "id": "a8af51e5", "metadata": {}, "source": [ "We can visualize the hyperparameter optimization curves during the cross-validation procedure as follows" ] }, { "cell_type": "code", "execution_count": 8, "id": "af857d36", "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig, axes = plt.subplots(1, 1, figsize=(5, 4.5))\n", "plot_hyperparam_cv(cvmodel.cv_loss_df, axes, x='log_beta', y='loss', show_folds=True,\n", " xlabel=r'$\\log\\beta$', ylabel=r'$-log(\\L)$', highlight='min')" ] }, { "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": 9, "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", "
y
AAAAAA-1.351140
AAAAAC-3.791511
AAAAAG0.044138
AAAAAT1.201937
AAAACA0.015829
......
TTTTGT-4.682707
TTTTTA-6.418972
TTTTTC-0.733215
TTTTTG-4.964112
TTTTTT-2.315425
\n", "

4096 rows × 1 columns

\n", "
" ], "text/plain": [ " y\n", "AAAAAA -1.351140\n", "AAAAAC -3.791511\n", "AAAAAG 0.044138\n", "AAAAAT 1.201937\n", "AAAACA 0.015829\n", "... ...\n", "TTTTGT -4.682707\n", "TTTTTA -6.418972\n", "TTTTTC -0.733215\n", "TTTTTG -4.964112\n", "TTTTTT -2.315425\n", "\n", "[4096 rows x 1 columns]" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "model.fit(X=train.index.values, y=train.y.values, y_var=train.y_var.values)\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": 10, "id": "52faa016", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Text(0.03, 0.97, '$R^2$=0.997')" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "test = test.join(pred, rsuffix=\"_pred\")\n", "r2 = pearsonr(test[\"y_pred\"], test[\"y_true\"])[0] ** 2\n", "fig, axes = plt.subplots(1, 1, figsize=(4, 4))\n", "axes.scatter(x=test[\"y_true\"], y=test[\"y_pred\"], 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": 11, "id": "1b2ad2fb", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 438/438 [00:19<00:00, 22.07it/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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
yy_varstdci_95_lowerci_95_uppery_true
AAAAGG-4.6557120.0534840.231267-5.118245-4.193179-4.490122
AAAATC-4.6648990.0533720.231024-5.126947-4.202851-4.563295
AAACGC-3.7647360.0562460.237162-4.239060-3.290411-3.762022
AAAGCT-2.3545790.0530030.230223-2.815025-1.894133-2.278915
AAAGGC-4.0556860.0531390.230520-4.516725-3.594647-4.166181
.....................
TTTCGT-3.9486620.0562160.237100-4.422861-3.474463-4.078485
TTTGAA-7.8680730.0593090.243534-8.355140-7.381005-7.812920
TTTGAT-5.3023520.0561460.236952-5.776257-4.828448-5.469751
TTTGTA-10.1778150.0561640.236989-10.651794-9.703837-10.371402
TTTTAA-4.1341560.0562510.237174-4.608504-3.659809-4.006536
\n", "

438 rows × 6 columns

\n", "
" ], "text/plain": [ " y y_var std ci_95_lower ci_95_upper y_true\n", "AAAAGG -4.655712 0.053484 0.231267 -5.118245 -4.193179 -4.490122\n", "AAAATC -4.664899 0.053372 0.231024 -5.126947 -4.202851 -4.563295\n", "AAACGC -3.764736 0.056246 0.237162 -4.239060 -3.290411 -3.762022\n", "AAAGCT -2.354579 0.053003 0.230223 -2.815025 -1.894133 -2.278915\n", "AAAGGC -4.055686 0.053139 0.230520 -4.516725 -3.594647 -4.166181\n", "... ... ... ... ... ... ...\n", "TTTCGT -3.948662 0.056216 0.237100 -4.422861 -3.474463 -4.078485\n", "TTTGAA -7.868073 0.059309 0.243534 -8.355140 -7.381005 -7.812920\n", "TTTGAT -5.302352 0.056146 0.236952 -5.776257 -4.828448 -5.469751\n", "TTTGTA -10.177815 0.056164 0.236989 -10.651794 -9.703837 -10.371402\n", "TTTTAA -4.134156 0.056251 0.237174 -4.608504 -3.659809 -4.006536\n", "\n", "[438 rows x 6 columns]" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pred = model.predict(test.index.values, calc_variance=True)\n", "pred['y_true'] = data.loc[pred.index.values, 'y_true']\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": 12, "id": "f6fdaad7", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Text(0.03, 0.97, 'Calibration=98.63%')" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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gDY4OKipqnpW33+2GXAy7Gin0djYGF555RXcfvvtsNvtJzyeGJIVBAGPP/44Wlpa8Nxzz+Gvf/0rvva1r03pvd544w20trbib3/7G/793/8dv//970/YT/e5556DKIp455138OSTT37oe2/YsAGPPfYYnE4n+vv70d/fP6kzS1BVFR/72McwNjaGv//973jttddw5MgRXHfddZOed/jwYbz44ot46aWX8NJLL+Hvf/87vve97+mPP/zww0hNTT3tV1dXFwBAkiSIojipy7RarQCAt99+GwBQUVGBjIwMPPXUU5BlGZFIBE899RQqKytRXFx80s9xaGgITU1NyMrKwoYNG5CdnY0LL7xQf82TGRsbw69+9Sts2LABZrMZAFBbW4vXX38dqqri1VdfxcqVKwEA9957L26//XYUFBSc8vWIaHolNgjIyspK2nDxJOcc1QvU2fw109TUpAHQfv/730/pvf7jP/5Dy8jI0G+fSUfrdru1UCik3/ezn/1MS01N1Tu+Cy+8UKurqzvn9044tqN99dVXNaPROKlLa2lp0QBo27dv12u22WyTOth7771XW7dunX57dHRUa2trO+2Xoiiapmnavn37NJPJpP3gBz/QJEnSxsbGtGuuuUYDoD388MP6a+7du1crKyvTBEHQBEHQKioqtM7OzlMev9fr1QBobrdbe/rpp7WdO3dqX/nKVzRRFLVDhw5Neu7XvvY1zWazaQC0xsZGbWRkRH+sp6dHu/zyy7WCggLt8ssv13p6erS///3v2po1a7TR0VHt2muv1UpKSk4YeSCi6dXT06O9+uqrZ93JJrCjnaO0M1w2+vXXX8emTZuwZMkSOBwO3HDDDRgdHUU4HD7j96qtrZ10znT9+vUIBoPo7u7W76uvr5+R925tbUVBQcGkLq2qqgoulwutra36fcXFxZM2Tc7NzcXQ0JB+2+12o7y8/LRfJtMHl3pXV1fjueeew6OPPgqbzYacnByUlJQgOztb73IjkQg++9nP4rzzzsO2bdvwzjvvYMWKFbj88ssnTWw6lqqqAIAvfOELuOWWW1BXV4cf//jHqKiowNNPPz3puffeey927dqFV199FUajETfeeKP+33zJkiV46aWX0NXVhZdeegkejwdf+tKX8OSTT+I73/kOHA4HDh48iLa2Nvz85z8/48+aiM7czp07kZGRcdK1i5OJ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7+/Hj370o2SXlnQjIyOIx+Mn/Rk6cOBAkqqa+9atW4dnn30WFRUV6O/vx0MPPYTzzz8f+/btg8PhSHZ5c17id9PJfu6m8ntr0XS0X//61086genYr6n8g/3mN7+J8847D3V1dfiXf/kXfO1rX8MPf/jDGTyC2Tfdn9liNJXP8O6778bGjRuxcuVK3HbbbXj00Ufxk5/8ZNL2jURTcdlll+Haa6/FypUrsXXrVrz88suYmJjAb3/722SXtqgsmo52LmzFN99M52eWk5NzwgzRwcFB/bGF6lw+w3Xr1iEWi6GzsxMVFRUzUN384fF4YDQa9Z+ZhMHBwQX98zPdXC4Xli1bhvb29mSXMi8kfrYGBweRm5ur3z84OIhVq1ad8essmqDlVnxTN52f2fr16/Hd734XQ0NDyMrKAgC89tprcDqdqKqqmpb3mIvO5TPcvXs3BEHQP6/FTBRF1NfX44033tBn96uqijfeeAN33HFHcoubR4LBIA4fPowbbrgh2aXMCyUlJcjJycEbb7yhB6vf70dTU9OHXpVyrEUTtFPBrfim7sM+sy1btqCqqgo33HADfvCDH2BgYADf+MY3cPvtty+oP07OltfrRVNTEy666CI4HA54vV7cdddd+MxnPoP09PRklzcn3H333bjpppuwZs0aNDQ04LHHHkMoFMItt9yS7NLmrK9+9au48sorUVRUhL6+PjzwwAMwGo24/vrrk13anBEMBid1+B0dHdi9ezfcbjcKCwvxla98Bd/5znewdOlSlJSU4Jvf/Cby8vKmdjnnNM6MXjBuuukmDcAJX2+++aamaZr25z//WVu1apWWmpqq2e12rba2VnvyySe1eDye3MKT6MM+M03TtM7OTu2yyy7TrFar5vF4tHvuuUdTFCV5Rc8hzc3N2rp167S0tDQtJSVFq6ys1B5++GEtGo0mu7Q55Sc/+YlWWFioiaKoNTQ0aNu2bUt2SXPaddddp+Xm5mqiKGpLlizRrrvuOq29vT3ZZc0pb7755kl/d910002apn1wic83v/lNLTs7W7NYLNqmTZu0gwcPTuk9uE0eERHRDFo0s46JiIiSgUFLREQ0gxi0REREM4hBS0RENIMYtERERDOIQUtERDSDGLREREQziEFLREQ0gxi0REREM4hBS0RENIMYtEQLXH5+Pv73//7fk+579913YbPZcPTo0SRVRbR4MGiJFrh169Zhx44d+m1N0/CVr3wFd911F4qKipJYGdHiwKAlWuAaGxsnBe0vfvELdHd347777sOTTz6JVatWoaamBqIoYtWqVVi1ahWeeOKJJFZMtLBw9x6iBe4f//gHNm7cCJ/PB4PBgIqKCjz00EP47Gc/qz/n/fffx6233oqmpqaTvkY8HofRaJytkokWFHa0RAtcfX09BEHAzp078f3vfx+ZmZknbJbe0tKC6urqSfddddVV+NKXvoS1a9fimWeewerVqzE+Pg7gg3O81113HQCgra0Nl19+Oerr63HBBRdgaGhodg6MaJ5g0BItcDabDTU1Nfjd736Hf/3Xf8WPf/xjCMLkf/r79u07IWj37t2LiooK7NixAzfffDN8Ph/S09P1x2pqaiBJEr70pS/h5z//OZqbm/GpT30K//Zv/zZrx0Y0HzBoiRaBxsZG/OQnP8HWrVuxcePGEx5vaWnBihUr9NuBQADxeBx33nknAODQoUNYunSp/vi+ffuwYsUKvPjii2hpacEVV1yBVatW4X/9r/8Fs9k848dDNJ+Ykl0AEc282tpamM1m/PCHPzzp48d3tC0tLdiwYcOkx48N4vfeew9f+cpX8Mwzz+DRRx/F9ddfP3PFE81z7GiJFoEXXngBd9xxB8rLy094LBKJYHx8HPn5+fp9iaHhhLGxMbhcLgDAO++8g5aWFpSWliInJwd/+ctf9Oe9//77M3cQRPMUO1qiBUpVVQwPD+Opp55CW1sb/vjHP570ea2trVi+fPmk+/bu3YvNmzfrty+77DJ87GMfw6FDh1BUVITKykoYDAbccssteP3117F8+XJYLBZs3boVP/jBD2b0uIjmG17eQ7RA/e1vf8PFF1+M5cuX45lnnsG6deuSXRLRosSgJSIimkE8R0tERDSDGLREREQziEFLREQ0gxi0REREM4hBS0RENIMYtERERDOIQUtERDSDGLREREQziEFLREQ0gxi0REREM+j/B9nmCMGS9AGCAAAAAElFTkSuQmCC", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "perc = np.mean((pred['y_true'] > pred['ci_95_lower']) & (pred['y_true'] < pred['ci_95_upper'])) * 100\n", "fig, axes = plt.subplots(1, 1, figsize=(5, 5))\n", "axes.errorbar(x=pred['y_true'], y=pred['y'], yerr=2 * pred['std'], c='black', markersize=3, fmt='o', alpha=0.2)\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": 13, "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": 14, "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", "
y_trueyy_var
TTTTTT-2.149232-2.3585590.04
TTTTTC-0.621695-0.6666890.04
\n", "
" ], "text/plain": [ " y_true y y_var\n", "TTTTTT -2.149232 -2.358559 0.04\n", "TTTTTC -0.621695 -0.666689 0.04" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "seqs = ['TTTTTT', 'TTTTTC']\n", "df = data.loc[seqs, :]\n", "df" ] }, { "cell_type": "code", "execution_count": 15, "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", "
T6C
TTTTTT1
TTTTTC-1
\n", "
" ], "text/plain": [ " T6C\n", "TTTTTT 1\n", "TTTTTC -1" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "contrast_matrix = pd.DataFrame({'T6C': [1, -1]}, index=['TTTTTT', '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": 16, "id": "97e01c55", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "True mutational effect = -1.53\n" ] } ], "source": [ "true_effect = (contrast_matrix.T.values @ df['y_true'].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": 17, "id": "1a345131", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Estimated mutational effect = -1.69 (95% CI = [-2.26, -1.126184])\n" ] } ], "source": [ "contrasts = make_contrasts(df, contrast_matrix)\n", "mu = contrasts.loc['T6C', 'estimate']\n", "lower = contrasts.loc['T6C', 'ci_95_lower']\n", "upper = contrasts.loc['T6C', '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": 18, "id": "8d1c03a6", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 2/2 [00:00<00:00, 16.39it/s]" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Estimated mutational effect with GP prior = -1.58 (95% CI = [-1.98, -1.185415])\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\n" ] } ], "source": [ "contrasts = model.make_contrasts(contrast_matrix=contrast_matrix)\n", "mu = contrasts.loc['T6C', 'estimate']\n", "lower = contrasts.loc['T6C', 'ci_95_lower']\n", "upper = contrasts.loc['T6C', '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": 19, "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", "
y_trueyy_var
TTTTTT-2.149232-2.3585590.04
TTTTTC-0.621695-0.6666890.04
ATTTTT0.0409430.0700380.04
ATTTTC-3.423259-3.5700270.04
\n", "
" ], "text/plain": [ " y_true y y_var\n", "TTTTTT -2.149232 -2.358559 0.04\n", "TTTTTC -0.621695 -0.666689 0.04\n", "ATTTTT 0.040943 0.070038 0.04\n", "ATTTTC -3.423259 -3.570027 0.04" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "seqs = ['TTTTTT', 'TTTTTC', 'ATTTTT', '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": 20, "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
TTTTTT1
TTTTTC-1
ATTTTT-1
ATTTTC1
\n", "
" ], "text/plain": [ " epistatic_coeff\n", "TTTTTT 1\n", "TTTTTC -1\n", "ATTTTT -1\n", "ATTTTC 1" ] }, "execution_count": 20, "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": 21, "id": "4d9ae388", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "True epistatic coefficient = -4.99\n" ] } ], "source": [ "true_effect = (contrast_matrix.T.values @ df['y_true'].values)[0]\n", "print('True epistatic coefficient = {:.2f}'.format(true_effect))" ] }, { "cell_type": "code", "execution_count": 22, "id": "e6a98f72", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Estimated epistatic coefficient = -5.33 (95% CI = [-6.13, -4.531935])\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": 23, "id": "8c8e1555", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 2/2 [00:00<00:00, 11.71it/s]" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Estimated epistatic coefficient with GP prior = -5.15 (95% CI = [-5.67, -4.636860])\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": 24, "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": 24, "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": 25, "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": 25, "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": 26, "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": 27, "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": 28, "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", "
y
AAAA0.460831
AAAC-2.475830
AAAD-3.568728
AAAE-4.868209
AAAF-4.007796
......
YYYS-5.269987
YYYT-3.821426
YYYV-3.143536
YYYW-4.306581
YYYY-4.429813
\n", "

160000 rows × 1 columns

\n", "
" ], "text/plain": [ " y\n", "AAAA 0.460831\n", "AAAC -2.475830\n", "AAAD -3.568728\n", "AAAE -4.868209\n", "AAAF -4.007796\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": 28, "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": 29, "id": "b5727d24", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Text(0.05, 0.95, '$R^2$=0.832')" ] }, "execution_count": 29, "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, 'y'], 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, 'y'], 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": 30, "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": 31, "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": 32, "id": "f2037d9b", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAArIAAAFUCAYAAADYjN+CAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy89olMNAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA+XElEQVR4nO3de1hVZf7//9cGBTyBIQmikJaORhkYpygPmVxD1NBoNR9tnImwsabZmorWyEziZZl0GjNrF6VjWp8sa2ayJsvJsKQDKoKQhlpMfBJzAM0E2X4Fhf37w3H/ItQ2sGHtw/NxXeu6XPdarP1aKHfvbu51L5PNZrMJAAAAcDM+RgcAAAAA2oNCFgAAAG6JQhYAAABuiUIWAAAAbolCFgAAAG6JQhYAAABuiUIWAAAAbolCFgAAAG6JQhYAAABuiUIWAAAAbolCFgC8QH5+vtLS0hQeHi6TyaT169e3OG6z2ZSdna0BAwaoR48eSk5O1ldffdXinCNHjmjq1KkKDAxU3759deedd6q+vr4L7wIAWqKQBQAvYLVaFR0dLYvFctbjjz32mJYvX67c3Fxt27ZNvXr1UkpKik6cOGE/Z+rUqfriiy+0adMmvfPOO8rPz9ddd93VVbcAAK2YbDabzegQAICuYzKZ9Oabb2rixImSTo/GhoeHa+7cuZo3b54kqba2VqGhoVq9erWmTJmiPXv2KCoqSoWFhYqLi5Mkbdy4UTfccIMOHDig8PBwo24HgBdjRLYNbDab6urqRO0P4Hzcra+oqKhQVVWVkpOT7W1BQUFKTExUQUGBJKmgoEB9+/a1F7GSlJycLB8fH23btq3LMwOAJHUzOoA7qaurU9++fVVZWanAwECj4wBwUXV1dYqIiNDRo0cVFBRkdJyfVFVVJUkKDQ1t0R4aGmo/VlVVpf79+7c43q1bNwUHB9vP+bGGhgY1NDTY95ubm3XkyBH169dPJpPJmbcAwIPYbDYdO3ZM4eHh8vE5/5grhawDLBaLLBaLGhsbJUkREREGJwLgDo4dO+YWhWxnycnJ0aJFi4yOAcBNVVZWatCgQec9h0LWAWazWWazWbW1tYzIAvhJZ0Zk+/TpY3QUh4SFhUmSqqurNWDAAHt7dXW1YmJi7OfU1NS0+LpTp07pyJEj9q//saysLGVmZtr3a2trFRkZSR8K4Lza0odSyDrgzIhsU1OTJCkwMJBOGMBPcpdfnw8ZMkRhYWHKy8uzF651dXXatm2b7rnnHklSUlKSjh49qqKiIsXGxkqSNm/erObmZiUmJp71uv7+/vL392/VTh8KwBGO9KEUsg44MyJbV1fn1b8mBOC+6uvrVV5ebt+vqKhQSUmJgoODFRkZqdmzZ2vx4sUaNmyYhgwZogULFig8PNy+ssGll16q66+/XtOnT1dubq5OnjypGTNmaMqUKaxYAMAwFLIO+PGILAC4mx07dmj8+PH2/TO/8k9PT9fq1at1//33y2q16q677tLRo0c1evRobdy4UQEBAfaveeWVVzRjxgxNmDBBPj4+uuWWW7R8+fIuvxcAOIN1ZNvgzIhsbW0tvxYDcE70FWfH9wWAI9rSV7COrAMsFouioqIUHx9vdBQAAAD8F4WsA8xms8rKylRYWGh0FAAAAPwXhSwAAADcEoWsA5haAAAA4HooZB3A1AIAAADXQyELAAAAt8Q6sg7oyDqyrv5mH1ZfAwAA7ooRWQcwtQAAAMD1UMgCAADALVHIAgAAwC1RyDqA5bcAAABcD4WsA5gjCwAA4HooZAEAAOCWKGQBAADglihkAQAA4JYoZAEAAOCWKGQdwKoFAAAArodC1gGsWgAAAOB6KGQBAADglihkAQAA4Ja8rpCtqKjQ+PHjFRUVpZEjR8pqtRodCQAAAO3QzegAXe2OO+7Q4sWLNWbMGB05ckT+/v5GRwIAAEA7eFUh+8UXX6h79+4aM2aMJCk4ONjgRAAAAGgvt5pakJ+fr7S0NIWHh8tkMmn9+vWtzrFYLBo8eLACAgKUmJio7du324999dVX6t27t9LS0nTllVdqyZIlXZgeAAAAzuRWhazValV0dLQsFstZj69bt06ZmZlauHChiouLFR0drZSUFNXU1EiSTp06pY8//ljPPvusCgoKtGnTJm3atKkrbwEAAABO4laFbGpqqhYvXqxJkyad9fjSpUs1ffp0ZWRkKCoqSrm5uerZs6dWrVolSRo4cKDi4uIUEREhf39/3XDDDSopKTnn5zU0NKiurq7FBgAAANfgVoXs+TQ2NqqoqEjJycn2Nh8fHyUnJ6ugoECSFB8fr5qaGn3//fdqbm5Wfn6+Lr300nNeMycnR0FBQfYtIiKi0+8DAAAAjvGYQvbw4cNqampSaGhoi/bQ0FBVVVVJkrp166YlS5Zo7NixuuKKKzRs2DD94he/OOc1s7KyVFtba98qKys79R4AAADgOK9atUA6PT0hNTXVoXP9/f3l7+8vi8Uii8WipqamTk4HAAAAR3nMiGxISIh8fX1VXV3dor26ulphYWEdurbZbFZZWZkKCws7dB0AAAA4j8cUsn5+foqNjVVeXp69rbm5WXl5eUpKSurQtS0Wi6KiohQfH9/RmAAAAHASt5paUF9fr/Lycvt+RUWFSkpKFBwcrMjISGVmZio9PV1xcXFKSEjQsmXLZLValZGR0aHPNZvNMpvNqqurU1BQUEdvAwAAAE7gVoXsjh07NH78ePt+ZmamJCk9PV2rV6/W5MmTdejQIWVnZ6uqqkoxMTHauHFjqwfA2oo5sgAAAK7HZLPZbEaHcBdnRmRra2sVGBjo0NeYTKZOTtUx/PUDzteevsIb8H0B4Ii29BUeM0e2MzFHFgAAwPVQyDqAVQsAAABcD4UsAAAA3BKFrAOYWgAAAOB6KGQdwNQCAAAA10MhCwAAALdEIesAphYAAAC4HgpZBzC1AAAAwPVQyAIAAMAtUcgCANTU1KQFCxZoyJAh6tGjhy655BI99NBDLd7+Z7PZlJ2drQEDBqhHjx5KTk7WV199ZWBqAN6OQtYBzJEF4OkeffRRPffcc3rmmWe0Z88ePfroo3rsscf09NNP28957LHHtHz5cuXm5mrbtm3q1auXUlJSdOLECQOTA/BmJtsP/3cb59We94SbTKZOTtUx/PUDzteevsJov/jFLxQaGqq//vWv9rZbbrlFPXr00P/+7//KZrMpPDxcc+fO1bx58yRJtbW1Cg0N1erVqzVlypSf/Ax3/L4A6Hpt6SsYkQUA6Oqrr1ZeXp6+/PJLSVJpaak++eQTpaamSpIqKipUVVWl5ORk+9cEBQUpMTFRBQUFhmQGgG5GBwAAGG/+/Pmqq6vTiBEj5Ovrq6amJj388MOaOnWqJKmqqkqSFBoa2uLrQkND7cd+rKGhQQ0NDfb9urq6TkoPwFsxIgsA0Ouvv65XXnlFa9euVXFxsdasWaMnnnhCa9asafc1c3JyFBQUZN8iIiKcmBgAKGQBAJLuu+8+zZ8/X1OmTNHIkSP129/+VnPmzFFOTo4kKSwsTJJUXV3d4uuqq6vtx34sKytLtbW19q2ysrJzbwKA16GQdQCrFgDwdMePH5ePT8v/JPj6+qq5uVmSNGTIEIWFhSkvL89+vK6uTtu2bVNSUtJZr+nv76/AwMAWGwA4E3NkHWA2m2U2m+1P0QGAp0lLS9PDDz+syMhIXXbZZdq5c6eWLl2qadOmSTq9Asvs2bO1ePFiDRs2TEOGDNGCBQsUHh6uiRMnGhsegNeikAUA6Omnn9aCBQv0hz/8QTU1NQoPD9fdd9+t7Oxs+zn333+/rFar7rrrLh09elSjR4/Wxo0bFRAQYGByAN6MdWTbgHVkATiC9VLPju8LAEe0pa/wuhHZwYMHKzAwUD4+Prrgggv04YcfGh0JAAAA7eB1hawkffbZZ+rdu7fRMQCgleXLlzt87r333tuJSQDA9XllIQsArurJJ59ssX/o0CEdP35cffv2lSQdPXpUPXv2VP/+/SlkAXg9t1p+Kz8/X2lpaQoPD5fJZNL69etbnWOxWDR48GAFBAQoMTFR27dvb3HcZDJp3Lhxio+P1yuvvNJFyQHAMRUVFfbt4YcfVkxMjPbs2aMjR47oyJEj2rNnj6688ko99NBDRkcFAMO5VSFrtVoVHR0ti8Vy1uPr1q1TZmamFi5cqOLiYkVHRyslJUU1NTX2cz755BMVFRXp7bff1pIlS/T55593VXwAaJMFCxbo6aef1vDhw+1tw4cP15NPPqkHHnjAwGQA4BrcqpBNTU3V4sWLNWnSpLMeX7p0qaZPn66MjAxFRUUpNzdXPXv21KpVq+znDBw4UJI0YMAA3XDDDSouLj7n5zU0NKiurq7FBgBd5T//+Y9OnTrVqr2pqanVG7YAwBu5VSF7Po2NjSoqKlJycrK9zcfHR8nJySooKJB0ekT32LFjkqT6+npt3rxZl1122TmvyXvCARhpwoQJuvvuu1v8D3dRUZHuueeeFn0dAHgrjylkDx8+rKamJoWGhrZoDw0NVVVVlaTT7wQfPXq0oqOjddVVV+n2228/72tneU84ACOtWrVKYWFhiouLk7+/v/z9/ZWQkKDQ0FCtXLnS6HgAYDivWrXg4osvVmlpqcPnn/kPh8VikcViUVNTUyemA4CWLrzwQr377rv68ssvtXfvXknSiBEj9LOf/czgZADgGjymkA0JCZGvr2+reWPV1dUKCwszKBUAdNzgwYNls9l0ySWXqFs3j+m2AaDDPGZqgZ+fn2JjY5WXl2dva25uVl5enpKSkjp0bbPZrLKyMhUWFnY0JgA47Pjx47rzzjvVs2dPXXbZZdq/f78kaebMmXrkkUcMTgcAxnOrQra+vl4lJSUqKSmRdHq9xZKSEnvnnpmZqRUrVmjNmjXas2eP7rnnHlmtVmVkZHTocy0Wi6Kios47nxYAnC0rK0ulpaX66KOPFBAQYG9PTk7WunXrDEwGAK7BrX5HtWPHDo0fP96+n5mZKUlKT0/X6tWrNXnyZB06dEjZ2dmqqqpSTEyMNm7c2OoBsLYym80ym82qq6tTUFBQh64FAI5av3691q1bp6uuukomk8neftlll+nf//63gckAwDW4VSF77bXXymaznfecGTNmaMaMGV2UCAA6z6FDh9S/f/9W7VartUVhCwDeyq2mFhiFqQUAjBAXF6cNGzbY988UrytXruzw3H8A8ARuNSJrFKYWADDCkiVLlJqaqrKyMp06dUpPPfWUysrK9Nlnn2nLli1GxwMAwzEi6wBGZAEYYfTo0SopKdGpU6c0cuRIvf/+++rfv78KCgoUGxtrdDwAMJzJ9lOTTmF3ZkS2trZWgYGBDn2Nq89j468fcL729BXegO8LAEe0pa9gagEAuLDm5maVl5erpqZGzc3NLY6NHTvWoFQA4BooZAHARW3dulW//vWv9c0337T67YnJZOK12QC8HoWsAywWiywWC//RANClfv/739tXLhgwYIDLT1UCgK7GHNk2YI4sAEc4ay5or169VFpaqqFDhzoxnXGYIwvAEW3pK1i1AABcVGJiosrLy42OAQAui6kFAOCiZs6cqblz56qqqkojR45U9+7dWxy/4oorDEoGAK6BQtYBzJEFYIRbbrlFkjRt2jR7m8lkks1m42EvABCFrEN4sxcAI1RUVBgdAQBcGoUsALioiy66yOgIAODSKGQBwIW8/fbbSk1NVffu3fX222+f99ybbrqpi1IBgGuikAUAFzJx4kRVVVWpf//+mjhx4jnPY44sAFDIAoBL+eFraH/8SloAQEusI+sAi8WiqKgoxcfHGx0FAAAA/8WbvdqAN3sBcIQz32BltVq1ZcsW7d+/X42NjS2O3XvvvR26dlfjzV4AHNGWvoKpBQDgonbu3KkbbrhBx48fl9VqVXBwsA4fPqyePXuqf//+blfIAoCzMbUAAFzUnDlzlJaWpu+//149evTQ1q1b9c033yg2NlZPPPGE0fEAwHBeWcgeP35cF110kebNm2d0FAA4p5KSEs2dO1c+Pj7y9fVVQ0ODIiIi9Nhjj+lPf/qT0fEAwHBeWcg+/PDDuuqqq4yOAQDn1b17d/n4nO6m+/fvr/3790uSgoKCVFlZaWQ0AHAJXjdH9quvvtLevXuVlpam3bt3Gx0HAM5p1KhRKiws1LBhwzRu3DhlZ2fr8OHDevnll3X55ZcbHQ8ADOdWI7L5+flKS0tTeHi4TCaT1q9f3+oci8WiwYMHKyAgQImJidq+fXuL4/PmzVNOTk4XJQaA9luyZIkGDBgg6fRvki644ALdc889OnTokF544QWD0wGA8dyqkLVarYqOjpbFYjnr8XXr1ikzM1MLFy5UcXGxoqOjlZKSopqaGknSW2+9pZ/97Gf62c9+1pWxAaBd4uLiNH78eEmnpxZs3LhRdXV1KioqUnR0tMHpAMB4bjW1IDU1Vampqec8vnTpUk2fPl0ZGRmSpNzcXG3YsEGrVq3S/PnztXXrVr322mt64403VF9fr5MnTyowMFDZ2dlnvV5DQ4MaGhrs+3V1dc69IQAAALSbWxWy59PY2KiioiJlZWXZ23x8fJScnKyCggJJUk5Ojn1awerVq7V79+5zFrFnzl+0aFHnBgeAHxg1apTDL1IpLi7u5DQA4No8ppA9fPiwmpqaFBoa2qI9NDRUe/fubdc1s7KylJmZad+vq6tTREREh3ICwPlMnDjR6AgA4DY8ppBtqzvuuOMnz/H395e/v78sFossFouampo6PxgAr7Zw4UKjIwCA23Crh73OJyQkRL6+vqqurm7RXl1drbCwMINSAUDH7dixQy+//LJefvllFRUVddrnfPvtt/rNb36jfv36qUePHho5cqR27NhhP26z2ZSdna0BAwaoR48eSk5O1ldffdVpeQDgp3hMIevn56fY2Fjl5eXZ25qbm5WXl6ekpKQOXdtsNqusrEyFhYUdjQkADjtw4IDGjBmjhIQEzZo1S7NmzVJ8fLxGjx6tAwcOOPWzvv/+e11zzTXq3r273nvvPZWVlekvf/mLLrjgAvs5jz32mJYvX67c3Fxt27ZNvXr1UkpKik6cOOHULADgKLeaWlBfX6/y8nL7fkVFhUpKShQcHKzIyEhlZmYqPT1dcXFxSkhI0LJly2S1Wu2rGLQXUwsAGOF3v/udTp48qT179mj48OGSpH379ikjI0O/+93vtHHjRqd91qOPPqqIiAi9+OKL9rYhQ4bY/2yz2bRs2TI98MAD+uUvfylJeumllxQaGqr169drypQpTssCAI4y2Ww2m9EhHPXRRx/Z11T8ofT0dK1evVqS9Mwzz+jxxx9XVVWVYmJitHz5ciUmJjrl8+vq6hQUFKTa2loFBgY69DWOPn1sFDf66wfcRnv6irPp0aOHPvvsM40aNapFe1FRkcaMGaPjx493NKpdVFSUUlJSdODAAW3ZskUDBw7UH/7wB02fPl2S9PXXX+uSSy7Rzp07FRMTY/+6cePGKSYmRk899dRPfoazvi8APFtb+gq3GpG99tprf7LwmjFjhmbMmOHUz2VEFoARIiIidPLkyVbtTU1NCg8Pd+pnff3113ruueeUmZmpP/3pTyosLNS9994rPz8/paenq6qqSpLOujLMmWM/xlrcADqbx8yR7UzMkQVghMcff1wzZ85s8cDVjh07NGvWLD3xxBNO/azm5mZdeeWVWrJkiUaNGqW77rpL06dPV25ubruvmZOTo6CgIPvG8oUAnI1CFgBc1B133KGSkhIlJibalwNMTExUcXGxpk2bpuDgYPvWUQMGDFBUVFSLtksvvVT79++XJPvqL21ZGSYrK0u1tbX2rbKyssM5AeCH3GpqgVGYWgDACMuWLeuyz7rmmmu0b9++Fm1ffvmlLrroIkmnH/wKCwtTXl6efY5sXV2dtm3bpnvuuees1zxTfANAZ3Grh72MxsNeABzhjg81FRYW6uqrr9aiRYv0P//zP9q+fbumT5+uF154QVOnTpV0emWDRx55RGvWrNGQIUO0YMECff755yorK1NAQMBPfoY7fl8AdL229BVMLQAAF3VmNZYfO3XqlLKyspz6WfHx8XrzzTf16quv6vLLL9dDDz2kZcuW2YtYSbr//vs1c+ZM3XXXXYqPj1d9fb02btzoUBELAJ2BEVkH/HBqwZdffsmILIDzctbIY2BgoFJSUvTCCy/YX0ywb98+/frXv9Z3332n//u//3NS4q7BiCwARzAi62SsWgDACDt37tSBAwc0cuRIbdq0SRaLRVdeeaVGjBih0tJSo+MBgOF42AsAXNQll1yiTz/9VLNnz9b1118vX19frVmzRrfddpvR0QDAJTAiCwAubMOGDXrttdeUlJSkvn376q9//asOHjxodCwAcAkUsgDgou6++2796le/0h//+Ed9/PHH+vzz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r2COLAC4KE8qYgCgM1DIAgAAwC15XSE7adIkXXDBBbr11luNjgIAAIAO8LpCdtasWXrppZeMjgEAAIAO8rpC9tprr1WfPn2MjgEAbXL48GFt2LBBb7/9tv7zn/8YHQcAXIJbFbL5+flKS0tTeHi4TCaT1q9f3+oci8WiwYMHKyAgQImJidq+fXvXBwUAJ/r73/+uoUOHatGiRVq4cKEuueQSvfjii0bHAgDDuVUha7VaFR0dfc432qxbt06ZmZlauHChiouLFR0drZSUFNXU1HRxUgBov/r6+hb7ixYt0vbt27V9+3bt3LlTb7zxhv785z8blA4AXIdbFbKpqalavHixJk2adNbjS5cu1fTp05WRkaGoqCjl5uaqZ8+eWrVqVbs+r6GhQXV1dS02AOhssbGxeuutt+z73bp1a/E/5NXV1fLz8zMiGgC4FLcqZM+nsbFRRUVFSk5Otrf5+PgoOTlZBQUF7bpmTk6OgoKC7FtERISz4gLAOf3rX//SCy+8oEmTJungwYN66qmnNHnyZIWFhSkkJETz58/Xs88+a3RMADCcx7yi9vDhw2pqalJoaGiL9tDQUO3du9e+n5ycrNLSUlmtVg0aNEhvvPGGkpKSznrNrKwsZWZm2vfr6uooZgF0usGDB2vDhg169dVXNW7cON17770qLy9XeXm5mpqaNGLECAUEBBgdEwAM5zEjso764IMPdOjQIR0/flwHDhw4ZxErSf7+/goMDNTLL7+sq666ShMmTOjCpAC83W233abCwkKVlpbq2muvVXNzs2JiYihiAeC/PGZENiQkRL6+vqqurm7RXl1drbCwsA5d22w2y2w229/9CwCd7d1339WePXsUHR2tlStXasuWLZo6dapSU1P14IMPqkePHkZHBADDecyIrJ+fn2JjY5WXl2dva25uVl5e3nlHXR1hsVgUFRWl+Pj4jsYEgJ80d+5cZWRkqLCwUHfffbceeughjRs3TsXFxQoICNCoUaP03nvvGR0TAAxnstlsNqNDOKq+vl7l5eWSpFGjRmnp0qUaP368goODFRkZqXXr1ik9PV3PP/+8EhIStGzZMr3++uvau3dvq7mz7XFmRLa2tlaBgYEOfY3JZOrw53amtvz1e8q9eMp9wHW1p6/4oX79+un9999XbGysjhw5oquuukpffvml/XhZWZnuvvtuffzxx86M3ek8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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": 33, "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", "
y_predyy_var
AAAA0.3993480.4608310.046009
AAAC-2.551728NaNNaN
AAAD-3.454428NaNNaN
AAAE-4.783908NaNNaN
AAAF-3.685388NaNNaN
............
YYYS-4.822342-5.2699870.291090
YYYT-3.635390-3.8214260.074489
YYYV-3.123463-3.1435360.074682
YYYW-4.837803-4.3065810.699467
YYYY-4.903341-4.4298130.417405
\n", "

160000 rows × 3 columns

\n", "
" ], "text/plain": [ " y_pred y y_var\n", "AAAA 0.399348 0.460831 0.046009\n", "AAAC -2.551728 NaN NaN\n", "AAAD -3.454428 NaN NaN\n", "AAAE -4.783908 NaN NaN\n", "AAAF -3.685388 NaN NaN\n", "... ... ... ...\n", "YYYS -4.822342 -5.269987 0.291090\n", "YYYT -3.635390 -3.821426 0.074489\n", "YYYV -3.123463 -3.143536 0.074682\n", "YYYW -4.837803 -4.306581 0.699467\n", "YYYY -4.903341 -4.429813 0.417405\n", "\n", "[160000 rows x 3 columns]" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pred = model.predict().join(data, lsuffix='_pred')\n", "pred" ] }, { "cell_type": "code", "execution_count": 34, "id": "06a1ec7f", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAxYAAAGFCAYAAABg02VjAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy89olMNAAAACXBIWXMAAA9hAAAPYQGoP6dpAABvlUlEQVR4nO3deVwTd/4/8FcIt5yKgCiKoqJUAQuCZ1GL4lmP1tquW5W1fnvI1i52d2Xd1dpuS62tdau29tS2265stWq9DxSr1YoFbwXvigcoIiBXgGR+f/hjdhJIDBAyJHk9H495dDL5zMx7kDJ5Z96fz0chCIIAIiIiIiKiJrCTOwAiIiIiIrJ8TCyIiIiIiKjJmFgQEREREVGTMbEgIiIiIqImY2JBRERERERNxsSCiIiIiIiajIkFERERERE1mb3cAZibRqPBzZs34e7uDoVCIXc4RESyEwQB9+/fR0BAAOzsbPv7Jt4jiIi0NeQeYXOJxc2bNxEYGCh3GERELU5ubi46dOggdxiy4j2CiKh+xtwjbC6xcHd3B/Dgh+Ph4SFzNERE8qmursamTZvQs2dPDBgwQPz7aMt4jyAi0lZSUoLAwECj7hE2l1jUPtr28PDgTYOIbNqhQ4cwZMgQ+Pj4AECLLP1ZuXIllixZgry8PISHh2P58uWIjo6ut+2QIUOwf//+OttHjx6NrVu3GnU+3iOIiOpnzD3CtotpiYhsUHV1NQ4dOoQBAwagS5cucoejV2pqKpKSkrBw4UJkZWUhPDwc8fHxuH37dr3tf/jhB9y6dUtcTp8+DaVSicmTJ5s5ciIi28TEgojIhlRXV2PdunVo166d3KE81NKlSzFr1iwkJCQgNDQUq1atgqurK7788st627du3Rr+/v7isnv3bri6ujKxICIyEyYWREQ2Qq1Wo6qqCgMHDkTnzp3lDsegqqoqZGZmIi4uTtxmZ2eHuLg4HD582KhjfPHFF3jmmWfQqlUrvW1UKhVKSkq0FiIiahyb62NBRGSLqqqqsG7dOowePRodO3aUO5yHKigogFqthp+fn9Z2Pz8/ZGdnP3T/jIwMnD59Gl988YXBdikpKVi0aFGTYiWyZWq1GtXV1XKHQU3g4OAApVJpkmMxsSAisgFbt27FwIED4eXlJXcoZvHFF1+gd+/eejt610pOTkZSUpL4unb0EyIyTBAE5OXloaioSO5QyAS8vLzg7+/f5EE8mFgQEVmxqqoq3LhxA+PGjYO9veX8yffx8YFSqUR+fr7W9vz8fPj7+xvct6ysDGvXrsUbb7zx0PM4OTnBycmpSbES2aLapMLX1xeurq4tclQ5ejhBEFBeXi4OitHU/neWc5chIqIGUalUWL9+PQYNGmRRSQUAODo6IjIyEmlpaZgwYQKAB7Nip6WlITEx0eC+33//PVQqFX7/+9+bIVIi26NWq8Wkok2bNnKHQ03k4uICALh9+zZ8fX2bVBbFzttERFbq+vXrGDRokEX0qahPUlISPvvsM3z11Vc4d+4cXnrpJZSVlSEhIQEAMG3aNCQnJ9fZ74svvsCECRP4gYeomdT2qXB1dZU5EjKV2n/LpvaXsaivsFJSUvDDDz8gOzsbLi4uGDBgABYvXoyQkBC5QyMiajFUKhW2bduGJ554wmQd8uQwZcoU3LlzBwsWLEBeXh4iIiKwY8cOsUP3tWvXYGen/f1YTk4ODh48iF27dskRMpFNYfmT9TDVv6VFJRb79+/H7Nmz0bdvX9TU1OBvf/sbRowYgbNnzxocTpCIyFbUzlMRGxtr0UlFrcTERL2lT+np6XW2hYSEQBCEZo6KiIjqY1GJxY4dO7Rer1mzBr6+vsjMzMRjjz0mU1RERC1DZWUlNBoNxowZYzOjPxERUcthUYmFruLiYgAPZlvVR6VSQaVSia85+RERWaPKykqsW7cOw4YNQ0BAgNzhEJGN2rx5s1nPN27cuGY7dlBQEF599VW8+uqrzXYOczLH9Vhs522NRoNXX30VAwcORK9evfS2S0lJgaenp7hwfHIiskZHjx7F0KFDmVQQ4UFfm9qFqD65ubn4wx/+gICAADg6OqJTp06YM2cO7t69K3doFs1iE4vZs2fj9OnTWLt2rcF2ycnJKC4uFpfc3FwzRUhE1PwqKytx6NAhDBw4EO3atYNGo5E7JCKiFu3y5cuIiorChQsX8J///AcXL17EqlWrkJaWhv79+6OwsFCWuNRqtcX/DbfIxCIxMRFbtmzBvn370KFDB4NtnZyc4OHhobUQEVmDiooKrFu3DkFBQXKHQkRkMWbPng1HR0fs2rULsbGx6NixI0aNGoU9e/bgxo0bmD9/vtj2/v37ePbZZ9GqVSu0b98eK1euFN8TBAGvv/46OnbsCCcnJwQEBOCVV14R31epVHjttdfQvn17tGrVCjExMVqDTqxZswZeXl748ccfERoaCicnJ3z++edwdnauM6P5nDlzMGzYMPH1wYMHMXjwYLi4uCAwMBCvvPIKysrKxPdv376NcePGwcXFBZ07d8a3335rwp+gfhaVWAiCgMTERGzYsAF79+5F586d5Q6JiEgWNTU1qKmpQVxcHMufiIiMVFhYiJ07d+Lll18WJ4ar5e/vj6lTpyI1NVUcXW7JkiUIDw/HsWPHMG/ePMyZMwe7d+8GAKxfvx4ffPABPvnkE1y4cAEbN25E7969xeMlJibi8OHDWLt2LU6ePInJkydj5MiRuHDhgtimvLwcixcvxueff44zZ85g6tSp8PLywvr168U2arUaqampmDp1KgDg0qVLGDlyJJ588kmcPHkSqampOHjwoNYIejNmzEBubi727duHdevW4aOPPhJn125OFtV5e/bs2fjuu++wadMmuLu7Iy8vDwDg6elZ55ejpcjNzcVzzz2H27dvw97eHv/4xz8wefJkucMiIgtW+6Ri4sSJ8Pf3lzscIiKLceHCBQiCgJ49e9b7fs+ePXHv3j3cuXMHADBw4EDMmzcPANC9e3f8/PPP+OCDDzB8+HBcu3YN/v7+iIuLg4ODAzp27Ijo6GgAD+bZWb16Na5duyZ++fPaa69hx44dWL16Nd5++20AD4YI/+ijjxAeHi7G8Mwzz+C7777DzJkzAQBpaWkoKirCk08+CeBB/+GpU6eKnbC7deuGDz/8ELGxsfj4449x7do1bN++HRkZGejbty+ABxOH6rtmU7KoJxYff/wxiouLMWTIELRr105cUlNT5Q5NL3t7eyxbtgxnz57Frl278Oqrr2o9qiIi66LRaMSlOQiCgC1btmD48OFwc3MTt9vZ2YkLEREZZux8N/3796/z+ty5cwCAyZMno6KiAl26dMGsWbOwYcMG1NTUAABOnToFtVqN7t27w83NTVz279+PS5cuicdzdHREWFiY1jmmTp2K9PR03Lx5EwDw7bffag0jfuLECaxZs0bruPHx8dBoNLhy5QrOnTsHe3t7REZGisfs0aOHWYYht6gnFpY46VFt8gM8eMTm4+ODwsJCTuhHRA1WXl6O/Px8TJo0ySomvyMiMreuXbtCoVDg3LlzmDhxYp33z507B29vb7Rt2/ahxwoMDEROTg727NmD3bt34+WXX8aSJUuwf/9+lJaWQqlUIjMzs87fa+mXQi4uLnVmve7bty+Cg4Oxdu1avPTSS9iwYQPWrFkjvl9aWooXXnhBqz9HrY4dO+L8+fMPjb258KutJoqNjYVCoYBCoYCjoyN69uyJ7777rt62mZmZUKvVTRryduXKlQgKCoKzszNiYmKQkZFhsL1arcY//vEPdO7cGS4uLggODsabb76plaS9/vrr4jXULj169NA6zk8//YRx48YhICAACoUCGzdubPQ1EFHDlZeXY/369XBxcWFSQdQAHHqWpNq0aYPhw4fjo48+QkVFhdZ7eXl5+PbbbzFlyhTxw/4vv/yi1eaXX37RKilycXHBuHHj8OGHHyI9PR2HDx/GqVOn0KdPH6jVaty+fRtdu3bVWowpYZ06dSq+/fZbbN68GXZ2dhgzZoz43qOPPoqzZ8/WOW7Xrl3h6OiIHj16oKamBpmZmeI+OTk5dTqENwcmFk0gCAKOHTuG9957D7du3UJOTg5GjhyJadOm4cqVK1ptCwsLMW3aNHz66aeNPl9qaiqSkpKwcOFCZGVlITw8HPHx8QY74yxevBgff/wxVqxYgXPnzmHx4sV49913sXz5cq12jzzyCG7duiUuBw8e1Hq/rKwM4eHhWqMhEFFdjSlJkpZP6ZZQ1W67du0aRowYId6QDO1T27G7pqbGYDsiIlu0YsUKqFQqxMfH46effkJubi527NiB4cOHo3379njrrbfEtj///DPeffddnD9/HitXrsT333+POXPmAHgwqtMXX3yB06dP4/Lly/j3v/8NFxcXdOrUCd27d8fUqVMxbdo0/PDDD7hy5QoyMjKQkpKCrVu3PjTGqVOnIisrC2+99RaeeuopODk5ie/99a9/xaFDh5CYmIjjx4/jwoUL2LRpk9h5OyQkBCNHjsQLL7yAI0eOIDMzE88//7x5+iMLNqa4uFgAIBQXFzf5WDk5OQIA4fTp0+K2U6dOCQCE7du3i9sqKyuFwYMHC19//XWTzhcdHS3Mnj1bfK1Wq4WAgAAhJSVF7z5jxowR/vCHP2htmzRpkjB16lTx9cKFC4Xw8HCj4wAgbNiwwej2RGSYWq3WWqRKSkqEdevWCTU1NUbvU11dLS6G2tUy5d9FS8efhXXIzs6udyHTqKioEM6ePStUVFTIHUqjXb16VZg+fbrg5+cnODg4CIGBgcIf//hHoaCgQGzTqVMnYdGiRcLkyZMFV1dXwd/fX/jXv/4lvr9hwwYhJiZG8PDwEFq1aiX069dP2LNnj/h+VVWVsGDBAiEoKEhwcHAQ2rVrJ0ycOFE4efKkIAiCsHr1asHT01NvjNHR0QIAYe/evXXey8jIEIYPHy64ubkJrVq1EsLCwoS33npLfP/WrVvCmDFjBCcnJ6Fjx47C119/LXTq1En44IMP6j2XoX/ThvxdtKg+Fi1NZmYmvL29ERoaCgC4fv065s+fDycnJ7EjjiAImDFjBoYNG4bnnnuuzjHefvttcWQAfc6ePQt/f39kZmYiOTlZ3G5nZ4e4uDgcPnxY774DBgzAp59+ivPnz6N79+44ceIEDh48iKVLl2q1u3DhAgICAuDs7Iz+/fsjJSUFHTt2NPpnQUSmp1KpsGHDBowYMaJODS4RNZy0HCokJETGSEhunTp10uq3UJ+rV68afH/ChAmYMGGC3vcdHBywaNEiLFq0qN73Z8yYgRkzZujd/8iRI3rf69u3L3bt2qX3fX9/f2zZskVrW32fQ02NiUUTZGVlobi4GO7u7lCr1aisrISLiwtWrVolDi32888/IzU1FWFhYWK/hG+++UYc5/jFF1/E008/bfA8AQEBuH37NtRqNfz8/LTe8/PzQ3Z2tt59582bh5KSEvTo0QNKpRJqtRpvvfWWOBYyAMTExGDNmjUICQnBrVu3sGjRIgwePBinT5+Gu7t7Y340RDZLWm5kbDlUfe3KyspgZ2eH8ePHG/X/ofS89vbG/WmvHb2k9r9ERERNwcSiCbKysjB79my88sorKCoqwmuvvYaBAwdqZZ+DBg0yWNfcunVrtG7dutli/O9//4tvv/0W3333HR555BEcP34cr776KgICAjB9+nQAwKhRo8T2YWFhiImJQadOnfDf//5XHEOZiMyntLQUP/zwA0aPHt2sfx+IiIhMiYlFE2RlZWHWrFno2rUrAOCjjz5CWFgYZs2ahaCgIKOO0ZBSKKVSifz8fK338vPzDY4u8Oc//xnz5s3DM888AwDo3bs3fvvtN6SkpIiJhS4vLy90794dFy9eNOoaiMi0fv31V4waNQo+Pj7scE1ERBaDiUUjXb58GUVFRejVq5e4LTQ0FMHBwfjuu+/wt7/9zajjGFsKVTvRSVpamljPp9FokJaWpjWFu67y8vI6ZRZKpdLgh5XS0lJcunTJLLV4RNZAX/mTof/P6tvn/v37OH36NB577DGxjUqlqvfYukPOSsufDJ1XeozafYwtnSIiIjKEd5NGyszMhIODA7p37661/fHHH8eGDRuMTiwaUgqVlJSE6dOnIyoqCtHR0Vi2bBnKysqQkJAgtlmxYgU2bNiAtLQ0AMC4cePw1ltvoWPHjnjkkUdw7NgxLF26FH/4wx/EfV577TWMGzcOnTp1ws2bN7Fw4UIolUo8++yzYpvS0lKtJxhXrlzB8ePH0bp1a3byJjKB+/fvY+PGjVqliUTUfNiRm8j0mFg0UlZWFrp16wZHR0et7XFxcVi1ahWuX7+ODh06mPScU6ZMwZ07d7BgwQLk5eUhIiICO3bs0OrQXVBQoDVV/PLly/GPf/wDL7/8Mm7fvo2AgAC88MILWLBggdjm+vXrePbZZ3H37l20bdsWgwYNwi+//KI16+Svv/6KoUOHiq+TkpIAANOnT3/oqApEZFhVVRU0Gg1Gjx6NNm3ayB0OERFRoygEQTIFsw0oKSmBp6cniouL4eHhIXc4RGQFmlIKVVJSgs2bN2Py5Mlwdnau0645S6Fq8e/i//BnYR0aOss2n1g0TGVlJa5cuYLOnTvX+3eLLI+hf9OG/F3kEwsioibSl1gYGm62vLwcgiBg27ZtGDNmjNYfcunxpLOtGhpSVvpeY4aeJSIiairecYiIZHD//n0UFRXhiSeegJubm9zhEBERNRkTCyIiMysuLsb27dsxYsQIoyfRIyKyBA0tQ2uqhpaxzZgxA1999RVSUlIwb948cfvGjRsxceJE2FgPAZNjYkFEVsPYOR8a82FeOju17v5qtbre93TjqS1/unTpEsaPHw9vb+96z6WvfElfuZOx+xMREeDs7IzFixfjhRde0Pt3mBqHX5UREZlJSUkJduzYgeDgYN7MiIhkEhcXB39/f6SkpOhtc/DgQQwePBguLi4IDAzEK6+8grKyMgAPhvaXzmO2ceNGKBQKrFq1Suscf//735vvIlooJhZERGZQXl6OXbt2YcCAAVAoFHKHQ0Rks5RKJd5++20sX74c169fr/P+pUuXMHLkSDz55JM4efIkUlNTcfDgQXFC4tjYWJw9exZ37twBAOzfvx8+Pj5IT08HAFRXV+Pw4cMYMmSIuS6pxWBiQURWw87OzqhFo9GIiyE1NTXiom9/jUYDJycncalPcXEx7OzsMGXKFAQGBsLDw8Pg8fTFZ29vLy6Gro+IiAybOHEiIiIisHDhwjrvpaSkYOrUqXj11VfRrVs3DBgwAB9++CG+/vprVFZWolevXmjdujX2798PAEhPT8fcuXPF1xkZGaiursaAAQPMek0tAe9ARETNqKioCJs3b0ZVVRVatWoldzhERPT/LV68GF999RXOnTuntf3EiRNYs2YN3NzcxCU+Ph4ajQZXrlyBQqHAY489hvT0dBQVFeHs2bN4+eWXoVKpkJ2djf3796Nv375wdXWV6crkw8SCiKgZHT9+HOPGjeNka0RELcxjjz2G+Ph4JCcna20vLS3FCy+8gOPHj4vLiRMncOHCBQQHBwMAhgwZgvT0dBw4cAB9+vSBh4eHmGzs378fsbGxclyS7Dh0CBFRMygsLEROTo5N1tgSEVmKd955BxEREVrD1j766KM4e/Ysunbtqne/2NhYvPrqq/j+++/Fv/NDhgzBnj178PPPP2Pu3LnNHXqLxMSCiKyGvhmwDb2n24+hurpaXHdwcKj3PNI2AFBZWSmuOzs74969e9i6dSsmTJigdS7pkLXSIWr1nYeIzEM690JD50Ugy9a7d29MnToVH374objtr3/9K/r164fExEQ8//zzaNWqFc6ePYvdu3djxYoVAICwsDB4e3vju+++w5YtWwA8SCxee+01KBQKDBw4UJbrkRsTCyIiE1KpVFAoFHjiiSdY/kRENscSE7M33ngDqamp4uuwsDDs378f8+fPx+DBgyEIAoKDgzFlyhSxjUKhwODBg7F161YMGjRI3M/DwwMhISE226eOiQURkYncu3cPe/fuxdNPP82nEERELdCaNWvqbAsKCoJKpdLa1rdvX+zatcvgsTZu3Kj12s7ODoWFhU0N0aIxsSAiq2FoqFV97+mWNSmVSnFdWiZlqETKwcEBGo0GBw4cwJgxY2BnZwe1Wl1nBmxpDBwWloiIrA0TCyKiJrp79y7KysowefLkh86NQUREZK34lRkRURMUFBRg+/bt8Pb25ozazWDlypUICgqCs7MzYmJikJGRYbB9UVERZs+ejXbt2sHJyQndu3fHtm3bzBQtEZFt4xMLIrJKuk8OpK/v378vrjs7O2u1k5Y8ScuipLNql5eXAwAEQcDNmzcxadIkuLm5PTQGfaVQhtrZstTUVCQlJWHVqlWIiYnBsmXLEB8fj5ycHPj6+tZpX1VVheHDh8PX1xfr1q1D+/bt8dtvv8HLy8v8wRMR2SAmFkREjXD37l0cPXoUI0eOtMnZVc1h6dKlmDVrFhISEgAAq1atwtatW/Hll19i3rx5ddp/+eWXKCwsxKFDh8R+MEFBQQbPoVKptDptlpSUmO4CiKycIAhyh0AmYqp/S34tRkTUQCUlJdi7dy8GDx4sdyhWq6qqCpmZmYiLixO32dnZIS4uDocPH653nx9//BH9+/fH7Nmz4efnh169euHtt9/WmjNEV0pKCjw9PcUlMDDQ5NdCZG1qE/fap7dk+Wr/LZs6oiGfWBBRi2dsqZChCfKkr6VPGHSPLS2Nkn4gvXfvnvjfgIAATJkyRWxrbImTPix9qqugoABqtRp+fn5a2/38/JCdnV3vPpcvX8bevXsxdepUbNu2DRcvXsTLL7+M6upqLFy4sN59kpOTkZSUJL4uKSlhckH0EEqlEl5eXrh9+zaAB39T2cfMMgmCgPLycty+fRteXl5aJcCNwcSCiMhId+/exYEDB/D000/b7ORHLZlGo4Gvry8+/fRTKJVKREZG4saNG1iyZInexMLJyUmr/wwRGcff3x8AxOSCLJuXl5f4b9oUTCyIiIx0/vx5xMfHM6kwAx8fHyiVSuTn52ttz8/P13vza9euHRwcHLS+cevZsyfy8vJQVVUFR0fHZo2ZyJYoFAq0a9cOvr6+deYDIsui+3ezKZhYEBE9xO3bt3Hx4kX0799f7lBshqOjIyIjI5GWloYJEyYAePBEIi0tDYmJifXuM3DgQHz33XfQaDRiedn58+fRrl07JhVEzUSpVJrsQylZPhb2ElGjaTQacdG33RQTxtnZ2Wkt+o4tbVNRUaG11NTUiEvtjVCpVMLBwUFrUavV4qLRaJCXl4e0tDT07dsX3t7e8Pb2Nvr6dOOmhklKSsJnn32Gr776CufOncNLL72EsrIycZSoadOmITk5WWz/0ksvobCwEHPmzMH58+exdetWvP3225g9e7Zcl0BEZFP4xIKISI+Kigo4ODjgiSee4JCyMpgyZQru3LmDBQsWIC8vDxEREdixY4fYofvatWtaCVtgYCB27tyJP/3pTwgLC0P79u0xZ84c/PWvf5XrEoiIbIpCsLFBiEtKSuDp6Yni4mJ4eHjIHQ6RRdM3ClNzT/hmaPSnWhUVFVqvjR1Cr3YkqLy8PKSnp+PJJ5+EUqnU6uCre3329pb9HQ3/Lv4PfxbWIScnp9H7hoSEmDASIsvXkL+Lln03JCJZ6ftQb4pEQvrh3dAH+ZqaGqPOKx06VtrRUDfhUCqVqKmpwaFDhzBp0qQ6M3Prnp+IjLN582Zxfdy4cTJGQkTNhXdHIiKJW7duQaPR4KmnnuK47ERERA3A3oRERP/frVu3kJ6ejjZt2jCpICIiaiA+sSAii1NSUiKuS/s+3L9/X1zXHf7wYZ2vBUFAcXExxo4dC6VSierqaq1jc1QnItNhWRSRdWJiQUQ27+bNmzhx4gRGjRplkuFxiegBaQJBRNaPX8ERkU0rLCzEwYMHMXToULlDISIismhMLIjIZuXn56NVq1aYMGFCvaM/ERERkfFYCkVEJmeKeSykx9Ad3lXa90Hf/BLS4WV1X1dXV+PmzZs4fPgwxo8fDycnJ3FfFxcXsZ1KpRLXpcPSsr8FERFRXbw7EpHNEQQBly5dwrhx47QSEyIiImo8PrEgIpty/fp15OfnY/DgwXKHQkREZFWYWBCRyRkqFTI06pK+8ifp7Nq67aTlSpWVleK67ozawIOkorb8qb73dfFpBhERkfEsshRq5cqVCAoKgrOzM2JiYpCRkSF3SETUwpWXl6NVq1YYP348HB0d5Q6HiIjI6lhcYpGamoqkpCQsXLgQWVlZCA8PR3x8PG7fvi13aETUQuXm5mLbtm3w8vJiUkFERNRMLC6xWLp0KWbNmoWEhASEhoZi1apVcHV1xZdffil3aEQ2TaPRiIux7XQXe3t7campqREXXZWVleKiVCrFxdXVtc6iVCpx6tQpPPnkk3B0dISDg4PWPk5OTloLERERNY5FJRZVVVXIzMxEXFycuM3Ozg5xcXE4fPhwvfuoVCqUlJRoLURkG65evYrCwkIxqSAiIqLmY1GJRUFBAdRqNfz8/LS2+/n5IS8vr959UlJS4OnpKS6BgYHmCJWIZHblyhX88ssv8PHxgUKhkDscIiIiq2f1o0IlJycjKSlJfF1SUsLkgiyWtMxIrknamhqDdJ/q6mqt93QntatVXl6u93jS91xdXcUYy8vLMXHiRCiVSmg0Gq3z6k64R0Ty2bx5s7g+bty4Rh8nJyfHFOEQURNY1N3Vx8cHSqUS+fn5Wtvz8/Ph7+9f7z6smyayLZcvX8bFixcxYsQIuUMhIgskTVBCQkJkjITI8lhUKZSjoyMiIyORlpYmbtNoNEhLS0P//v1ljIyIWoK8vDxkZmZi6NChcodCRERkcyzqiQUAJCUlYfr06YiKikJ0dDSWLVuGsrIyJCQkyB0aEcno1q1b6NChAyZOnMhSJyIiIhlY3N13ypQpuHPnDhYsWIC8vDxERERgx44ddTp0E1kjufpV6KNvaFnpbNi67QyVJkr3k15rbd+J+o6hUqlw+fJlHD9+HJ06dRKTCuks3ADg5uZWbzwt7WdKRERkqSwusQCAxMREJCYmyh0GEbUAgiDg+vXreOKJJ/ikgoiISEa8CxORxTp//jxKSkrw2GOPyR0KERGRzWNiQWRDzFUCpFvuVFFRYdR+0nIl6VC0uiVXFRUVuHz5Mk6dOoUJEyZAqVTWOZZu+RQRERE1LxYXE5HFKS0tRevWrTF27FiWPxEREbUQTCyIyKJcuHAB+/btg6enZ71PKoiIiEge/KqPyIYYKn/SN8KToX2k5UqGRntycHAQ16UjP+nOtC09Rn1JQ3l5Oc6fP4/x48eL70vjM7a8iyNBERERmR7vrkRkEc6fP4/y8nKMGzeOTyqIiIhaICYWRNTi5eTkIDs7G97e3nKHQkRERHqwFIrIyuiWNDW1PKimpkbrtbSztLTESTryk+6x9JVZ6SotLa1z7NpyqTFjxtT7pIJlTURERC0DEwsiarGys7ORl5eHIUOGyB0KERERPQS/6iOiFik3NxcXLlzg5HdEREQWgokFEbU4165dg5+fH8aMGcNSJyIiIgvBUigiK9PYD+LGDjdrTH8Jad8LQLvvhHRIWd1jK5VKnDlzBpcuXULXrl3F93XbSV+bazZxIiIiMox3YSJqMTQaDe7evYuxY8cySSAAwMqVKxEUFARnZ2fExMQgIyNDb9s1a9ZAoVBoLc7OzmaMlqxNTk6OuBDRw/GJBRG1CGfOnIGDgwP7VJAoNTUVSUlJWLVqFWJiYrBs2TLEx8cjJycHvr6+9e7j4eGh9SFQoVCYK1wiIpvHrwSJbJRGo9G7GFJeXi4u0n3UarW43L17V2uRUiqV4lJdXY3q6mqcPHkSly9fRteuXcVj2Nvbi4shdnZ24kLWZenSpZg1axYSEhIQGhqKVatWwdXVFV9++aXefRQKBfz9/cXFz8/PjBETEdk23omJSFYlJSUICAjAiBEjmByQqKqqCpmZmYiLixO32dnZIS4uDocPH9a7X2lpKTp16oTAwECMHz8eZ86cMXgelUqFkpISrYWIiBqHd3Eiks3p06dx5MgReHp6MqkgLQUFBVCr1XWeOPj5+SEvL6/efUJCQvDll19i06ZN+Pe//w2NRoMBAwbg+vXres+TkpICT09PcQkMDDTpdRAR2RL2sSCyIMaMgGSolMnQh/fq6mpx3cXFRe/xpCM+VVZW1tvOzc1N77FrZ9IuKSnBnTt3MHbsWLEOXhqfdMbvh5VDEQFA//790b9/f/H1gAED0LNnT3zyySd48803690nOTkZSUlJ4uuSkhImF0REjcS7NRGZ3alTpxAYGIhRo0bJHQq1UD4+PlAqlcjPz9fanp+fD39/f6OO4eDggD59+uDixYt62zg5OWkNgUxERI3H2gMiMqsTJ07gxo0b8PT0lDsUasEcHR0RGRmJtLQ0cZtGo0FaWprWUwlD1Go1Tp06hXbt2jVXmEREJMEnFkRkNmq1Gq6uroiPj+cwoPRQSUlJmD59OqKiohAdHY1ly5ahrKwMCQkJAIBp06ahffv2SElJAQC88cYb6NevH7p27YqioiIsWbIEv/32G55//nk5L8PmbN682ST7jhs3zhThEJEZMbEgsiDGdHA2NFO2oT4a0r4TKpVK7/Gl7aQj6Ej7QejOvO3m5oasrCyUl5dj0KBBemPQR7efBzt624YpU6bgzp07WLBgAfLy8hAREYEdO3aIHbqvXbum9btw7949zJo1C3l5efD29kZkZCQOHTqE0NBQuS6BiMimMLEgomZ34cIF5OfnY+TIkXKHQhYmMTERiYmJ9b6Xnp6u9fqDDz7ABx98YIaoiIioPkwsiKhZXbp0Cd26dUPXrl1Z/kRERGTFmFgQWYHGDM1qqLxIul5aWqp3P2k73fInAMjKysK9e/cQEhICQRAgCILBMiZjhtMlIiKilol3biJqFjU1NaiursawYcP4pIKIiMgG8IkFEZlcZmYmvL29ERMTI3coREREZCZMLIisgKGyIekIT8bOvO3s7Cyu604eJh0Jqm3btuJ6bTlWZmYmSktLERMTU++M2obKnVj+REREZLmYWBCRyRQWFqJr167w8PBg+RMREZGN4deDRGQSv/zyC06cOAFPT08mFTaqoqIC5eXl4uvffvsNy5Ytw65du2SMioiIzIVPLIgsSGNGTVKr1eK6tKxJd1QoKemHQ1dXV633XFxcxPWKigoAwN27d1FeXo7HHnsMarW6zghRLHGyDePHj8ekSZPw4osvoqioCDExMXBwcEBBQQGWLl2Kl156Se4QiYioGfFuT0RNkpmZCScnJ8TGxvJJhY3LysrC4MGDAQDr1q2Dn58ffvvtN3z99df48MMPZY6OiIiaG59YEFGjHTlyBCqVCq1atZI7FGoBysvL4e7uDgDYtWsXJk2aBDs7O/Tr1w+//fabzNEREVFz4xMLImqU6upq+Pr6YvDgwXxSQQCArl27YuPGjcjNzcXOnTsxYsQIAMDt27fh4eEhc3RERNTc+MSCyEhNnRXaUJ8GY48nbSedbdvQeaRDx0r7Tki3A9rDyEr7YkiHoQUezLB96NAhODk5ITIyst7zGroezrxtvRYsWIDf/e53+NOf/oRhw4ahf//+AB48vejTp4/M0RERUXNjYkFEDXL27Fmo1Wo8+uijcodCLcxTTz2FQYMG4datWwgPDxe3P/7445g4caKMkRERkTkwsSAio+Xk5CAkJAR2dnYsf6J6+fv7o7S0FLt378Zjjz0GFxcX9O3bl78vREQ2gIkFkZGaWppj7P5NLSmSzrQNQGvoV2n5U2VlpVY76TCySqVSXK8tn8rIyAAAhIWFie9Jy6QMDWXbmFIvsjx3797F008/jX379kGhUODChQvo0qULZs6cCW9vb7z//vtyh0hERM2Id3Eieqiqqiq4uLggOjpa7lCoBfvTn/4EBwcHXLt2TWv+kylTpmDHjh0yRkZERObAJxZEpJcgCDhy5AgCAwPRu3dvucOhFm7Xrl3YuXMnOnTooLW9W7duHG6WLF5OTo64HhISImMkRC0XEwsiMzHFqEnSkaCk7aTHlpYk6b5XXFwsruvOqF1fDIcOHYKbmxseeeSRetvpzrCtD0d7sg1lZWX1/l4VFhbW+b0kepjNmzeL6+PGjZMxEiIyFu/wRFSHIAgoKChAWFgYBg0aJHc4ZCEGDx6Mr7/+WnytUCig0Wjw7rvvYujQoTJGRkRE5sAnFkSkRRAE/PTTT3BxcUFMTIzc4ZAFeffdd/H444/j119/RVVVFf7yl7/gzJkzKCwsxM8//yx3eERE1Mz4xIKItOTn5zOpoEbp1asXzp8/j0GDBmH8+PEoKyvDpEmTcOzYMQQHB8sdHhERNTM+sSAyE0OzZtvb/+9/RUMzdOtrp2/YV13S90pLS7Xec3Z2xpEjRxAeHo4BAwbojUetVj/0XMZeH/tbWB9PT0/Mnz9f7jCIiEgGvKsTkVj+ZG9vrzWfBVFDrF69Gt9//32d7d9//z2++uorGSIiIiJzYmJBZOMEQUBNTQ26dOmCqKgoucMhC5aSkgIfH5862319ffH222/LEBEREZkTS6GITMjQjNPS8iBpaZDufoZKpqTlSx4eHuK6dNhXaVmUIW5ubhAEAfv27YOfnx8iIiLqPYbukLLGDDGre31SLH+yXteuXUPnzp3rbO/UqROuXbsmQ0Rk7aRzSxCR/CzmDn/16lXMnDkTnTt3houLC4KDg7Fw4UJUVVXJHRqRxTpx4gQ8PT31zlNB1BC+vr44efJkne0nTpxAmzZtZIiIiIjMyWKeWGRnZ0Oj0eCTTz5B165dcfr0acyaNQtlZWV477335A6PyKIIgoAzZ84gLCyMTxDIZJ599lm88sorcHd3x2OPPQYA2L9/P+bMmYNnnnlG5uiIiKi5WUxiMXLkSIwcOVJ83aVLF+Tk5ODjjz9mYkFmYcxoRoY+pBsa+UnfsaUjMAHas2WrVCpx3VD5k7R0SalUQhAEpKWloU2bNnrPJd2HiQcZ680338TVq1fx+OOPi7/vGo0G06ZNYx8LIiIbYDGJRX2Ki4vRunVrg21UKpXWB7CSkpLmDouoxRIEAZWVlWjXrh3Ln8jkHB0dkZqaijfffBMnTpyAi4sLevfujU6dOskdGhERmYHFJhYXL17E8uXLH/q0IiUlBYsWLTJTVEQtlyAI2LNnD8LDw5lUULPq3r07unfvLncYRERkZrInFvPmzcPixYsNtjl37hx69Oghvr5x4wZGjhyJyZMnY9asWQb3TU5ORlJSkvi6pKQEgYGBTQuabFJTS4IMTXwnPba0nVKp1Gqnr+RJWrqke57aY+zZswdt27aFr68vgLqT20mPLS3bMjTZHZGUWq3GmjVrkJaWhtu3b9f5Xdy7d69MkRERkTnI/glh7ty5mDFjhsE2Xbp0Eddv3ryJoUOHYsCAAfj0008fenwnJyeDMxETWTtBEHD79m30798fjo6OcodDVmzOnDlYs2YNxowZg169ekGhUMgdElmJzZs3i+vjxo2TMRIiMkT2xKJt27Zo27atUW1v3LiBoUOHIjIyEqtXr2anUqKHEAQB27dvR0BAACIiIoye44KoMdauXYv//ve/GD16tNyhEBGRDGRPLIx148YNDBkyBJ06dcJ7772HO3fuiO/5+/vLGBlRy3X9+nUxqSBqbo6OjujatavcYRARkUwsJrHYvXs3Ll68iIsXL6JDhw5a7wmCIFNU1JIYmvVaLtKYjBmuFjA867W+vhi6+wiCgP3792PAgAHo1KmTOJSsdH/dGKQlg9KR1AyVEhp7TWQb5s6di3/9619YsWIFy6CIiGyQxXwSmDFjBgRBqHchov+pLX9q06YN+1SQWR08eBDffvstgoODMW7cOEyaNElraYyVK1ciKCgIzs7OiImJQUZGhlH7rV27FgqFAhMmTGjUeYmIqOEs5okFET2cRqNBVVUVwsPD0b59e7nDIRvj5eWFiRMnmux4qampSEpKwqpVqxATE4Nly5YhPj4eOTk54uhm9bl69Spee+01DB482GSxEBHRwzGxIKshVymOoWFkpfSVMQHas16Xl5eL67qlUBUVFeK6tETJzc0NGo0GW7ZsQXBwMLp27SqeQ9rOUAxSHEmNGmP16tUmPd7SpUsxa9YsJCQkAABWrVqFrVu34ssvv8S8efPq3UetVmPq1KlYtGgRDhw4gKKiIoPn4CSqRESmYzGlUERk2JEjR9C5c2d2niVZ1dTUYM+ePfjkk09w//59AA+GCS8tLW3QcaqqqpCZmYm4uDhxm52dHeLi4nD48GG9+73xxhvw9fXFzJkzjTpPSkoKPD09xYXzHBERNR6fWBBZOI1Gg+PHj6Nfv35QKBRa374SmdNvv/2GkSNH4tq1a1CpVBg+fDjc3d2xePFiqFQqrFq1yuhjFRQUQK1Ww8/PT2u7n58fsrOz693n4MGD+OKLL3D8+HGjz8NJVImITIeJBZGRTDkCkrT0CdAe1cnZ2bne7bqcnJyg0WiwdetWBAUFiWVSuuVT+kamMsUM2hwJiqTmzJmDqKgonDhxAm3atBG3T5w4EbNmzWrWc9+/fx/PPfccPvvsM/j4+Bi9HydRpcbIyckR10NCQmSMhKhlYWJBZKEEQUB5eTm6d++uNTs9kVwOHDiAQ4cO1RmNLCgoCDdu3GjQsXx8fKBUKpGfn6+1PT8/v965iy5duoSrV69qzcpcm0jb29sjJycHwcHBDYqBiIgahl83Elmg2o7a1dXV/LaMWgyNRlPnaRzwYKJGd3f3Bh3L0dERkZGRSEtL0zp+Wloa+vfvX6d9jx49cOrUKRw/flxcnnjiCQwdOhTHjx9neRMRkRnwiQWRkRpT9iMtZVIqlfVuB7TLn2o7vNbH29sbALB161Z07doVnp6edUZ3ko4qpXtsFxcXcb0lTihIlm3EiBFYtmwZPv30UwCAQqFAaWkpFi5ciNGjRzf4eElJSZg+fTqioqIQHR2NZcuWoaysTBwlatq0aWjfvj1SUlLg7OyMXr16ae3v5eUFAHW2ExFR82BiQWRB1Go1bt++jWHDhpmkjwSRKb3//vuIj49HaGgoKisr8bvf/Q4XLlyAj48P/vOf/zT4eFOmTMGdO3ewYMEC5OXlISIiAjt27BA7dF+7do0JMRFRC8JPJkQWQq1W48cff0TPnj3Rrl07gx27ieTQoUMHnDhxAmvXrsXJkydRWlqKmTNnYurUqVpPyxoiMTERiYmJ9b6Xnp5ucN81a9Y06pxERNQ4TCyILERubi569uyJHj16yB0KkV729vb4/e9/L3cYREQkAyYWRHoY6oOgb9Zq3bIM6dCv0n10h4SVdniV9sVwcHCAWq1Geno6hgwZIr4GgMrKSrGdtGOsq6urwZgetp2osb7++muD70+bNs1MkZA127x5s7jevXt3GSMhIl1NSiyeffZZfPLJJ/Dw8MCPP/4IlUqFyZMnmyo2IpunVquxZcsWhIaGaiUcRC3RnDlztF5XV1ejvLwcjo6OcHV1ZWJBRGTlmvSV5ZkzZ+Dh4YGzZ8/ib3/7G9LT0/HHP/7RVLER2TS1Wo2amhr069cP3bp1kzscooe6d++e1lJaWoqcnBwMGjSoUZ23iYjIsjTpiYWDgwMEQcDq1auRnJyMqVOnIjIy0lSxEYlMOeu1sYw9jzQ2lUql9Z605Ela7qQ7JKynp6e4XlpaCrVajV27dqFv377o2LFjvefSNy8Ah5GllqRbt25455138Pvf/x7Z2dlyh0NERM2oSYnFSy+9hEcffRRFRUV4/fXXAQBlZWWmiIvIpmVlZaFnz55aSQWRpbK3t8fNmzflDoOakbTfAxHZriYlFs8//zyeeuop2Nvbo1WrVrh48SL69etnqtiIbE5NTQ3OnDmDqKgoKBQKucMhapAff/xR67UgCLh16xZWrFiBgQMHyhQVERGZS5MSi/Pnz+O9995DQUEBwsLC8Mc//pHjhlOzMKacR7cMycnJqUnnrKmpMSoG6ehMuh2spftIZ9TWLVeqrq5GTU0NfvzxR4SFhaFVq1YPPZf0+ljuRC3BhAkTtF4rFAq0bdsWw4YNw/vvvy9PUEREZDZNSiwmTZqEOXPmICIiAllZWRg1ahTeeecdDBs2zFTxEdkEQRBQVlaGRx99lOVPZLH0DcNMRES2oUmJhbOzM2bNmgUA6Nu3LyZOnIjhw4fjxIkTJgmOyBbU1NRgw4YNGD58OIKCgvjhjIiIiCxSoxKLV155BRERERg6dChWrFiBxMREAECbNm1YkkHUQGlpaYiMjNQ7yhORpUhKSjK67dKlS5sxEiIikkOjEouRI0fi5MmTuHHjBrZv344PPvgAPXv2xKVLlzB27FhTx0hWxNihUBszZKqhPhWGngLom1Fb95z63pP2q5D2gQC0h5h1dnbW2l5dXY27d+8iPj4ewINhZnWvQ3cWbX1xS/uX6M7qrW8fIlM7duwYjh07hurqaoSEhAB40BdPqVTi0UcfFdtxYAIiIuvUqMRi9OjRGD16tPi6qqoKZ8+exYkTJ3Dq1CmTBUdkraqrq7FlyxZERkbCycmpTsdzIks0btw4uLu746uvvoK3tzeAB5PmJSQkYPDgwZg7d67MERIRUXNqUh+L6upqfPvtt7hz5w5CQ0Px3HPP8RtRIiNcvXoVkZGR7KhNVuX999/Hrl27xKQCALy9vfHPf/4TI0aMYGJBRGTlmpRYPPPMM2jXrh169OiBLVu2YP78+fjvf/+L7t27myo+sjKGEk85Ztc2RLd8St+wssXFxXqPIR2y1s3NDVVVVUhPT0e/fv1gZ2eHiooKANrXKy1/0n2S4eLi8tBYLelnTNalpKQEd+7cqbP9zp07WsMtExGRdWpSYnH58mWsX79efH38+HE8//zz+Omnn5ocGJG1qa6uxubNmxEdHc0P9WSVJk6ciISEBLz//vuIjo4GABw5cgR//vOfMWnSJJmjIyKi5takxMLd3R0XL15E165dAQARERG4d++eSQIjsibV1dVwcHBAbGwsfHx8xI7aRNZk1apVeO211/C73/0O1dXVAAB7e3vMnDkTS5YskTk6IiJqbk1KLFasWIHx48dj9OjRCA0Nxblz59CpUydTxUY2QF9pjqFRoYyd50G6T2OeENR+MKrvvNISJWnpUnl5udY+Tk5OqKqqwp49e9CnTx+0bdsWxcXFBkd7kp5Ht/RJ+p6hdvrwSQk1J1dXV3z00UdYsmQJLl26BAAIDg7WO5M8ERFZlwZ9ysjNzdV6HRYWhqysLERFReG3335DcHAw/vvf/5o0QCJLl5GRgb59+6Jt27Zyh0JkFrdu3cKtW7fQrVs3tGrVCoIgyB0SWamMjAxxISL5NeiJRY8ePTB37lzMmzdP/MbVyckJU6ZMaZbgiCxZVVUVLl68iIEDB0KhUNR5mkFkbe7evYunn34a+/btg0KhwIULF9ClSxfMnDkT3t7eeP/99+UOkYiImlGDnljs3r0bO3fuRLdu3bBmzZpmColsiZ2dnbhoNBpxkW7XLd/RfU/fIj2edNElfU+lUomL7vHUarW4ODk5iUt92wFg79698PHxEScDk+7j4OCgdyGyVH/605/g4OCAa9euaZX7TZkyBTt27JAxMiIiMocGJRYDBgzAkSNHkJKSgn/84x+IjIzEgQMHmis2Iouk0WhQUVGBmJgYBAQEyB0Okdns2rULixcvRocOHbS2d+vWDb/99ptMURERkbk0qifntGnTkJOTgzFjxmDUqFF46qmncOXKFVPHRmRxVCoVNm/eDGdnZ/j7+8sdDpFZlZWV1TswQWFhofgkj4iIrFeThogZMWIEnn/+eWzYsAGhoaH4y1/+wmE0yWYJgoDdu3ejX79+cHZ2ljscIrMbPHgwvv76a/G1QqGARqPBu+++i6FDh8oYGRERmUODOm+vWrUKR48exdGjR3Hu3DnY2dmhV69eePHFFxEeHo61a9ciNDQUP/zwA6KioporZrJgun0cpK/t7e31tjNmmFRDw9DqDh2rj3QWbTc3N633pP0fSkpKxHUXFxeoVCoUFRVh+PDhcHBwEGORDkvr4+Mjrut25JaeS9+Qsrr0/byae+Ztzt5N+rz77rt4/PHH8euvv6Kqqgp/+ctfcObMGRQWFuLnn3+WOzwiImpmDfpU8NZbb6G4uBjTpk3Dvn37UFRUhMzMTKxcuRL/93//h7179+LFF1/EjBkzmilcopansrIS27Ztg0KhYOdrsmm9evXC+fPnMWjQIIwfPx5lZWWYNGkSjh07huDgYLnDIyKiZtagJxa681jUZ+bMmfjHP/7R6ICILM21a9cwcOBA+Pr6Gj15H5G18vT0xPz58+UOg6xYUVGR3CEQkR5Nmnm7Pr6+vti7d6+pD0tWSlpKIy0bUiqVetsZO1u3Prrt1Gq1uC7tYHrv3j2tdtJyJQcHB1RWVuKXX37B0KFDxVpy3ZIraUdW6Xu6HVyl7xl66qGv9MjYkiRTlC6x/In02bFjB9zc3DBo0CAAwMqVK/HZZ58hNDQUK1euhLe3t8wREhFRczL5JwSFQoHY2FhTH5aoRVGpVNi1axceeeQRcZ4KIlv35z//Wex/dOrUKSQlJWH06NG4cuUKkpKSZI6OiIiam8mfWBBZu8rKSjGB9vT0lDscohbjypUrCA0NBQCsX78e48aNw9tvv42srCyMHj1a5uiIiKi5MbEgs9ItQ5KObGRonHt9ZU7S8ild0nIq6ShMuqVG0mNL39M9toODAyoqKpCWloZ+/frB09MTlZWVWsmF7jUYW56l79pramq0XusrQ+JITdQSODo6iv+v7dmzB9OmTQMAtG7dWmskNSIisk5MLIga4Pjx4+jfvz88PDzkDoWoxRk0aBCSkpIwcOBAZGRkIDU1FQBw/vz5OrNxE5laRkaGuB4dHS1jJES2i19tEhmhsrISZ8+eRf/+/dGmTRu5wyFqkVasWAF7e3usW7cOH3/8Mdq3bw8A2L59O0aOHClzdERE1Nz4xILoISorK/Hzzz9j8ODBcodC1KJ17NgRW7ZsqbP9gw8+kCEaIiIyNz6xIJPRaDTiUlNTU+9iaB8plUqltUjblZeXi4uUdHt5eTkqKyvFxdCxS0tLxeXu3bvi4u3tDQ8PDzg5OWHo0KFo1aqVuI+Uk5OTuEjj1Gg0sLOzq3ext7fXWvT9jHT30/fzkrYhsiYrV65EUFAQnJ2dERMTo1XuouuHH35AVFQUvLy80KpVK0REROCbb74xY7RERLaNn0KI9CgvL8eWLVvg5ubG8iciGaSmpiIpKQkLFy5EVlYWwsPDER8fj9u3b9fbvnXr1pg/fz4OHz6MkydPIiEhAQkJCdi5c6eZIycisk1MLIjqodFokJaWhsGDB8PR0VHucIhs0tKlSzFr1iwkJCQgNDQUq1atgqurK7788st62w8ZMgQTJ05Ez549ERwcjDlz5iAsLAwHDx40c+RERLaJfSyo0eorx6lvXVreI53lur7XtXTLjaTtpEPCGpqxWvpeaWmpuK47q/f9+/e1XldUVKCiogKxsbGwt7cXS66kMUhHhZLGqjtsrL5hZA0Nuyv9eRkqbeIQs9QSnDx5Er169TL572BVVRUyMzORnJwsbrOzs0NcXBwOHz780P0FQcDevXuRk5ODxYsX622nW97IYXGJiBrPIj+NqFQqREREQKFQ4Pjx43KHQ1akoqIChw8fFvs+EJFhffr0QUFBAQCgS5cuuHv3rkmOW1BQALVaDT8/P63tfn5+yMvL07tfcXEx3Nzc4OjoiDFjxmD58uUYPny43vYpKSnw9PQUl8DAQJPET0RkiywysfjLX/6CgIAAucMgK5SXl4eoqCjOU0FkJC8vL1y5cgUAcPXqVaMnhWwu7u7uOH78OI4ePYq33noLSUlJSE9P19s+OTkZxcXF4pKbm2u+YImIrIzFfSW7fft27Nq1C+vXr8f27dvlDsem6X6AkJYe6ZYb6dtHWr4kHb1Jt6xC+lpaqiDd38XFRWsffeUNuk8i3N3dUVZWhmPHjmHQoEH1Xo9u7NLrMzRjuL6ZwQ3N/t3UJyWGStSITO3JJ59EbGws2rVrB4VCgaioKL3//1++fNno4/r4+ECpVCI/P19re35+Pvz9/fXuZ2dnh65duwIAIiIicO7cOaSkpGDIkCH1tq8d0Y2IiJrOohKL/Px8zJo1Cxs3boSrq6tR+7B+lh6mvLwc6enpWkkFERnn008/xaRJk3Dx4kW88sormDVrFtzd3Zt8XEdHR0RGRiItLQ0TJkwA8L9BFRITE40+jkaj0ZvgExGRaVlMYiEIAmbMmIEXX3wRUVFRuHr1qlH7paSkYNGiRc0bHFmsiooKeHl5ITY2Fm5ubnKHQ2SRamfVzszMxJw5c0ySWABAUlISpk+fjqioKERHR2PZsmUoKytDQkICAGDatGlo3749UlJSADz4ex8VFYXg4GCoVCps27YN33zzDT7++GOTxENUn5ycHHE9JCRExkiI5Cd7YjFv3jyDI3YAwLlz57Br1y7cv39fa4QQYyQnJyMpKUl8XVJSws55D2FsjXRjSmx0R4GSjtYkLQFydnbWaicdt163jKi+YwHaZUjSyfRq1ysrK5GdnY0+ffrAxcUFxcXFCAoKEtvpzl2hbxQmQ2UUxo7cZOxIUMZg6RPJZfXq1eL69evXAQAdOnRo9PGmTJmCO3fuYMGCBcjLy0NERAR27Nghdui+du2a1u97WVkZXn75ZVy/fh0uLi7o0aMH/v3vf2PKlCmNjoEsk3QixejoaBkjIbItCkEQBDkDuHPnzkNHEenSpQuefvppbN68GQqFQtyuVquhVCoxdepUfPXVV0adr6SkBJ6eniguLmYHXT0a2/nSmP10Z8GuqKgQ1xuTWEjXdZMWaWIh3b82sbhw4QI6dOiglUBIEwvd3w9zJRYcjYrMzVR/FzUaDf75z3/i/fffFxN9d3d3zJ07F/Pnz7eIpJf3iMbZvHmz2c5VVFTUoPbmTCz4xIKsUUP+Lsr+CaZt27Zo27btQ9t9+OGH+Oc//ym+vnnzJuLj45GamoqYmJjmDJGsTGVlJQoLC9GtWze5QyGyKvPnz8cXX3yBd955BwMHDgQAHDx4EK+//joqKyvx1ltvyRwhERE1J9kTC2N17NhR63VtPXxwcHCTHrWTbamoqEB2dja/VSJqBl999RU+//xzPPHEE+K2sLAwtG/fHi+//DITCyIiK2cxiQWZj265QmP6XEjLkPTNlA1olxFJ+0Ho9peonYALgNaIYNJ9dEvqpO08PDygVquhUCgQERGh9Z60hEoan+7xjCmLkJY0Ado/E7nH9ydqboWFhejRo0ed7T169EBhYaEMERERkTm1/IJXPYKCgiAIAiIiIuQOhSxAWVkZfvnlF7i5uRk9VDERNUx4eDhWrFhRZ/uKFSsQHh4uQ0RERGROfGJBVk+j0eDUqVPo06cPlEplnacKRGQa7777LsaMGYM9e/agf//+AIDDhw8jNzcX27Ztkzk6IiJqbkwsCIDh0Yv0jeSiW9ojLV+SlhdJR2Ty9vbWG4N0f90hZT09PcX1e/fuievSuSekI0wBwK1bt1BVVQW1Wo2oqCjY2dmhurq6zuhR0mNLz6s7OpN0pCrpe6b42VnCaDlEDxMbG4vz589j5cqVyM7OBgBMmjQJL7/8MgICAmSOjoiImhsTC7JaVVVVuHnzJtq3b88P7kRmEhAQwE7aZLM4WR7ZOn7aIqtVXl6O9u3b651Qj4iIiIhMh08sCIDh0Yukr3VHddJ3DGk7abmSdLQoQHtUJ2kCIN2u+1ra+To3N1dcry1xqqysRF5entboNEqlst79AcDf319cl5Y76ZZM6b6uZehpiL4yqcbsQ0RERNSSMbEgq6JSqXDlyhUEBwfLHQoRkVUz52zbRGQZmFiQ1VCpVLC3t0fXrl1Z/kRERERkZkwsCEDdid300VfupOvGjRviunTUJd19pMfLy8sT1319fbXaSUeCkpZT1U6wV15ejuzsbPj4+IhlT/369av3vLqlULrlWbV0fybSZEVfWZPuProjSxmD5U9kDQoKCnDkyBGo1Wr07dsX7dq1kzskslEZGRnienR0tIyREFk/JhZkFfLy8rSSCiKSz/r16zFz5kx0794d1dXVyMnJwcqVK5GQkCB3aERE1Iz41ShZtPLycuTn56NLly5MKohkIp2DBgAWLVqEjIwMZGRk4NixY/j+++8xf/58maIjIiJzYWJBFquiogKXL182OOkeETW/yMhIbNq0SXxtb2+vNTFmfn4+HB0d5QiNiIjMiKVQVIfusKrSPgjSoWMNzbwt/bBfUlIirhvbf0B3uFnpuVxdXaFWq6HRaPDII4+IH1giIyP1Hk8aj7TPB6Ddd0J6DdJrBf7XnwPQnuXbxcVF73l1f0a12I+CrMnOnTsxe/ZsrFmzBitXrsS//vUvTJkyBWq1GjU1NbCzs8OaNWvkDpOIiJoZEwuyOGVlZbh8+TJ69erF8ieiFiAoKAhbt27Ff/7zH8TGxuKVV17BxYsXcfHiRajVavTo0UNrjhiihioqKpI7BCIyAr82JYuiVqtx+fJlhISEQKFQyB0OEUk8++yzOHr0KE6cOIEhQ4ZAo9EgIiKCSQURkY3gEwsbJi3nkZbm6M4Boa+U6e7du1rtpEPMSo/h4eFR77EA7WFkpeu6ysvLUVVVBeBBKdT169cBaJc/SYerBYAuXbrUG4/ueaQlT9KSKd2hcaVlTdLjSbc3ZnhZImuwbds2nDt3DuHh4fj888+xf/9+TJ06FaNGjcIbb7xhsGSQiIisA59YkEWoqqpCUVERlEoln1QQtTBz585FQkICjh49ihdeeAFvvvkmYmNjkZWVBWdnZ/Tp0wfbt2+XO0wiImpmTCyoxRMEAVVVVWjTpg37VBC1QGvWrMG2bduwdu1aHD16FN988w0AwNHREW+++SZ++OEHvP322zJHSUREzY11GwQAWh/Ydcekl5Y/ScuIdEumpLNlFxcXi+u5ubnierdu3bT2kR5PWnpUW55UXl6Oe/fuoU2bNuJ70nrtgoICcT0wMFDr2LqjOunbrq+ddBQoQHt0LH2zcOuOAsUyKbIFrVq1wpUrVxAZGYnc3Nw6fSpCQ0Nx4MABmaIjIiJz4RMLarEqKytx69Yt+Pn5yR0KERmQkpKCadOmISAgALGxsXjzzTflDomIiGTAr1CpRaqsrISDgwOCgoKgVCrFjttE1PJMnToVI0eOxOXLl9GtWzd4eXnJHRIREcmAiQW1OJWVlSguLhaTCiJq+dq0aaNVskhERLaHiYWVkNbyG6r5l5K2k/ZvkPYlALT7S0jbSbcDwO3bt+s9hnSm6z179mjtc//+fXHd3d0dgiCgqKgIVVVVOH/+fL2xRkdHi+uGZgKXxtO+fXu97aSv9f0cgbp9LozZpzEzbNfU1Ijr7JdBREREloJ9LKjFqKqqQkVFBby9vTmkLBEREZGF4deh1CLU1NSgsrKSpRRERNRsMjIyxHXp028iMg0mFlZCX8mNdLu0xAbQLmuSlvMUFhZqtZMOCSsdRlJ3Fm1pfwjprNfS/XXLiSorK6HRaKBQKODp6SnG6+/vX+/16F6TlHSGb0C7HMvV1VVcLy8v12onjclQWZM+xu5jbDtD5U+NiY+IiIjIHPjJhGRVXV2N0tJSKJVKflAmIiIismD8JEeyUavVKC8vh5ubG/tUEBEREVk4lkJZOd3yJynpDNvSciVdly9fFtdDQkL07iMdhUk623ZlZaW4XlsuVV1dDTs7O+Tl5SEvLw+A4ZGbpGVOhka6kpKOGCUt+5KWRem+p29GbV2NmVHbFE9k+FSHiIiIWip+SiGzq66uRmVlJT8kExEREVkRfrIjsxIEARqNhuVPRERERFaGpVBWSFqmo1ar9baTlv1I12/cuKG33Y8//ljvdgC4evWquC4ta6otfxIEAS4uLmjVqpX4nrS0Shq3t7e31rGDgoLEdemTjsDAwHr3B7RHe9I3QhSgf3JAYyfIk9KNgU9liIiIyFbwUw+ZhSAIAOp+qCciMmTlypUICgqCs7MzYmJitOYh0PXZZ59h8ODB8Pb2hre3N+Li4gy2JyIi02JiQc2uNqkAwPInIjJaamoqkpKSsHDhQmRlZSE8PBzx8fFaA0VIpaen49lnn8W+fftw+PBhBAYGYsSIEXWewhKZQ05OjrgQ2QomFmQ2TCqIqCGWLl2KWbNmISEhAaGhoVi1ahVcXV3x5Zdf1tv+22+/xcsvv4yIiAj06NEDn3/+OTQaDdLS0vSeQ6VSoaSkRGshIqLGYR8LKyGt7dc3fKp0eFkAWt+iFBcXi+sVFRVa7aTfDkrPo/utofS9ixcvAgDatm0Lb29vManQHaJW+lo6W7du3wTdPhf17S/t1wFo9y+R7q/b78TYmbelQ/caM9M5ETVeVVUVMjMzkZycLG6zs7NDXFwcDh8+bNQxysvLUV1djdatW+ttk5KSgkWLFjU5XiIi4hMLaiaurq5wc3PDnTt3+KSCiBqsoKAAarUafn5+Wtv9/PzEuW8e5q9//SsCAgIQFxent01ycjKKi4vFRToHDxERNQyfWJDJOTs7o1WrVrh165bcoRCRjXrnnXewdu1apKenw9nZWW87Jycno0Z8IyKih2NiYYWk5U/l5eX1rgPaQ6vevHlTXNedSfru3bviunRIWd3ypNrXdnZ2UCgUCAgIAAD4+vrqjVVa/iSNu1+/flrtpCVP0vNK13WHepV+mJCWP+m2k/4cpFxcXLRes8yJyHx8fHygVCqRn5+vtT0/Px/+/v4G933vvffwzjvvYM+ePQgLC2vOMMmCSUcMi46OljESIuvBT0pkMkqlEi4uLnU+uBMRNZSjoyMiIyO1Ol7XdsTu37+/3v3effddvPnmm9ixYweioqLMESoREf1/fGJBJqFQKODo6Fin4zcRUWMlJSVh+vTpiIqKQnR0NJYtW4aysjIkJCQAAKZNm4b27dsjJSUFALB48WIsWLAA3333HYKCgsS+GG5ubnBzc5PtOoiIbAUTCyskHRVK+kHf0KzQbdq0EddPnjyp1W779u3iurSs6fLly+K+ZWVlWuVGo0aNqje22vKoWrWzcgPQuvGfPn1aq13Hjh3FdWn5k3SkK906aen1SWPT/YChrxRKrlm0DY1MRWRLpkyZgjt37mDBggXIy8tDREQEduzYIXbovnbtmtb/Ix9//DGqqqrw1FNPaR1n4cKFeP31180ZOpEW6SiMISEhMkZC1LyYWFCT+Pj4ICAgAKdOnarTN4OIqKkSExORmJhY73vp6elar6V9wIiIyPz4dSg1iaOjI06dOqU1uzYRERER2R5+xWwl9JXMSJ8iVFZWar0nneBOOi783r17tdpJS4w8PDwAPJinolu3brh//744+ZS0BEs6kpSPj4+47urqqvcapO0MTWKnr3xKen7ddtIRp3T7gUjfa86nLsaWOLH8iYiIiCwRP8FQgzk7O8Pd3R3379+XOxQiIiIiaiGYWFCDODk5QaVS1RlbnoiIiIhsGxMLMpqPjw+8vLzYn4KIiIiI6mAfCwtiqEZf+p60r0FNTY24npubq7VPSUmJuC4dTeXGjRta7S5evAilUonHH38c586dExML3T4N0lm0pbNe6+t7AQCBgYHiurR/g+7MugUFBeK6vlm4deORMtR3Qvqe9OdoaLjZxvSDYN8JIiIismYW90ln69atiImJgYuLC7y9vTFhwgS5Q7J6oaGh6NKlC3bt2sWnFURERERUL4t6YrF+/XrMmjULb7/9NoYNG4aampo6E6mRaXXs2BGenp7YtGmT3KEQERERUQtmMYlFTU0N5syZgyVLlmDmzJni9tDQUBmjMj3d8pvGtJOWBEnXpeVEAFBeXi6uS8uL+vTpA+DBcK329vY4cuSIWOYkHbI2MjJS63jSoV+lJU5StcPV1pKWB0mHotUta5IORSslHYZWd4ha6bGlPy9jh5TlhH9ERLYhIyNDXI+OjpYxEiLLZjGlUFlZWbhx4wbs7OzQp08ftGvXDqNGjXroEwuVSoWSkhKthR7Ow8MDvr6+UKlULH8iIiIiooeymMTi8uXLAIDXX38df//737FlyxZ4e3tjyJAhKCws1LtfSkoKPD09xUXfN+n0Pw4ODnBzc8OtW7fkDoWIiIiILITstR7z5s3D4sWLDbY5d+6cWMoyf/58PPnkkwCA1atXo0OHDvj+++/xwgsv1LtvcnIykpKSxNclJSUWlVxIy3l0Z4yWkpYESUdkks4+rVs2Jn164+vrK56vdiZqT0/POueJjY0V16WzdQNA+/btxXXpvtKft+7M29JZr/XNqA1oX7v0WqWk1w3oH4VJOlIWoF3ypK98ytB7HO2JiGzF5s2b5Q6BiFow2ROLuXPnYsaMGQbbdOnSRfz2XPrh2MnJCV26dMG1a9f07uvk5KT3gyhpUyqV/JBMRERERI0ie2LRtm1btG3b9qHtIiMj4eTkhJycHAwaNAjAgw6+V69eRadOnZo7TJtRXV3NRIyIiIiIGkz2xMJYHh4eePHFF7Fw4UIEBgaiU6dOWLJkCQBg8uTJMkdn2UpKSmBvb1+nRIiIiIiIyFgWk1gAwJIlS2Bvb4/nnnsOFRUViImJwd69e7VmX7Zm0v4IuqQ1/9IhYaV9E3TLnDw8PFBcXAyNRoOwsDAoFAoAdWfH1nce3X4Q0iFri4uL6427ti9HfbGGhISI67qjd0n/jaXDypaWlorruv039DF2GFlDZWHGloyxLwYREUnl5OSI69L7HpE1sKjEwsHBAe+99x7ee+89uUOxCqWlpXBzc4OHhweqqqrkDoeIiIiILBi/QrVRFy5cQGFhIezs7MQnFUREREREjWVRTyxsgW65jDHDrAJ1Z6quJZ3punbm7ZqaGty7dw/Dhg0Tk4qrV6+K7XSHkZWWG9XOyl3fOaVDzErPK501W/capMfWF7exdH92hoaONYah4WYbGxMRERGRtWJiYWOuXLkCNzc3hIaG8kkFEREREZkMv061IVeuXEFxcbHWEwQiIiIiIlPgE4sWRnfIVxcXF3HdUFmUvjIplUoFACgrK4O3tzc6duwIQRAgCALKy8vFdtJZr6WjLgHaIzlJy4O6dOmi1U5a1iRtd/v2bXFdOjs3oD1ilHQfQyNgScuLDLWT/iyNHQlK33mIiIiIyDAmFjbg+PHjKCkpQYcOHeQOhYiIyChFRUVyh0BEDcTEwsrduXMHRUVFiI2NxZUrV+QOh4iIqEXLyMgQ16Ojo2WMhMjyMLFoYXTLb6TlQdKyKN0Ri6Sva9dPnjyJzp07Y9iwYQDqlktJJ7iTjvCkW+Lk7u5eb6y1ZVa1pKVVQUFB4rp04jrd0Z6kJVhSuqNFSWPVV/5kqHSpvp9PrcaUSRERERGRNn6islK//vorSkpKEBoaKncoREREVA/Owk3WhomFFdJoNGjVqhUiIyMbNX8DEREREVFDMbGwMocPH4adnR0iIiLkDoWIiIiIbAgTC5lIh0KV9g0w1MfC0NOH6upqnDlzBvfv38fw4cPFye+kfSe8vb219pHOsC3tt6A7JKz0GNJ+FdJ+D7qvpevSvhe61yftfyGNoU2bNlrtpNfemBm1Df2Mm0pfbERERES2hImFlbhy5Qq6d+/OGbWJiIiISBZMLKzAzz//jIqKCgQFBTGpICIiMhEOPUvUMEwsZKKvZEa3tEdf2U/t9oqKCigUCjz++ONiUiFtZ6h0yd/fX1yXljtJS5cA4ObNm+K6dBZuXdLhcKXHa926db3bAf2lUIYYW3pkbFlSU0uZWP5EREREBPATkQU7cOAA7t27h0GDBvFJBRERERHJiomFhTp48CBqamrQrl07uUMhIiIiImJi0RLY2dnpXepTXFyM0NBQDB069KFPKpycnMRFqVRqLa6uruIi3V5SUqK1tGnTRlwqKyvFRXpsJycneHp6iouzs7O4uLm5iYuLi4vW4uDgIC5qtVpcNBqN1qLvZyJtY4qfPxG1LCtXrkRQUBCcnZ0RExOjVfOu68yZM3jyySfF/mbLli0zX6BERMTEwtLs378fp06d0uq3QERkjVJTU5GUlISFCxciKysL4eHhiI+Px+3bt+ttX15eji5duuCdd97R6kNGRETmwcTCguTm5kKhUGDQoEFyh0JE1OyWLl2KWbNmISEhAaGhoVi1ahVcXV3x5Zdf1tu+b9++WLJkCZ555hk4OTmZOVoiIuKoUBZAEAQcOXIE4eHhCAwMlDscIqJmV1VVhczMTCQnJ4vb7OzsEBcXh8OHD5vsPCqVSmv0vJKSEpMdm6xLcw89m5OTI66HhISY/PhE5sDEooUTBAH79u2Dg4OD0d/ASfsKSId31e1DIH1dWVkprgcFBWm1k74nZWh4WOmxCwoKxHXdIW+lx5a+J52ZHNAeEtbenr+2RNauoKAAarUafn5+Wtv9/PyQnZ1tsvOkpKRg0aJFJjseEZEtYylUCyYIAtRqNQICAjB48GC5wyEisjrJyckoLi4Wl9zcXLlDIiKyWPzqt4USBAF79+6Fn58fevXqJXc4RERm5ePjA6VSifz8fK3t+fn5Ju2YXTuqHRERNR0TC5k8bGjTo0ePwtnZGT169BDLgqT76JYK6SsPkpYrGTqnu7u7uK4787bubNm1lEql1mvpLNpqtVpcNzSztbOzs7guvSZDZVtEZP0cHR0RGRmJtLQ0TJgwAcCDvyVpaWlITEyUNziiZsb+FmSpmFi0MIIg4Pz583j00Udhb29fJ4EgIrIVSUlJmD59OqKiohAdHY1ly5ahrKwMCQkJAIBp06ahffv2SElJAfCgw/fZs2fF9Rs3buD48eNwc3ND165dZbsOIiJbwcSiBREEAXv27IGbmxu/oSAimzdlyhTcuXMHCxYsQF5eHiIiIrBjxw6xQ/e1a9e0nmbevHkTffr0EV+/9957eO+99xAbG4v09HRzh09EZHOYWLQgZWVl8PLyQt++fcVt0pumoXIg6ZMNY0da0jesoq+vr9ZraVmTdFhG3dmupe2kZVLScidd0hKupsyeTUTWKTExUW/pk26yEBQUBEEQzBAVERHVh4XrLYAgCNi1axcqKyu1kgoiIiIiIkvBJxYtwJ49e+Dp6QkfHx+5QyEiItKyefNmuUMgIgvBxEImGo0GgiCgqKgIffv2hZeXV4P3l5KWFOkbaUl3dCcXFxdxvaKiQm876QR30tGjdIdolB5D+p50Xd8IU7rXYIihUaaIiMhyFRUVyR2CUZp7Fm4iS8VPZTIRBAE7d+7E5cuXG5xUEBERERG1NHxiIZPLly/Dx8cHkZGRcodCRERELRTntCBLwicWZiYIAn766Sd06tQJUVFRcodDRERERGQSfGJhRoIgYNu2bfDz84Ojo2O9bXT7TujrT2Cob4G0r4K0j4V0Fm7d19LhYXWPra9fhW47Dw+Peo+n75z1HUMf9qsgIiIiatmYWJiJIAioqalBjx49EBwcLHc4REREZALsyE30P/zq1wwEQcDWrVtx9epVJhVEREREZJX4xMIMDh48iPbt26Nbt24N3lda9mNsOZCx7aTvSYeBlc6uDWgPSystcdIta5LOvK2vbEt39m9jy5r0tWOJFBERtRR8ekG2jolFMxIEAdnZ2RgwYIDePgdERERERNaAX/E2E0EQsHnzZqhUKiYVRERERGT1+MSimRQXF6Nz587o3bv3Q9vqjgQl1dTyHn2lVIB2WZK03MnYMitp6ROgf2Qp6T7Gzq5tLJY/ERGRreCcFtTS8VOZiWk0Gvz4449QKBRGJRVERERkfTIyMsSFyFbwiYWJbd26FUFBQfD09JQ7FCIiIrJSfHpBLRETCxPRaDS4d+8eYmNjtSaKM0Zjynl0y5qkozpJJ7EztsxKOhKUoX2k5U/GTnYnja2xE+QRERERUcvGT3UmoNFosGnTJuTl5TU4qSAiIiJqipycHHEhkhOfWJhATk4OunXrhkceeUTuUIiIiJps8+bNcodgVTi/BdkKJhZNoNFokJ6ejiFDhrCkh4iIiB6KSQZZMyYWjaTRaLBx40b06NGjyX0kjN3f0D76+lUYe2xD/SB0X+s7tr6+GdLYiIiIpIqKiuQOgYhMxKK+Zj9//jzGjx8PHx8feHh4YNCgQdi3b5/Z41Cr1aipqUFkZCRCQ0PNfn4iIiKyfBySlqyNRSUWY8eORU1NDfbu3YvMzEyEh4dj7NixyMvLM1sMarUaGzduRF5eHjp16mS28xIREZH1YpJB1sBiSqEKCgpw4cIFfPHFFwgLCwMAvPPOO/joo49w+vRp+Pv7myWO9PR0hIaGomPHjk06jr6ZqQ2VLjWmZMrYdq6uruK6tCxKt5105mzd87CfCRERUdM1pR+GvpGhONcFmYPFJBZt2rRBSEgIvv76azz66KNwcnLCJ598Al9fX0RGRurdT6VSac3RUFJS0qjzq9VqZGdnY+jQofwATURERGah7wkGO35TS2QxiYVCocCePXswYcIEuLu7w87ODr6+vtixYwe8vb317peSkoJFixY16dxqtRo//PADwsLCmFQQERFRi8KRpqilkP1T8rx586BQKAwu2dnZEAQBs2fPhq+vLw4cOICMjAxMmDAB48aNw61bt/QePzk5GcXFxeKSm5vboPgEQcC9e/cQHh7ebI8R7ezsxEWj0WgtjWFvby8u0mPrLvo4OTlpLdLj6YubCRcREZH5sE8GtUSyP7GYO3cuZsyYYbBNly5dsHfvXmzZsgX37t0TZ7f+6KOPsHv3bnz11VeYN29evfvWfjhujJqaGmzatAkjR45E9+7dG3UMIiIiIjlIk47m+HJUOpHiuHHjTH58sjyyJxZt27ZF27ZtH9quvLwcQN0OwrXf8puaIAjYuHEjwsLC0KpVK5Mfn4iIqCUx52zbnLui+eh7gvHNN9+I615eXuK6NCHQ9ztgTJuG/v4wEbFOsicWxurfvz+8vb0xffp0LFiwAC4uLvjss89w5coVjBkzxqTnqqmpQXFxMUaNGsWkgoiIiKyKNLEzJiFo7qTTmOPrS26YoLQsFpNY+Pj4YMeOHZg/fz6GDRuG6upqPPLII9i0aRPCw8NNdp6amhqsX78eUVFRCA4ObtKxGjMDtqF2pp6tW/paul5TU6PVTrdvBREREVFTNDRZacqTkoY+laHGs6hPjFFRUdi5c2eznuPs2bOIjIxsclJBRERE1NJJn15IS6SsSUOfyvDpSONZVGLRnKqrq5Geno64uDgoFAq5wyEiIiIiGZizv5G1YWKBB0nF+vXrER0dbdKkwtRDsDbmeI2ZyZtDxxIRkamxw3bLp+/fyFqfZDRUQ8uubJHNJxbV1dXQaDR47LHHEBAQIHc4REREZsNvZskYTDiMZ+t9OGw6saiursa6deswZMgQJhVERERE1Cxspa+GTde8pKWloV+/fmjXrp3cobQohmbUbuqs4EREDbFy5UoEBQXB2dkZMTExD51l+Pvvv0ePHj3g7OyM3r17Y9u2bWaK1HJs3rxZXJpbUVGRuJD1kf776lvMGYOlMOf/g+Zms08szpw5g/j4eHbUJiJqoVJTU5GUlIRVq1YhJiYGy5YtQ3x8PHJycuDr61un/aFDh/Dss88iJSUFY8eOxXfffYcJEyYgKysLvXr1kuEK5CXXhxZL+oBH5mXM74a+8ipTjV7V0kbBsrYnGQpBEAS5gzCn4uJieHl54fDhwwgNDZU7HIvTmLk0iKhlKykpQWBgIIqKiuDp6Sl3OKKYmBj07dsXK1asAPDg709gYCD++Mc/Yt68eXXaT5kyBWVlZdiyZYu4rV+/foiIiMCqVavqPYdKpYJKpRJfFxcXo2PHjsjNzYWHh4eJr6h5bN++3WznKi4uFtelvyvS7URy0ff3qzl+P/X9/hsTgzF/Z0eNGtWE6EyrIfcIm3ticf/+fQAPZvImIqL/uX//fotJLKqqqpCZmYnk5GRxm52dHeLi4nD48OF69zl8+DCSkpK0tsXHx2Pjxo16z5OSkoJFixbV2R4YGNi4wImIrJQx9wibSywCAgKQm5sLd3f3BpdB1WZslvRNVmPxWq2XLV0vr9U4giDg/v37LWoQi4KCAqjVavj5+Wlt9/PzQ3Z2dr375OXl1ds+Ly9P73mSk5O1khGNRoPCwkK0adPGLKWy1vo7yuuyLLwuy2Lu62rIPcLmEgs7Ozt06NChScfw8PCwql9QQ3it1suWrpfX+nAt5UmFuTk5OcHJyUlrmxx119b6O8rrsiy8Lstizusy9h7BInkiImpxfHx8oFQqkZ+fr7U9Pz8f/v7+9e7j7+/foPZERGRaTCyIiKjFcXR0RGRkJNLS0sRtGo0GaWlpevvI9e/fX6s9AOzevZt96oiIzMTmSqGawsnJCQsXLqzz2Nwa8Vqtly1dL6/VsiUlJWH69OmIiopCdHQ0li1bhrKyMiQkJAAApk2bhvbt2yMlJQUAMGfOHMTGxuL999/HmDFjsHbtWvz666/49NNP5bwMg6zx3w3gdVkaXpdlacnXZXPDzRIRkeVYsWIFlixZgry8PERERODDDz9ETEwMAGDIkCEICgrCmjVrxPbff/89/v73v+Pq1avo1q0b3n33XYwePVqm6ImIbAsTCyIiIiIiajL2sSAiIiIioiZjYkFERERERE3GxIKIiIiIiJqMiQURERERETUZE4tGOn/+PMaPHw8fHx94eHhg0KBB2Ldvn9xhNZutW7ciJiYGLi4u8Pb2xoQJE+QOqdmpVCpERERAoVDg+PHjcodjclevXsXMmTPRuXNnuLi4IDg4GAsXLkRVVZXcoZnMypUrERQUBGdnZ8TExCAjI0PukEwuJSUFffv2hbu7O3x9fTFhwgTk5OTIHRY1gjXfV6z5HmJN9wprui9Y299/S/lbz8SikcaOHYuamhrs3bsXmZmZCA8Px9ixY5GXlyd3aCa3fv16PPfcc0hISMCJEyfw888/43e/+53cYTW7v/zlLwgICJA7jGaTnZ0NjUaDTz75BGfOnMEHH3yAVatW4W9/+5vcoZlEamoqkpKSsHDhQmRlZSE8PBzx8fG4ffu23KGZ1P79+zF79mz88ssv2L17N6qrqzFixAiUlZXJHRo1kLXeV6z9HmJN9wpruS9Y499/i/lbL1CD3blzRwAg/PTTT+K2kpISAYCwe/duGSMzverqaqF9+/bC559/LncoZrVt2zahR48ewpkzZwQAwrFjx+QOySzeffddoXPnznKHYRLR0dHC7NmzxddqtVoICAgQUlJSZIyq+d2+fVsAIOzfv1/uUKgBrPW+Yu33EFu4V1jifcEW/v631L/1fGLRCG3atEFISAi+/vprlJWVoaamBp988gl8fX0RGRkpd3gmlZWVhRs3bsDOzg59+vRBu3btMGrUKJw+fVru0JpNfn4+Zs2ahW+++Qaurq5yh2NWxcXFaN26tdxhNFlVVRUyMzMRFxcnbrOzs0NcXBwOHz4sY2TNr7i4GACs4t/RlljrfcWa7yG2cq+wtPuCrfz9b6l/65lYNIJCocCePXtw7NgxuLu7w9nZGUuXLsWOHTvg7e0td3gmdfnyZQDA66+/jr///e/YsmULvL29MWTIEBQWFsocnekJgoAZM2bgxRdfRFRUlNzhmNXFixexfPlyvPDCC3KH0mQFBQVQq9Xw8/PT2u7n52fxZSWGaDQavPrqqxg4cCB69eoldzjUANZ6X7HWe4it3Css8b5gC3//W/LfeiYWEvPmzYNCoTC4ZGdnQxAEzJ49G76+vjhw4AAyMjIwYcIEjBs3Drdu3ZL7Moxi7LVqNBoAwPz58/Hkk08iMjISq1evhkKhwPfffy/zVRjP2Otdvnw57t+/j+TkZLlDbjRjr1Xqxo0bGDlyJCZPnoxZs2bJFDk11ezZs3H69GmsXbtW7lDo/7PW+4q13kOs9V7B+4J1acl/6xWCIAhyB9FS3LlzB3fv3jXYpkuXLjhw4ABGjBiBe/fuwcPDQ3yvW7dumDlzJubNm9fcoTaZsdf6888/Y9iwYThw4AAGDRokvhcTE4O4uDi89dZbzR2qSRh7vU8//TQ2b94MhUIhbler1VAqlZg6dSq++uqr5g61yYy9VkdHRwDAzZs3MWTIEPTr1w9r1qyBnZ3lf99QVVUFV1dXrFu3Tmv0menTp6OoqAibNm2SL7hmkpiYiE2bNuGnn35C586d5Q6H/j9rva9Y6z3EWu8VtnRfsPa//y39b7293AG0JG3btkXbtm0f2q68vBwA6vyPZmdnJ34709IZe62RkZFwcnJCTk6OeFOorq7G1atX0alTp+YO02SMvd4PP/wQ//znP8XXN2/eRHx8PFJTUxETE9OcIZqMsdcKPPhGaujQoeK3iJZ08zDE0dERkZGRSEtLE28sGo0GaWlpSExMlDc4ExMEAX/84x+xYcMGpKent8gbjS2z1vuKtd5DrPVeYUv3BWv9+28xf+vl6zduue7cuSO0adNGmDRpknD8+HEhJydHeO211wQHBwfh+PHjcodncnPmzBHat28v7Ny5U8jOzhZmzpwp+Pr6CoWFhXKH1uyuXLlitSN9XL9+Xejatavw+OOPC9evXxdu3bolLtZg7dq1gpOTk7BmzRrh7Nmzwv/93/8JXl5eQl5entyhmdRLL70keHp6Cunp6Vr/huXl5XKHRg1gzfcVW7iHWMu9wlruC9b4999S/tYzsWiko0ePCiNGjBBat24tuLu7C/369RO2bdsmd1jNoqqqSpg7d67g6+sruLu7C3FxccLp06flDsssrOVmUZ/Vq1cLAOpdrMXy5cuFjh07Co6OjkJ0dLTwyy+/yB2Syen7N1y9erXcoVEDWet9xRbuIdZyr7Cm+4K1/f23lL/17GNBRERERERNZlmFc0RERERE1CIxsSAiIiIioiZjYkFERERERE3GxIKIiIiIiJqMiQURERERETUZEwsiIiIiImoyJhZERERERNRkTCyIiIiIiKjJmFgQEREREVGTMbEgMoEOHTrgo48+0tp26NAhuLq64rfffpMpKiIikhvvD2RLmFgQmUBMTAyOHj0qvhYEAa+++ir+9Kc/oVOnTjJGRkREcuL9gWwJEwsiE+jXr5/WjeObb75Bbm4ukpOTm+V8cXFxuHDhQrMcm4iITIf3B7IlTCyITKBfv344d+4cSktLUVZWhr/97W/45z//CTc3N6OPoVarjW574cIFBAcHNyZUIiIyI94fyJbYyx0AkTWIjIyEnZ0dsrKysGfPHrRt2xYJCQni+xMnToSTkxMuXbqEwsJCpKamIioqCk888QQ6dOiAo0eP4oUXXkBsbCxeffVV5OXloVWrVli3bh18fX1x5swZ/OEPf0BFRQWmTJkCf39/2NnxewEiopaO9weyJfzNIzIBV1dX9O7dG+vXr8d7772HDz74QOsP+8mTJ/Hoo4/i6NGjeOONN/D+++8DAE6dOoWQkBAcPXoUzz33HF5++WV88sknyMzMxO9+9zt8+umnUKlUmDJlCj7//HOcPHkSR48eRVhYmFyXSkREDcD7A9kSJhZEJtKvXz8sX74c8fHxGDJkiLi9tLQUlZWVmDt3LgCgZ8+euHfvHu7fvw+1Wo05c+YAADZu3IgzZ85g7NixiIiIwL/+9S84ODhg48aNiI2NRe/evcX9eeMgIrIcvD+QrWApFJGJhIeHw8HBAUuWLNHafurUKTzyyCNQKpUAgKysLPTu3RtnzpzBgAEDtNq9//77ePbZZ7X2//vf/46IiAjxdWZmJkaOHNl8F0JERCbF+wPZCj6xIDKRtWvXIjExEV27dtXafvLkSfz222+orq7G3bt3sXz5crz44os4deqU+C0TAPj7+2Pnzp1a+wFA69atcfr0aQDArl27sGfPHn4jRURkQXh/IFvBxIKoCTQaDfLz8/H222/jwoULWLhwYZ02J0+exOjRoxEZGYkhQ4bgnXfeQXBwcJ0bR0JCAoqKitCjRw+Eh4fj3//+NwDg97//PQ4ePIg+ffrgm2++QadOneDt7W22ayQioobj/YFskUIQBEHuIIgsVXp6OoYNG4YePXpg9erViImJqdNm8ODB+O677xAYGChDhEREJAfeH8gWMbEgamZdunTB5cuX5Q6DiIhaGN4fyNowsSAiIiIioiZjHwsiIiIiImoyJhZERERERNRkTCyIiIiIiKjJmFgQEREREVGTMbEgIiIiIqImY2JBRERERERNxsSCiIiIiIiajIkFERERERE1GRMLIiIiIiJqMiYWRERERETUZEwsiIiIiIioyf4fER5ReAzkupMAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "test = pred.loc[X_test, :]\n", "r2 = pearsonr(test['y_pred'], 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['y_pred'], 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()['y_pred'], label='Observed', alpha=0.3, density=True, bins=bins, color='black')\n", "axes.hist(pred.loc[np.isnan(pred['y']), 'y_pred'], 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": 35, "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": 35, "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": 36, "id": "7e2f77c2", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 3/3 [00:18<00:00, 6.08s/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.3767350.277964-3.932662-2.8208071.0
V54G0.3186940.0550690.2085570.4288321.0
G41L:V54G4.2082610.3038653.6005314.8159911.0
\n", "
" ], "text/plain": [ " estimate std ci_95_lower ci_95_upper p(|x|>0)\n", "G41L -3.376735 0.277964 -3.932662 -2.820807 1.0\n", "V54G 0.318694 0.055069 0.208557 0.428832 1.0\n", "G41L:V54G 4.208261 0.303865 3.600531 4.815991 1.0" ] }, "execution_count": 36, "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": 37, "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": 37, "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 }