diff --git a/notebooks/Case_study1_The_Sars_cov2_model.ipynb b/notebooks/Case_study1_The_Sars_cov2_model.ipynb index 27ddbce..5997f3e 100644 --- a/notebooks/Case_study1_The_Sars_cov2_model.ipynb +++ b/notebooks/Case_study1_The_Sars_cov2_model.ipynb @@ -16,7 +16,7 @@ { "cell_type": "code", "execution_count": 1, - "id": "initial_id", + "id": "efd9d834-3d8b-4044-806e-632920c8bd44", "metadata": { "ExecuteTime": { "end_time": "2024-01-25T15:12:25.679553Z", @@ -53,17 +53,17 @@ " \n", " 0\n", " eliater\n", - " 0.0.1-dev-261a89cc\n", + " 0.0.3-dev-28d9867e\n", " \n", " \n", " 1\n", " y0\n", - " 0.2.7-UNHASHED\n", + " 0.2.10-dev-8f27d998\n", " \n", " \n", " 2\n", " Run at\n", - " 2024-01-26 08:45:08\n", + " 2024-04-25 09:05:50\n", " \n", " \n", "\n", @@ -71,9 +71,9 @@ ], "text/plain": [ " key value\n", - "0 eliater 0.0.1-dev-261a89cc\n", - "1 y0 0.2.7-UNHASHED\n", - "2 Run at 2024-01-26 08:45:08" + "0 eliater 0.0.3-dev-28d9867e\n", + "1 y0 0.2.10-dev-8f27d998\n", + "2 Run at 2024-04-25 09:05:50" ] }, "execution_count": 1, @@ -82,21 +82,15 @@ } ], "source": [ - "import matplotlib.pyplot as plt\n", - "import numpy as np\n", - "import pandas as pd\n", - "import seaborn as sns\n", - "from IPython.display import Image\n", + "from IPython.display import Image, set_matplotlib_formats\n", "\n", - "from eliater import version_df\n", - "from eliater.discover_latent_nodes import find_nuisance_variables, remove_nuisance_variables\n", + "import eliater\n", "from eliater.examples.sars_cov2 import sars_large_example as example\n", - "from eliater.network_validation import print_graph_falsifications\n", - "from y0.algorithm.estimation import estimate_ace\n", - "from y0.algorithm.identify import Identification, identify_outcomes\n", - "from y0.dsl import P, Variable\n", + "from y0.dsl import Variable\n", "\n", - "version_df()" + "set_matplotlib_formats(\"svg\")\n", + "\n", + "eliater.version_df()" ] }, { @@ -385,8 +379,6 @@ } ], "source": [ - "# get observational data\n", - "# data = example.generate_data(1000, seed=SEED)\n", "data = example.generate_data(1000, seed=SEED)\n", "data.head()" ] @@ -408,17 +400,1281 @@ "outputs": [ { "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " 2024-04-25T09:05:50.207718\n", + " image/svg+xml\n", + " \n", + " \n", + " Matplotlib v3.8.0, https://matplotlib.org/\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n" + ], "text/plain": [ - "0.81" + "
" ] }, - "execution_count": 6, "metadata": {}, - "output_type": "execute_result" + "output_type": "display_data" } ], "source": [ - "data[\"EGFR\"].mean()" + "eliater.plot_treatment_and_outcome(data, treatment, outcome)" ] }, { @@ -465,70 +1721,37 @@ "outputs_hidden": false } }, - "outputs": [], - "source": [ - "from sklearn.preprocessing import KBinsDiscretizer\n", - "\n", - "# discretization transform the raw data\n", - "kbins = KBinsDiscretizer(n_bins=2, encode=\"ordinal\", strategy=\"uniform\")\n", - "data_trans = kbins.fit_transform(data)" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "be16f25565754d6a", - "metadata": { - "ExecuteTime": { - "end_time": "2024-01-25T15:12:26.317769Z", - "start_time": "2024-01-25T15:12:25.913345Z" + "outputs": [ + { + "data": { + "text/markdown": [ + "## Step 1: Checking the ADMG Structure" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" }, - "collapsed": false, - "jupyter": { - "outputs_hidden": false - } - }, - "outputs": [], - "source": [ - "data_trans = pd.DataFrame(data_trans, columns=data.columns)" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "5939b11d37754b0", - "metadata": { - "ExecuteTime": { - "end_time": "2024-01-25T15:12:26.331795Z", - "start_time": "2024-01-25T15:12:25.943400Z" + { + "data": { + "text/markdown": [ + "On this try, we're going to discretize the data using K-Bins discretization with K as 2. Here are the first few rows of the transformed dataframe after doing that:" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" }, - "collapsed": false, - "jupyter": { - "outputs_hidden": false - } - }, - "outputs": [ { "data": { "text/html": [ - "
\n", - "\n", "\n", " \n", " \n", - " \n", " \n", " \n", " \n", @@ -549,7 +1772,6 @@ " \n", " \n", " \n", - " \n", " \n", " \n", " \n", @@ -568,7 +1790,6 @@ " \n", " \n", " \n", - " \n", " \n", " \n", " \n", @@ -587,109 +1808,31 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", " \n", " \n", " \n", - " \n", " \n", " \n", " \n", @@ -701,330 +1844,72 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", " \n", - " \n", - " \n", - " \n", - " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", " \n", - " \n", " \n", " \n", " \n", " \n", - " \n", " \n", " \n", - " \n", " \n", - " \n", - " \n", - " \n", " \n", " \n", " \n", " \n", - "
SARS_COV2ACE2Ang
01.00.01.01.0
10.00.01.01.0
21.00.01.01.01.00.01.01.00.00.01.01.00.01.01.01.0
31.00.01.01.01.01.01.01.00.01.01.01.01.00.00.00.0
41.00.01.01.01.01.01.01.01.01.01.01.00.01.00.01.0
...................................................
9951.00.01.01.01.01.01.01.01.00.01.01.01.00.01.01.0
9961.00.01.01.01.01.00.01.00.01.00.0
9971.00.01.01.01.00.01.01.00.01.01.01.01.01.01.01.0
9980.00.01.01.01.01.01.01.00.01.00.01.00.00.00.00.0
9991.00.01.01.01.01.00.01.00.00.01.01.00.00.00.01.0
\n", - "

1000 rows × 16 columns

\n", - "
" + "" ], "text/plain": [ - " SARS_COV2 ACE2 Ang AGTR1 ADAM17 Toci Sil6r EGF TNF Gefi EGFR \\\n", - "0 1.0 0.0 1.0 1.0 1.0 0.0 1.0 1.0 1.0 0.0 1.0 \n", - "1 0.0 0.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.0 1.0 \n", - "2 1.0 0.0 1.0 1.0 1.0 0.0 1.0 1.0 0.0 0.0 1.0 \n", - "3 1.0 0.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 1.0 1.0 \n", - "4 1.0 0.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 \n", - ".. ... ... ... ... ... ... ... ... ... ... ... \n", - "995 1.0 0.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 1.0 \n", - "996 1.0 0.0 1.0 1.0 1.0 1.0 0.0 1.0 0.0 1.0 1.0 \n", - "997 1.0 0.0 1.0 1.0 1.0 0.0 1.0 1.0 0.0 1.0 1.0 \n", - "998 0.0 0.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 1.0 0.0 \n", - "999 1.0 0.0 1.0 1.0 1.0 1.0 0.0 1.0 0.0 0.0 1.0 \n", - "\n", - " PRR NFKB IL6STAT3 IL6AMP cytok \n", - "0 1.0 0.0 0.0 0.0 1.0 \n", - "1 1.0 0.0 1.0 1.0 1.0 \n", - "2 1.0 0.0 1.0 1.0 1.0 \n", - "3 1.0 1.0 0.0 0.0 0.0 \n", - "4 1.0 0.0 1.0 0.0 1.0 \n", - ".. ... ... ... ... ... \n", - "995 1.0 1.0 0.0 1.0 1.0 \n", - "996 1.0 1.0 0.0 0.0 0.0 \n", - "997 1.0 1.0 1.0 1.0 1.0 \n", - "998 1.0 0.0 0.0 0.0 0.0 \n", - "999 1.0 0.0 0.0 0.0 1.0 \n", - "\n", - "[1000 rows x 16 columns]" + "" ] }, - "execution_count": 9, "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "data_trans" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "e21efcf3940ffc5e", - "metadata": { - "ExecuteTime": { - "end_time": "2024-01-25T15:13:17.420177Z", - "start_time": "2024-01-25T15:12:26.006890Z" + "output_type": "display_data" }, - "collapsed": false, - "jupyter": { - "outputs_hidden": false - } - }, - "outputs": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "Of the 99 d-separations implied by the network's structure, only 8(8.08%) rejected the null hypothesis at p<0.01.\n", - "\n", - "Since this is less than 30%, Eliater considers this minor and leaves the network unmodified.]\n", - "\n", - "Finished in 10.53 seconds.\n", - "\n" - ] + "data": { + "text/markdown": [ + "Of the 99 d-separations implied by the ADMG's structure, only 9 (9.09%) rejected the null hypothesis for the cressie_read test at p<0.01.\n", + "\n", + "Since this is less than 30%, Eliater considers this minor and leaves the ADMG unmodified. Finished in 7.62 seconds.\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" }, { "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
leftrightgivenstatspdofp_adjp_adj_significant
0AGTR1PRRSARS_COV2134.8097700.000000e+0010.000000e+00True
1AngPRRSARS_COV2129.5761510.000000e+0010.000000e+00True
2ACE2PRRSARS_COV259.9260609.880985e-1519.584555e-13True
3Sil6rcytokIL6AMP56.1099676.850076e-1416.576073e-12True
4IL6STAT3cytokIL6AMP44.3250912.781286e-1112.642222e-09True
...........................
94ACE2AGTR1Ang0.000000NaN0NaNFalse
95ADAM17AngAGTR10.000000NaN0NaNFalse
96ADAM17SARS_COV2AGTR10.000000NaN0NaNFalse
97ADAM17PRRAGTR10.000000NaN0NaNFalse
98AGTR1SARS_COV2Ang0.000000NaN0NaNFalse
\n", - "

99 rows × 8 columns

\n", - "
" + "text/markdown": [ + "| left | right | given | stats | p | dof | p_adj | p_adj_significant |\n", + "|:---------|:----------|:----------|---------:|------------:|------:|------------:|:--------------------|\n", + "| ADAM17 | PRR | SARS_COV2 | 76.1544 | 0 | 1 | 0 | True |\n", + "| AGTR1 | PRR | SARS_COV2 | 108.975 | 0 | 1 | 0 | True |\n", + "| Ang | PRR | SARS_COV2 | 126.901 | 0 | 1 | 0 | True |\n", + "| ACE2 | PRR | SARS_COV2 | 63.0893 | 1.9984e-15 | 1 | 1.91847e-13 | True |\n", + "| Sil6r | cytok | IL6AMP | 58.8112 | 1.73195e-14 | 1 | 1.64535e-12 | True |\n", + "| IL6STAT3 | cytok | IL6AMP | 42.1103 | 8.62689e-11 | 1 | 8.10927e-09 | True |\n", + "| NFKB | SARS_COV2 | AGTR1;PRR | 29.5691 | 5.39582e-08 | 1 | 5.01811e-06 | True |\n", + "| IL6STAT3 | Toci | Sil6r | 30.6843 | 2.1726e-07 | 2 | 1.99879e-05 | True |\n", + "| Toci | cytok | IL6AMP | 18.1308 | 2.0624e-05 | 1 | 0.00187679 | True |" ], "text/plain": [ - " left right given stats p dof \\\n", - "0 AGTR1 PRR SARS_COV2 134.809770 0.000000e+00 1 \n", - "1 Ang PRR SARS_COV2 129.576151 0.000000e+00 1 \n", - "2 ACE2 PRR SARS_COV2 59.926060 9.880985e-15 1 \n", - "3 Sil6r cytok IL6AMP 56.109967 6.850076e-14 1 \n", - "4 IL6STAT3 cytok IL6AMP 44.325091 2.781286e-11 1 \n", - ".. ... ... ... ... ... ... \n", - "94 ACE2 AGTR1 Ang 0.000000 NaN 0 \n", - "95 ADAM17 Ang AGTR1 0.000000 NaN 0 \n", - "96 ADAM17 SARS_COV2 AGTR1 0.000000 NaN 0 \n", - "97 ADAM17 PRR AGTR1 0.000000 NaN 0 \n", - "98 AGTR1 SARS_COV2 Ang 0.000000 NaN 0 \n", - "\n", - " p_adj p_adj_significant \n", - "0 0.000000e+00 True \n", - "1 0.000000e+00 True \n", - "2 9.584555e-13 True \n", - "3 6.576073e-12 True \n", - "4 2.642222e-09 True \n", - ".. ... ... \n", - "94 NaN False \n", - "95 NaN False \n", - "96 NaN False \n", - "97 NaN False \n", - "98 NaN False \n", - "\n", - "[99 rows x 8 columns]" + "" ] }, - "execution_count": 10, "metadata": {}, - "output_type": "execute_result" + "output_type": "display_data" } ], "source": [ - "print_graph_falsifications(\n", - " graph=graph, data=data_trans, method=\"chi-square\", verbose=True, significance_level=0.01\n", - ")" + "eliater.step_1_notebook(graph=graph, data=data, binarize=True)" ] }, { @@ -1037,101 +1922,48 @@ } }, "source": [ - "Among all the 99 possible tests, 10 failed (10 $\\%$). As the data was synthetically generated based on the network structure, we expected all the tests to pass. However the failed tests are due to noise inherited by randomly sampling the data points. " - ] - }, - { - "cell_type": "markdown", - "id": "944520ca55c79b4b", - "metadata": { - "ExecuteTime": { - "end_time": "2024-01-21T07:24:52.777016Z", - "start_time": "2024-01-21T07:24:09.582369Z" - }, - "collapsed": false, - "jupyter": { - "outputs_hidden": false - } - }, - "source": [ - "## Step 2: Check query identifiability" + "**Note** As the data was synthetically generated based on the network structure, we expected all the tests to pass. However, these failures might have been introduced by the discretization process." ] }, { "cell_type": "code", - "execution_count": 11, - "id": "25bb329cbc5a1e08", - "metadata": { - "ExecuteTime": { - "end_time": "2024-01-25T15:13:17.487359Z", - "start_time": "2024-01-25T15:13:17.435937Z" - }, - "collapsed": false, - "jupyter": { - "outputs_hidden": false - } - }, + "execution_count": 8, + "id": "5874af0e-e8de-4f64-86e0-1f7d01545941", + "metadata": {}, "outputs": [ { "data": { - "text/latex": [ - "$\\sum\\limits_{ACE_2, ADAM_{17}, AGTR_1, Ang, IL6AM_P, IL6STA_{T3}, NFKB, PRR, SARS_COV_2, Sil6_r, TNF, Toci} P(ACE_2 | SARS_COV_2) P(AGTR_1 | ACE_2, Ang, SARS_COV_2) P(IL6AM_P | ACE_2, ADAM_{17}, AGTR_1, Ang, EGF, EGFR, Gefi, IL6STA_{T3}, NFKB, PRR, SARS_COV_2, Sil6_r, TNF, Toci) P(IL6STA_{T3} | ACE_2, ADAM_{17}, AGTR_1, Ang, SARS_COV_2, Sil6_r, Toci) P(TNF | ACE_2, ADAM_{17}, AGTR_1, Ang, SARS_COV_2) P(cytok | ACE_2, ADAM_{17}, AGTR_1, Ang, EGF, EGFR, Gefi, IL6AM_P, IL6STA_{T3}, NFKB, PRR, SARS_COV_2, Sil6_r, TNF, Toci) \\sum\\limits_{ACE_2, ADAM_{17}, AGTR_1, Ang, EGF, EGFR, Gefi, IL6AM_P, IL6STA_{T3}, NFKB, PRR, SARS_COV_2, Sil6_r, TNF, cytok} P(ACE_2, ADAM_{17}, AGTR_1, Ang, EGF, EGFR, Gefi, IL6AM_P, IL6STA_{T3}, NFKB, PRR, SARS_COV_2, Sil6_r, TNF, Toci, cytok) P(ADAM_{17} | ACE_2, AGTR_1, Ang, SARS_COV_2, Toci) P(Sil6_r | ACE_2, ADAM_{17}, AGTR_1, Ang, SARS_COV_2, Toci) P(Ang | ACE_2, SARS_COV_2) P(SARS_COV_2) P(NFKB | ACE_2, ADAM_{17}, AGTR_1, Ang, EGF, EGFR, Gefi, PRR, SARS_COV_2, TNF) P(PRR | ACE_2, Gefi, SARS_COV_2)$" + "text/markdown": [ + "\n", + "## Step 2: Check Query Identifiability\n", + "\n", + "The causal query of interest is the average treatment effect of $EGFR$ on $cytok$, defined as:\n", + "$\\mathbb{E}[cytok \\mid do(EGFR=1)] - \\mathbb{E}[cytok \\mid do(EGFR=0)]$.\n", + "\n", + "\n", + "Running the ID algorithm defined by [Identification of joint interventional distributions in recursive\n", + "semi-Markovian causal models](https://dl.acm.org/doi/10.5555/1597348.1597382) (Shpitser and Pearl, 2006)\n", + "and implemented in the $Y_0$ Causal Reasoning Engine gives the following estimand:\n", + "\n", + "$\\sum\\limits_{ACE_2, ADAM_{17}, AGTR_1, Ang, IL6AM_P, IL6STA_{T3}, NFKB, PRR, SARS_COV_2, Sil6_r, TNF, Toci} P(ACE_2 | SARS_COV_2) P(AGTR_1 | ACE_2, Ang, SARS_COV_2) P(IL6AM_P | ACE_2, ADAM_{17}, AGTR_1, Ang, EGF, EGFR, Gefi, IL6STA_{T3}, NFKB, PRR, SARS_COV_2, Sil6_r, TNF, Toci) P(IL6STA_{T3} | ACE_2, ADAM_{17}, AGTR_1, Ang, SARS_COV_2, Sil6_r, Toci) P(TNF | ACE_2, ADAM_{17}, AGTR_1, Ang, SARS_COV_2) P(cytok | ACE_2, ADAM_{17}, AGTR_1, Ang, EGF, EGFR, Gefi, IL6AM_P, IL6STA_{T3}, NFKB, PRR, SARS_COV_2, Sil6_r, TNF, Toci) \\sum\\limits_{ACE_2, ADAM_{17}, AGTR_1, Ang, EGF, EGFR, Gefi, IL6AM_P, IL6STA_{T3}, NFKB, PRR, SARS_COV_2, Sil6_r, TNF, cytok} P(ACE_2, ADAM_{17}, AGTR_1, Ang, EGF, EGFR, Gefi, IL6AM_P, IL6STA_{T3}, NFKB, PRR, SARS_COV_2, Sil6_r, TNF, Toci, cytok) P(ADAM_{17} | ACE_2, AGTR_1, Ang, SARS_COV_2, Toci) P(Sil6_r | ACE_2, ADAM_{17}, AGTR_1, Ang, SARS_COV_2, Toci) P(Ang | ACE_2, SARS_COV_2) P(SARS_COV_2) P(NFKB | ACE_2, ADAM_{17}, AGTR_1, Ang, EGF, EGFR, Gefi, PRR, SARS_COV_2, TNF) P(PRR | ACE_2, Gefi, SARS_COV_2)$\n", + "\n", + "Because the query is identifiable, we can proceed to Step 3.\n" ], "text/plain": [ - "Sum[ACE2, ADAM17, AGTR1, Ang, IL6AMP, IL6STAT3, NFKB, PRR, SARS_COV2, Sil6r, TNF, Toci](P(ACE2 | SARS_COV2) * P(AGTR1 | ACE2, Ang, SARS_COV2) * P(IL6AMP | ACE2, ADAM17, AGTR1, Ang, EGF, EGFR, Gefi, IL6STAT3, NFKB, PRR, SARS_COV2, Sil6r, TNF, Toci) * P(IL6STAT3 | ACE2, ADAM17, AGTR1, Ang, SARS_COV2, Sil6r, Toci) * P(TNF | ACE2, ADAM17, AGTR1, Ang, SARS_COV2) * P(cytok | ACE2, ADAM17, AGTR1, Ang, EGF, EGFR, Gefi, IL6AMP, IL6STAT3, NFKB, PRR, SARS_COV2, Sil6r, TNF, Toci) * Sum[ACE2, ADAM17, AGTR1, Ang, EGF, EGFR, Gefi, IL6AMP, IL6STAT3, NFKB, PRR, SARS_COV2, Sil6r, TNF, cytok](P(ACE2, ADAM17, AGTR1, Ang, EGF, EGFR, Gefi, IL6AMP, IL6STAT3, NFKB, PRR, SARS_COV2, Sil6r, TNF, Toci, cytok)) * P(ADAM17 | ACE2, AGTR1, Ang, SARS_COV2, Toci) * P(Sil6r | ACE2, ADAM17, AGTR1, Ang, SARS_COV2, Toci) * P(Ang | ACE2, SARS_COV2) * P(SARS_COV2) * P(NFKB | ACE2, ADAM17, AGTR1, Ang, EGF, EGFR, Gefi, PRR, SARS_COV2, TNF) * P(PRR | ACE2, Gefi, SARS_COV2))" + "" ] }, - "execution_count": 11, "metadata": {}, - "output_type": "execute_result" + "output_type": "display_data" } ], "source": [ - "identify_outcomes(graph=graph, treatments=treatment, outcomes=outcome)" - ] - }, - { - "cell_type": "markdown", - "id": "5ac9e0aec8791fbc", - "metadata": { - "collapsed": false, - "jupyter": { - "outputs_hidden": false - } - }, - "source": [ - "The query is identifiable." - ] - }, - { - "cell_type": "markdown", - "id": "e84ccc3bdc28f772", - "metadata": { - "collapsed": false, - "jupyter": { - "outputs_hidden": false - } - }, - "source": [ - "## Step 3: Find nuisance variables and mark them as latent" - ] - }, - { - "cell_type": "markdown", - "id": "c7ea93588b4f7188", - "metadata": { - "collapsed": false, - "jupyter": { - "outputs_hidden": false - } - }, - "source": [ - "This function finds the nuisance variables for the input graph." + "eliater.step_2_notebook(graph=graph, treatment=treatment, outcome=outcome)" ] }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 9, "id": "4dff38fbf23ce61c", "metadata": { "ExecuteTime": { @@ -1146,119 +1978,59 @@ "outputs": [ { "data": { + "text/markdown": [ + "## Step 3/4: Identify Nuisance Variables and Simplify the ADMG" + ], "text/plain": [ - "set()" + "" ] }, - "execution_count": 12, "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "nuisance_variables = find_nuisance_variables(graph, treatments=treatment, outcomes=outcome)\n", - "nuisance_variables" - ] - }, - { - "cell_type": "markdown", - "id": "7401dd4e2c6d5d31", - "metadata": { - "collapsed": false, - "jupyter": { - "outputs_hidden": false - } - }, - "source": [ - "No variable is identified as the nuisance variable. Hence the simplified network in the next step will produce a graph similar to the original graph." - ] - }, - { - "cell_type": "markdown", - "id": "6aa2819509255d89", - "metadata": { - "collapsed": false, - "jupyter": { - "outputs_hidden": false - } - }, - "source": [ - "## Step 4: Simplify the network" - ] - }, - { - "cell_type": "markdown", - "id": "7b987190a5fa7453", - "metadata": { - "collapsed": false, - "jupyter": { - "outputs_hidden": false - } - }, - "source": [ - "In eliater, step 3, and 4 are both combined into a single function. Hence, the following function finds the nuisance variable (step 3), marks them as latent and then applies Evan's simplification rules (Step 4) to remove the nuisance variables. As a result, running the 'find_nuisance_variables' and 'mark_nuisance_variables_as_latent' functions is not necessary to get the value of step 4. However, we called them to illustrate the results. As there are no nuisance variables, the new graph will be the same as the original graph." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "id": "e6849ec627ee2b59", - "metadata": { - "ExecuteTime": { - "end_time": "2024-01-25T15:13:17.490059Z", - "start_time": "2024-01-25T15:13:17.462292Z" + "output_type": "display_data" }, - "collapsed": false, - "jupyter": { - "outputs_hidden": false - } - }, - "outputs": [], - "source": [ - "new_graph = remove_nuisance_variables(graph, treatments=treatment, outcomes=outcome)" - ] - }, - { - "cell_type": "markdown", - "id": "b8e9dd961d1d459a", - "metadata": { - "collapsed": false, - "jupyter": { - "outputs_hidden": false - } - }, - "source": [ - "## Step 5: Estimate the query" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "id": "5c926e5be8539db9", - "metadata": { - "ExecuteTime": { - "end_time": "2024-01-25T15:13:17.742590Z", - "start_time": "2024-01-25T15:13:17.475051Z" + { + "data": { + "text/markdown": [ + "No variables were identified as nuisance variables.\n", + "\n", + "Nevertheless, the algorithm proposed in [Graphs for margins of Bayesian\n", + "networks](https://arxiv.org/abs/1408.1809) (Evans, 2016) and implemented in\n", + "the $Y_0$ Causal Reasoning Engine is applied to the ADMG to attempt to\n", + "simplify the graph by reasoning over its bidirected edges (if they exist).\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" }, - "collapsed": false, - "jupyter": { - "outputs_hidden": false - } - }, - "outputs": [ { "data": { + "text/markdown": [ + "The simplification did not modify the graph." + ], "text/plain": [ - "0.6306584226679632" + "" ] }, - "execution_count": 14, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "False" + ] + }, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "estimate_ace(new_graph, treatments=treatment, outcomes=outcome, data=data)" + "reduced_graph = eliater.step_3_notebook(graph=graph, treatment=treatment, outcome=outcome)\n", + "reduced_graph is not None" ] }, { @@ -1279,7 +2051,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": null, "id": "14bdcdd244526750", "metadata": { "ExecuteTime": { @@ -1294,217 +2066,84 @@ "outputs": [ { "data": { + "text/markdown": [ + "## Step 5: Estimate the Query\n", + "\n", + "### Calculating the True Average Treatment Effect (ATE)\n", + "\n", + "We first generated synthetic observational data. Now, we generate two interventional datasets:\n", + "one where we set $EGFR$ to $0.0$ and one where we set $EGFR$ to $1.0$.\n", + "We can then calculate the \"true\" average treatment effect (ATE) as the difference of the means\n", + "for the outcome variable $cytok$ in each. The ATE is formulated as:\n", + "\n", + "$ATE = \\mathbb{E}[cytok \\mid do(EGFR = 1)] - \\mathbb{E}[cytok \\mid do(EGFR = 0)]$\n", + "\n", + "After generating 10,000 samples for each distribution, we took 500 subsamples of size\n", + "of size 1,000 and calculated the\n", + "ATE for each. The variance comes to 1.8e-05, which shows that the ATE is very stable with respect\n", + "to random generation. We therefore calculate the _true_ ATE as the average value from these samplings,\n", + "which comes to 7.9e-01.\n", + "\n", + "The ATE can be interpreted in the following way:\n", + "\n", + "1. If the ATE is positive, it suggests that the treatment $EGFR$ has a negative effect on the outcome $cytok$\n", + "2. If the ATE is negative, it suggests that the treatment $EGFR$ has a positive effect on the outcome $cytok$\n", + "\n", + "### Estimating the Average Treatment Effect (ATE)\n", + "\n", + "In practice, we are often unable to get the appropriate interventional data, and therefore want to estimate\n", + "the average treatment effect (ATE) from observational data. Because we're using synthetic data, we generate\n", + "10,000 samples, then took 500 subsamples of size 1,000 through which we calculated\n", + "the following:\n", + "\n", + "1. The ATE, using the y0/ananke implementation\n", + "2. The ATE, using the Eliater linear regression implementation\n" + ], "text/plain": [ - "0.7944416772404566" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "def get_background_ace(seed=None) -> float:\n", - " # get interventional data where treatment is set to 1\n", - " data_1 = example.generate_data(1000, {treatment: 1.0}, seed=seed)\n", - " # get interventional data where treatment is set to 0\n", - " data_0 = example.generate_data(1000, {treatment: 0.0}, seed=seed)\n", - " return data_1.mean()[outcome.name] - data_0.mean()[outcome.name]\n", - "\n", - "\n", - "# get the true value of ATE\n", - "get_background_ace(seed=SEED)" - ] - }, - { - "cell_type": "markdown", - "id": "30a25ac6032e7af3", - "metadata": { - "collapsed": false, - "jupyter": { - "outputs_hidden": false - } - }, - "source": [ - "### Random Sampling Evaluation" - ] - }, - { - "cell_type": "markdown", - "id": "5ef2290ac3f5673a", - "metadata": { - "collapsed": false, - "jupyter": { - "outputs_hidden": false - } - }, - "source": [ - "For this case study, since the observational data is synthetic, we generated multiple sub-samples from the observational data and for each sub-sampled data, estimated the value of ATE. Hence, we have a range of ATE values instead of a point estimate that we got in the step 5 above. This will help to interpret the results better. The first quantile of the range of estimated ATEs was 0.358 and third quantile was 0.821 which covers the ground truth $\\mathrm{ATE}$ of 0.794$. " - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "id": "f5eb9d860279f708", - "metadata": { - "ExecuteTime": { - "end_time": "2024-01-25T15:13:17.851265Z", - "start_time": "2024-01-25T15:13:17.805372Z" - }, - "collapsed": false, - "jupyter": { - "outputs_hidden": false - } - }, - "outputs": [], - "source": [ - "# Population => Generate D = 10000 data points\n", - "D = example.generate_data(10000, seed=SEED)" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "id": "89581483f3392dee", - "metadata": { - "ExecuteTime": { - "end_time": "2024-01-25T15:13:19.138588Z", - "start_time": "2024-01-25T15:13:17.839368Z" - }, - "collapsed": false, - "jupyter": { - "outputs_hidden": false - } - }, - "outputs": [], - "source": [ - "# Samples => Generate 1000 datasets with 1000 points each (d) using random sampling\n", - "d_count = 1000\n", - "d_size = 1000\n", - "d = [D.sample(d_size) for _ in range(d_count)]" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "id": "269f193d582cb157", - "metadata": { - "ExecuteTime": { - "end_time": "2024-01-25T15:15:34.888624Z", - "start_time": "2024-01-25T15:13:19.158177Z" - }, - "collapsed": false, - "jupyter": { - "outputs_hidden": false - } - }, - "outputs": [], - "source": [ - "ate = [estimate_ace(new_graph, treatments=treatment, outcomes=outcome, data=data) for data in d]" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "id": "cedf2a4cfdf60ea5", - "metadata": { - "ExecuteTime": { - "end_time": "2024-01-25T15:15:35.285135Z", - "start_time": "2024-01-25T15:15:34.888833Z" - }, - "collapsed": false, - "jupyter": { - "outputs_hidden": false - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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9OhRT5cEAAAaiFfNWaqr8PBwFRcXu7QVFxcrMDBQrVq1kslkkslkumSf8PDwWs/r7+8vf3//BqkZAAA0Lk16ZCk2NlbZ2dkube+9955iY2MlSX5+fho8eLBLH7vdruzsbGcfAADQvHlVWKqoqFB+fr7y8/MlnVsaID8/X0eOHJF07vbY1KlTnf1nz56tf/3rX5o/f74OHDig5557Tq+99prmzZvn7JOUlKQXX3xR69at0/79+zVnzhxVVlY6Px0HAACaN6+6DffZZ5/plltucb5OSkqSJE2bNk1r165VUVGRMzhJUnR0tN5++23NmzdPf/jDH3Tddddp9erVzmUDJGnixIk6duyYUlJSZLFYNGDAAGVlZV006RsAADRPPg6Hw+HpIryd1WqV2WxWeXm5AgMDPV0OgHp06NAhzZo1S6tWrVL37t09XQ6AeuTu+7dX3YYDAAC42ghLAAAABghLAAAABghLAAAABghLAAAABghLAAAABghLAAAABghLAAAABghLAAAABghLAAAABghLAAAABghLAAAABghLAAAABghLAAAABghLAAAABtwOS7t27ZLNZqt1f3V1tV577bV6KQoAAKCxcDssxcbG6sSJE87XgYGB+te//uV8XVZWpjvvvLN+qwMAAPAwt8OSw+EwfF1bGwAAgDer1zlLPj4+9Xk6AAAAj2OCNwAAgIEWden8z3/+UxaLRdK5W24HDhxQRUWFJOn48eP1Xx0AAICH1Sks3XrrrS7zkn7xi19IOnf7zeFwcBsOAAA0OW6HpYKCgoasA41AcXGxysvLPV0G0Kh8++23Ln8COMdsNissLMzTZVwVboeldevW6eGHH1br1q0bsh54SHFxsab891Sdqan2dClAo/TEE094ugSgUWnp56+X/7y+WQQmt8PSokWLNHv2bMJSE1VeXq4zNdX6d5efyR5g9nQ5AIBGzPd0ufSvj1ReXk5YuhBrKLmhslIymTxdxRXxqapSgM0mmylA9pZtPV0OAKAR8z1TrQCbTT5VVefe+7yVm7X7ONxMQb6+viouLlaHDh1+VF1NkdVqldlsVrmkQE8XAwAA3GKVZNa5uyuBgbW/g9fp03Ddu3e/7CfeSktL63JKAACARq1OYWnRokUym5nPUqvCQskgmTZmX331le677z5V9hwte+sQT5cDAGjEfKuOq82BbfrjH/+obt26ebqcK2e1SpGRl+1Wp7A0adIkhYaGXnFNTV6bNuc2L+Ro3VqnTSadbukvu5+/p8sBADRivmf8ZTKZ5Gjd2mvf9yRJNptb3dx+3AkLTgIAgObI7bBkNA/carXq+eef15AhQ+qlKCPp6enq3LmzAgICFBMTo127dtXad8SIEfLx8bloGzNmjLPP9OnTL9qfkJDQ4NcBAAC8g9u34ex2+0VtH374oTIzM7VlyxaZzWb96le/qtfifmjTpk1KSkpSRkaGYmJitGLFCsXHx+vgwYOXvD24ZcsW1dTUOF+fOHFC/fv314QJE1z6JSQk6KWXXnK+9vfnNhQAADinTnOWJOn777/X2rVr9dJLL6msrEwnT57UK6+8ojvuuKPBb9UtX75cM2fOVGJioiQpIyNDb7/9tjIzM7VgwYKL+gcHB7u83rhxo1q3bn1RWPL391d4eHjDFQ4AALyW27fhXn/9dY0ePVo9evRQfn6+nnnmGRUWFsrX11d9+/Zt8KBUU1Oj3bt3Ky4uztnm6+uruLg45ebmunWONWvWaNKkSWrzg8loO3bsUGhoqHr06KE5c+boxIkThueprq6W1Wp12QAAQNPkdliaOHGiBg4cqKKiIm3evFnjxo2Tn59fQ9bm4vjx47LZbBctqx4WFiaLxXLZ43ft2qUvvvhCd999t0t7QkKC1q9fr+zsbD311FP66KOPNGrUKNkMZsinpaXJbDY7t6ioqCu7KAAA0Oi5HZZmzJih9PR0JSQkKCMjQydPnmzIuurdmjVr1LdvXw0dOtSlfdKkSfrlL3+pvn37avz48frrX/+qTz/9VDt27Kj1XMnJySovL3duR48ebeDqAQCAp7gdll544QUVFRVp1qxZevXVVxUREaFx48bJ4XBccvJ3fQsJCZHJZFJxcbFLe3Fx8WXnG1VWVmrjxo2aMWPGZb9Ply5dFBISosOHD9fax9/fX4GBgS4bAABomtwOS5LUqlUrTZs2TR999JH27dunPn36KCwsTDfeeKPuuusubdmypaHqlJ+fnwYPHqzs7Gxnm91uV3Z2tmJjYw2P3bx5s6qrqzVlypTLfp/vvvtOJ06cUERExI+uGQAAeL86haULdevWTcuWLdPRo0f18ssvq6qqSnfeeWd91naRpKQkvfjii1q3bp3279+vOXPmqLKy0vnpuKlTpyo5Ofmi49asWaPx48erffv2Lu0VFRV65JFH9Pe//13ffPONsrOzNW7cOHXt2lXx8fENei0AAMA71HnpgB/y9fXV2LFjNXbsWJWUlNRHTbWaOHGijh07ppSUFFksFg0YMEBZWVnOSd9HjhyRr69r/jt48KB27typd99996LzmUwm7d27V+vWrVNZWZkiIyN12223acmSJay1BAAAJNVDWLrQ1Xhu3Ny5czV37txL7rvUpOwePXrUuvp4q1attH379vosDwAANDFXfBsOAACgOSAsAQAAGCAsAQAAGCAsAQAAGHBrgne7du3cfvZbaWnpjyoIAACgMXErLK1YscL59YkTJ7R06VLFx8c7F4PMzc3V9u3b9dhjjzVIkQAAAJ7iVliaNm2a8+vbb79dixcvdvn4/v33368//elPev/99zVv3rz6rxIAAMBD6jxnafv27UpISLioPSEhQe+//369FAUAANBY1DkstW/fXlu3br2ofevWrRc9TgQAAMDb1XkF70WLFunuu+/Wjh07FBMTI0nKy8tTVlaWXnzxxXovEAAAwJPqHJamT5+uXr16aeXKldqyZYskqVevXtq5c6czPAEAADQVV/RsuJiYGG3YsKG+awEAAGh0rmhRyq+//loLFy7UXXfdpZKSEknSO++8oy+//LJeiwMAAPC0Ooeljz76SH379lVeXp5ef/11VVRUSJI+//xzpaam1nuBAAAAnlTn23ALFizQ0qVLlZSUpLZt2zrbf/7zn+tPf/pTvRaHq8/332WeLgEA0Mg1t/eKOoelffv26ZVXXrmoPTQ0VMePH6+XouA5rQpyPF0CAACNSp3DUlBQkIqKihQdHe3S/o9//EPXXnttvRUGz/h39HDZWwV5ugwAQCPm+++yZvXLdZ3D0qRJk/Too49q8+bN8vHxkd1u18cff6yHH35YU6dObYgacRXZWwXJ3ibE02UAANBo1HmC97Jly9SzZ09FRUWpoqJCvXv31vDhwzVs2DAtXLiwIWoEAADwmDqPLPn5+enFF19USkqK9u3bp4qKCg0cOFDdunVriPoAAAA8qs4jS4sXL1ZVVZWioqI0evRo3XHHHerWrZv+/e9/a/HixQ1RIwAAgMfUOSwtWrTIubbShaqqqrRo0aJ6KQoAAKCxqHNYcjgc8vHxuaj9888/V3BwcL0UBQAA0Fi4PWepXbt28vHxkY+Pj7p37+4SmGw2myoqKjR79uwGKRIAAMBT3A5LK1askMPh0G9+8xstWrRIZrPZuc/Pz0+dO3dWbGxsgxQJAADgKW6HpWnTpkmSoqOjNWzYMLVs2bLBigIAAGgs6rx0wM9+9jPn16dPn1ZNTY3L/sDAwB9fFQAAQCNR5wneVVVVmjt3rkJDQ9WmTRu1a9fOZQMAAGhK6hyWHnnkEX3wwQd6/vnn5e/vr9WrV2vRokWKjIzU+vXrG6JGAAAAj6nzbbi33npL69ev14gRI5SYmKibb75ZXbt2VadOnbRhwwZNnjy5IeoEAADwiDqPLJWWlqpLly6Szs1PKi0tlSTddNNNyslp+CcQp6enq3PnzgoICFBMTIx27dpVa9+1a9c6lzs4vwUEBLj0cTgcSklJUUREhFq1aqW4uDh99dVXDX0ZAADAS9Q5LHXp0kUFBQWSpJ49e+q1116TdG7EKSgoqF6L+6FNmzYpKSlJqamp2rNnj/r376/4+HiVlJTUekxgYKCKioqc27fffuuy/3e/+51WrlypjIwM5eXlqU2bNoqPj9fp06cb9FoAAIB3qHNYSkxM1Oeffy5JWrBggdLT0xUQEKB58+bpkUceqfcCL7R8+XLNnDlTiYmJ6t27tzIyMtS6dWtlZmbWeoyPj4/Cw8OdW1hYmHOfw+HQihUrtHDhQo0bN079+vXT+vXrVVhYqDfeeKNBrwUAAHiHOs9ZmjdvnvPruLg4HThwQLt371bXrl3Vr1+/ei3uQjU1Ndq9e7eSk5Odbb6+voqLi1Nubm6tx1VUVKhTp06y2+0aNGiQli1bpj59+kiSCgoKZLFYFBcX5+xvNpsVExOj3NxcTZo06ZLnrK6uVnV1tfO11Wr9sZcHAAAaqTqPLP1Qp06d9F//9V8NGpQk6fjx47LZbC4jQ5IUFhYmi8VyyWN69OihzMxMbd26VS+//LLsdruGDRum7777TpKcx9XlnJKUlpYms9ns3KKion7MpQEAgEasziNLkvTpp5/qww8/VElJiex2u8u+5cuX10th9SE2NtblESzDhg1Tr1699MILL2jJkiVXfN7k5GQlJSU5X1utVgITAABNVJ3D0rJly7Rw4UL16NFDYWFhLg/UvfDr+hYSEiKTyaTi4mKX9uLiYoWHh7t1jpYtW2rgwIE6fPiwJDmPKy4uVkREhMs5BwwYUOt5/P395e/vX8crAAAA3qjOt+H+8Ic/KDMzU/v379eOHTv04YcfOrcPPvigIWqUdO5hvYMHD1Z2drazzW63Kzs72+0H+NpsNu3bt88ZjKKjoxUeHu5yTqvVqry8PB4KDAAAJF3ByJKvr69uvPHGhqjlspKSkjRt2jQNGTJEQ4cO1YoVK1RZWanExERJ0tSpU3XttdcqLS1NkrR48WL99Kc/VdeuXVVWVqbf//73+vbbb3X33XdLOjcS9uCDD2rp0qXq1q2boqOj9dhjjykyMlLjx4/3yDUCAIDG5Yo+DZeenq4VK1Y0QDnGJk6cqGPHjiklJUUWi0UDBgxQVlaWc4L2kSNH5Ov7n8GykydPaubMmbJYLGrXrp0GDx6sTz75RL1793b2mT9/viorKzVr1iyVlZXppptuUlZW1kWLVwIAgObJx+FwOOpygN1u15gxY3To0CH17t1bLVu2dNm/ZcuWei3QG1itVpnNZpWXlyswMNDT5VyRQ4cOadasWars/UvZ24R4uhwAQCPmW3lcbf75platWqXu3bt7upwr5u77d51Hlu6//359+OGHuuWWW9S+ffsGndQNAADgaXUOS+vWrdPrr7+uMWPGNEQ9AAAAjUqdPw0XHBys66+/viFqAQAAaHTqHJYef/xxpaamqqqqqiHqAQAAaFTqfBtu5cqV+vrrrxUWFqbOnTtfNMF7z5499VYcAACAp9U5LLH+EAAAaE7qHJZSU1Mbog4AAIBGqc5zlgAAAJoTt0aWgoODdejQIYWEhKhdu3aGayuVlpbWW3EAAACe5lZYevbZZ9W2bVvn1yxECQAAmgu3wtK0adOcX0+fPr2hagEAAGh06jxnyWQyqaSk5KL2EydOyGQy1UtRAAAAjUWdPw1X23N3q6ur5efn96MLgmf5ni73dAkAgEauub1XuB2WVq5cKUny8fHR6tWrdc011zj32Ww25eTkqGfPnvVfIa4Ks9msln7+0r8+8nQpAAAv0NLPX2az2dNlXBU+jtqGin4gOjpakvTtt9/quuuuc7nl5ufnp86dO2vx4sWKiYlpmEobMavVKrPZrPLycgUGBnq6nCtWXFys8vLm9dsCcDnffvutnnjiCf32t79Vp06dPF0O0GiYzWaFhYV5uowfxd33b7dHlgoKCiRJt9xyi7Zs2aJ27dr9+CrRqISFhXn9f/hAQ+nUqZO6d+/u6TIAeECdJ3h/+OGHLkHJZrMpPz9fJ0+erNfCAAAAGoM6h6UHH3xQa9askXQuKA0fPlyDBg1SVFSUduzYUd/1AQAAeFSdw9LmzZvVv39/SdJbb72lb775RgcOHNC8efP029/+tt4LBAAA8KQ6h6UTJ04oPDxckrRt2zZNmDBB3bt3129+8xvt27ev3gsEAADwpDqHpbCwMP3zn/+UzWZTVlaWRo4cKUmqqqpiUUoAANDk1HlRysTERN1xxx2KiIiQj4+P4uLiJEl5eXmsswQAAJqcOoelxx9/XDfccIOOHj2qCRMmyN/fX9K5x6AsWLCg3gsEAADwpDqHJUn69a9/fVHbhQ/bBQAAaCrcnrM0evRol9Wdn3zySZWVlTlfnzhxQr17967X4gAAADzN7bC0fft2VVdXO18vW7ZMpaWlztdnz57VwYMH67c6AAAAD3M7LP3wEXJuPlIOAADAq9V56QAAAIDmxO2w5OPjIx8fn4vaAAAAmjK3Pw3ncDg0ffp051IBp0+f1uzZs9WmTRtJcpnPBAAA0FS4PbI0bdo0hYaGymw2y2w2a8qUKYqMjHS+Dg0N1dSpUxuyVklSenq6OnfurICAAMXExGjXrl219n3xxRd18803q127dmrXrp3i4uIu6j99+nTnqNn5LSEhoaEvAwAAeAm3R5ZeeumlhqzDLZs2bVJSUpIyMjIUExOjFStWKD4+XgcPHlRoaOhF/Xfs2KE777xTw4YNU0BAgJ566inddttt+vLLL3Xttdc6+yUkJLhc3/nRMwAAAK+a4L18+XLNnDlTiYmJ6t27tzIyMtS6dWtlZmZesv+GDRt0zz33aMCAAerZs6dWr14tu92u7Oxsl37+/v4KDw93bu3atbsalwMAALyA14Slmpoa7d692/ksOkny9fVVXFyccnNz3TpHVVWVzpw5o+DgYJf2HTt2KDQ0VD169NCcOXN04sQJw/NUV1fLarW6bAAAoGnymrB0/Phx2Ww2hYWFubSHhYXJYrG4dY5HH31UkZGRLoErISFB69evV3Z2tp566il99NFHGjVqlGw2W63nSUtLc87VMpvNioqKurKLAgAAjd4VPRvOGz355JPauHGjduzYoYCAAGf7pEmTnF/37dtX/fr10/XXX68dO3bo1ltvveS5kpOTlZSU5HxttVoJTAAANFFeM7IUEhIik8mk4uJil/bi4mKFh4cbHvv000/rySef1Lvvvqt+/foZ9u3SpYtCQkJ0+PDhWvv4+/srMDDQZQMAAE2T14QlPz8/DR482GVy9vnJ2rGxsbUe97vf/U5LlixRVlaWhgwZctnv89133+nEiROKiIiol7oBAIB385qwJElJSUl68cUXtW7dOu3fv19z5sxRZWWlEhMTJUlTp05VcnKys/9TTz2lxx57TJmZmercubMsFossFosqKiokSRUVFXrkkUf097//Xd98842ys7M1btw4de3aVfHx8R65RgAA0Lh41ZyliRMn6tixY0pJSZHFYtGAAQOUlZXlnPR95MgR+fr+J/89//zzqqmp0a9//WuX86Smpurxxx+XyWTS3r17tW7dOpWVlSkyMlK33XablixZwlpLAABAkpeFJUmaO3eu5s6de8l9O3bscHn9zTffGJ6rVatW2r59ez1VBgAAmiKvug0HAABwtRGWAAAADBCWAAAADBCWAAAADBCWAAAADBCWAAAADBCWAAAADBCWAAAADBCWAAAADBCWAAAADBCWAAAADBCWAAAADBCWAAAADBCWAAAADBCWAAAADBCWAAAADBCWAAAADBCWAAAADBCWAAAADBCWAAAADBCWAAAADBCWAAAADBCWAAAADBCWAAAADBCWAAAADBCWAAAADBCWAAAADBCWAAAADBCWAAAADBCWAAAADBCWAAAADHhdWEpPT1fnzp0VEBCgmJgY7dq1y7D/5s2b1bNnTwUEBKhv377atm2by36Hw6GUlBRFRESoVatWiouL01dffdWQlwAAALyIV4WlTZs2KSkpSampqdqzZ4/69++v+Ph4lZSUXLL/J598ojvvvFMzZszQP/7xD40fP17jx4/XF1984ezzu9/9TitXrlRGRoby8vLUpk0bxcfH6/Tp01frsgAAQCPm43A4HJ4uwl0xMTH6yU9+oj/96U+SJLvdrqioKN13331asGDBRf0nTpyoyspK/fWvf3W2/fSnP9WAAQOUkZEhh8OhyMhIPfTQQ3r44YclSeXl5QoLC9PatWs1adIkt+qyWq0ym80qLy9XYGBgPVwpgMbi0KFDmjVrllatWqXu3bt7uhwA9cjd92+vGVmqqanR7t27FRcX52zz9fVVXFyccnNzL3lMbm6uS39Jio+Pd/YvKCiQxWJx6WM2mxUTE1PrOSWpurpaVqvVZQMAAE2T14Sl48ePy2azKSwszKU9LCxMFovl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Ny0tTYsWLbrSywEAAF7Eo2FpwYIFeuqppwz77N+//4rPP2vWLOfXffv2VUREhG699VZ9/fXXuv7666/4vMnJyUpKSnK+tlqtioqKuuLzAQCAxsujYemhhx7S9OnTDft06dJF4eHhKikpcWk/e/asSktLFR4e7vb3i4mJkSQdPnxY119/vcLDw7Vr1y6XPsXFxZJkeF5/f3/5+/u7/X0BAID38mhY6tChgzp06HDZfrGxsSorK9Pu3bs1ePBgSdIHH3wgu93uDEDuyM/PlyRFREQ4z/vEE0+opKTEeZvvvffeU2BgoHr37l3HqwEAAE2RV0zw7tWrlxISEjRz5kzt2rVLH3/8sebOnatJkyY5Pwn3/fffq2fPns6Roq+//lpLlizR7t279c033+jNN9/U1KlTNXz4cPXr10+SdNttt6l379767//+b33++efavn27Fi5cqHvvvZeRIwAAIMlLJnhL5z7VNnfuXN16663y9fXV7bffrpUrVzr3nzlzRgcPHnR+2s3Pz0/vv/++VqxYocrKSkVFRen222/XwoULnceYTCb99a9/1Zw5cxQbG6s2bdpo2rRpLusyueP86gt8Kg4AAO9x/n37cqsoecU6S43dd999xwRvAAC81NGjR3XdddfVup+wVA/sdrsKCwvVtm1b+fj4eLocAPXo/Kddjx49yqKzQBPjcDh06tQpRUZGyte39plJhCUAMMAK/QC8YoI3AACApxCWAAAADBCWAMCAv7+/UlNTWU4EaMaYswQAAGCAkSUAAAADhCUAAAADhCUAAAADhCUAAAADhCUAAAADhCUAAAADhCUAAAADhCUAAAAD/w8uFP9HtkB2pQAAAABJRU5ErkJggg==", - "text/plain": [ - "
" + "" ] }, "metadata": {}, "output_type": "display_data" - } - ], - "source": [ - "ax = sns.boxplot(y=ate)\n", - "ax.axhline(y=get_background_ace(seed=SEED), label=\"True ATE\", color=\"r\")\n", - "ax.set(ylabel=\"Estimated ATE\")\n", - "ax.legend()\n", - "# plt.savefig(\"/Users/sarataheri/GitHub/eliater/img/Sars_ATE_boxplot.png\")" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "id": "6588f9c6c815759", - "metadata": { - "ExecuteTime": { - "end_time": "2024-01-25T15:15:35.343888Z", - "start_time": "2024-01-25T15:15:35.270885Z" }, - "collapsed": false, - "jupyter": { - "outputs_hidden": false - } - }, - "outputs": [ { "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "", + "version_major": 2, + "version_minor": 0 + }, "text/plain": [ - "0.379622287669946" + "Subsampling: 0%| | 0/500 [00:00\n", " 0\n", " eliater\n", - " 0.0.1-dev-261a89cc\n", + " 0.0.3-dev-96cf1bf2\n", " \n", " \n", " 1\n", " y0\n", - " 0.2.7-UNHASHED\n", + " 0.2.10-dev-8f27d998\n", " \n", " \n", " 2\n", " Run at\n", - " 2024-01-26 08:48:08\n", + " 2024-04-25 08:51:09\n", " \n", " \n", "\n", @@ -71,9 +71,9 @@ ], "text/plain": [ " key value\n", - "0 eliater 0.0.1-dev-261a89cc\n", - "1 y0 0.2.7-UNHASHED\n", - "2 Run at 2024-01-26 08:48:08" + "0 eliater 0.0.3-dev-96cf1bf2\n", + "1 y0 0.2.10-dev-8f27d998\n", + "2 Run at 2024-04-25 08:51:09" ] }, "execution_count": 1, @@ -82,23 +82,15 @@ } ], "source": [ - "import networkx as nx\n", - "import pandas as pd\n", + "from IPython.display import Image, set_matplotlib_formats\n", "\n", - "from eliater import version_df\n", - "from eliater.data import load_sachs_df\n", - "from eliater.discover_latent_nodes import (\n", - " find_nuisance_variables,\n", - " mark_nuisance_variables_as_latent,\n", - " remove_nuisance_variables,\n", - ")\n", - "from eliater.examples import t_cell_signaling_example\n", - "from eliater.network_validation import print_graph_falsifications\n", - "from y0.algorithm.estimation import estimate_ace\n", - "from y0.algorithm.identify import Identification, identify_outcomes\n", + "import eliater\n", + "from eliater.examples import t_cell_signaling_example as example\n", "from y0.dsl import P, Variable\n", "\n", - "version_df()" + "set_matplotlib_formats(\"svg\")\n", + "\n", + "eliater.version_df()" ] }, { @@ -117,8 +109,8 @@ }, "outputs": [], "source": [ - "RAF = Variable(\"Raf\")\n", - "ERK = Variable(\"Erk\")\n", + "treatment = RAF = Variable(\"Raf\")\n", + "outcome = ERK = Variable(\"Erk\")\n", "PKC = Variable(\"PKC\")\n", "MEK = Variable(\"Mek\")" ] @@ -174,8 +166,6 @@ } ], "source": [ - "from IPython.display import Image\n", - "\n", "Image(filename=\"../img/Tsignaling.png\", width=500, height=500)" ] }, @@ -196,7 +186,897 @@ "outputs": [ { "data": { - "image/png": "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ZK5pedGuC4Z8//33Yjs//PCDzvLz58+L5bt27RLl7d+/P7366qvk4OBAtWrVojFjxtDDhw8Nbuf69esin82bN+td59atW9SyZUtxu2Xt2rXlui6wso+DAVahBAQEiB/a1q1bi8+nT58uPv/rr78Mpv/xxx/FevPmzTO4XocOHQo9oXt4eNCNGzd00hp6VE97OnPmjFhf09cBQJE75ZUVaWlpFB4eLprHC06VK1emkJAQWrt2rej5b2NjQ40bN6bQ0FBatWoVxcXFmTS2gUZqaqreumDIxx9/LNY/d+6czvItW7ZI/j99+vQx+P9r2LChwTc67ty5U6x3/vx5neWHDh0id3d3AkC1atWi48ePi2UVoS6wsomDAVZhHD16VPKDPH78eLEsMDBQXI0+fvzYYB7vvfeeSH/27Fm966jVanJxcaG2bdvSvHnzKDIykuLi4ujYsWO0detWUigUIo8ePXropL98+TIlJiZS3759Cch/rbB2h8bExETJVey4ceNEfgcPHnyBb6hsSEpKojlz5oir9oJTjRo1KCQkhE6ePPlC2zlw4IDeumBI586dxZW4vg6Pn3zyCQEge3t7atOmDdnb29Po0aNpz549dOrUKdq6dSs1bNiw0BaoL774QrRWFGzVWLp0qRjs6c0339TpxFrR6gIrOzgYYBVCUlISvfzyy5KTyoYNG8RyzTj33t7eBvPYsWOH6BU/aNAgg+tlZ2frveLXpnks0NbW1uAreDVXeYGBgUbzWr9+vdinL7/80ui65YlaraY///yTxowZQy4uLnoDA39/f1q5cmWRX3JERLRkyRK9dcEQzTgHzZo107tcE1AC+eMVaF+xa9y+fVvcEhk8eLDefN555x0CQM2bNxefPXv2jPr37y/yHz16NGVnZ+ukrah1gVkeBwOs3Hv06BHVr19f50Siaer9559/xGdvv/22JG1WVhadO3eOJk2aJPoadO7c2WATr6n27t0rtnnlyhWd5dpPN0yfPt1oXmfPnhV5DRw48IXKVVZlZmbSzz//TG+//bYYmU97srW1pV69etG2bdsoMzPTpDwHDhxotNlf2+3bt8W6w4cP17tOjRo1xDr79+83mFejRo0IAPXu3Vvvcs2jjiNHjiSi/BdGvfHGGwTk94kIDw83mLc11AVmGXZgrBzLzs5Gnz59cOXKFZ1lXl5eAICEhATxWVRU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", + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " 2024-04-25T08:51:09.745852\n", + " image/svg+xml\n", + " \n", + " \n", + " Matplotlib v3.8.0, https://matplotlib.org/\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n" + ], "text/plain": [ "
" ] @@ -206,7 +1086,7 @@ } ], "source": [ - "graph = t_cell_signaling_example.graph\n", + "graph = example.graph\n", "graph.draw()" ] }, @@ -349,17 +1229,110 @@ " 1\n", " 1\n", " \n", + " \n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " \n", + " \n", + " 848\n", + " 1\n", + " 0\n", + " 0\n", + " 0\n", + " 1\n", + " 1\n", + " 1\n", + " 0\n", + " 1\n", + " 0\n", + " 0\n", + " \n", + " \n", + " 849\n", + " 0\n", + " 0\n", + " 0\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 0\n", + " \n", + " \n", + " 850\n", + " 1\n", + " 1\n", + " 0\n", + " 1\n", + " 1\n", + " 1\n", + " 0\n", + " 1\n", + " 1\n", + " 0\n", + " 0\n", + " \n", + " \n", + " 851\n", + " 1\n", + " 0\n", + " 0\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 0\n", + " 1\n", + " 1\n", + " 0\n", + " \n", + " \n", + " 852\n", + " 1\n", + " 0\n", + " 0\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 0\n", + " 1\n", + " 1\n", + " 0\n", + " \n", " \n", "\n", + "

853 rows × 11 columns

\n", "" ], "text/plain": [ - " Raf Mek Plcg PIP2 PIP3 Erk Akt PKA PKC P38 Jnk\n", - "0 0 0 0 1 1 1 0 1 1 1 1\n", - "1 0 1 1 1 1 1 1 1 1 1 1\n", - "2 1 0 0 1 1 1 1 1 1 0 0\n", - "3 1 0 0 1 1 1 1 1 1 0 0\n", - "4 0 0 1 1 0 1 1 1 1 1 1" + " Raf Mek Plcg PIP2 PIP3 Erk Akt PKA PKC P38 Jnk\n", + "0 0 0 0 1 1 1 0 1 1 1 1\n", + "1 0 1 1 1 1 1 1 1 1 1 1\n", + "2 1 0 0 1 1 1 1 1 1 0 0\n", + "3 1 0 0 1 1 1 1 1 1 0 0\n", + "4 0 0 1 1 0 1 1 1 1 1 1\n", + ".. ... ... ... ... ... ... ... ... ... ... ...\n", + "848 1 0 0 0 1 1 1 0 1 0 0\n", + "849 0 0 0 1 1 1 1 1 1 1 0\n", + "850 1 1 0 1 1 1 0 1 1 0 0\n", + "851 1 0 0 1 1 1 1 0 1 1 0\n", + "852 1 0 0 1 1 1 1 0 1 1 0\n", + "\n", + "[853 rows x 11 columns]" ] }, "execution_count": 5, @@ -368,25 +1341,8 @@ } ], "source": [ - "data = load_sachs_df()\n", - "data.head()" - ] - }, - { - "cell_type": "markdown", - "id": "bd48019f2e6dd0f8", - "metadata": { - "ExecuteTime": { - "end_time": "2024-01-21T09:34:28.355325Z", - "start_time": "2024-01-21T09:34:28.173800Z" - }, - "collapsed": false, - "jupyter": { - "outputs_hidden": false - } - }, - "source": [ - "## Step 1: Verify correctness of the network structure" + "data = example.data\n", + "data" ] }, { @@ -405,549 +1361,53 @@ }, "outputs": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "Of the 35 d-separations implied by the network's structure, only 6(17.14%) rejected the null hypothesis at p<0.01.\n", - "\n", - "Since this is less than 30%, Eliater considers this minor and leaves the network unmodified.]\n", - "\n", - "Finished in 1.70 seconds.\n", - "\n" - ] + "data": { + "text/markdown": [ + "## Step 1: Checking the ADMG Structure" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" }, { "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
leftrightgivenstatspdofp_adjp_adj_significant
0PlcgRafPKC249.8690640.00000020.000000True
1ErkPIP3PKC478.9227450.00000020.000000True
2MekPlcgPKC208.4868900.00000020.000000True
3JnkP38PKA|PKC171.7160590.00000040.000000True
4ErkPIP2PKC89.0334250.00000020.000000True
5AktPKCErk|PIP3|PKA38.1758530.00000370.000084True
6PIP3PKCPIP2|Plcg17.2052170.00176340.051135False
7P38PlcgPKC8.1790630.01674720.468918False
8PIP2RafPKC1.9727610.37292421.000000False
9MekP38PKA|PKC3.0120760.55580641.000000False
10AktP38PKA|PKC2.3543960.67088441.000000False
11JnkRafPKA|PKC0.9816850.91256041.000000False
12ErkRafMek|PKA8.2825010.08176141.000000False
13AktJnkPKA|PKC8.2099050.08418541.000000False
14AktMekErk|PIP3|PKA4.4567590.72591871.000000False
15AktPIP2PIP3|PKC2.3265990.67593141.000000False
16P38PIP3PKC1.0819930.58216821.000000False
17PIP2PKAPKC0.7951880.67193521.000000False
18PIP3RafPKC1.2878930.52521621.000000False
19MekPIP3PKC1.9338210.38025621.000000False
20ErkPlcgPKC5.3720490.06815121.000000False
21MekPIP2PKC0.7321680.69344421.000000False
22P38RafPKA|PKC2.1738550.70381941.000000False
23JnkMekPKA|PKC0.3178850.98863141.000000False
24P38PIP2PKC0.5643780.75413121.000000False
25ErkPKCMek|PKA4.0045360.40539241.000000False
26JnkPlcgPKC1.3784010.50197721.000000False
27PIP3PKAPKC0.9618090.61822421.000000False
28ErkP38Mek|PKA7.1165430.12985641.000000False
29ErkJnkMek|PKA4.0608550.39783341.000000False
30JnkPIP3PKC0.0275160.98633621.000000False
31JnkPIP2PKC2.8627710.23897821.000000False
32PKAPlcgPKC0.3441130.84193221.000000False
33AktPlcgPIP3|PKC0.6925230.95224841.000000False
34AktRafErk|PIP3|PKA5.1331730.64371571.000000False
\n", - "
" + "Since this is less than 30%, Eliater considers this minor and leaves the ADMG unmodified. Finished in 1.22 seconds.\n" ], "text/plain": [ - " left right given stats p dof p_adj \\\n", - "0 Plcg Raf PKC 249.869064 0.000000 2 0.000000 \n", - "1 Erk PIP3 PKC 478.922745 0.000000 2 0.000000 \n", - "2 Mek Plcg PKC 208.486890 0.000000 2 0.000000 \n", - "3 Jnk P38 PKA|PKC 171.716059 0.000000 4 0.000000 \n", - "4 Erk PIP2 PKC 89.033425 0.000000 2 0.000000 \n", - "5 Akt PKC Erk|PIP3|PKA 38.175853 0.000003 7 0.000084 \n", - "6 PIP3 PKC PIP2|Plcg 17.205217 0.001763 4 0.051135 \n", - "7 P38 Plcg PKC 8.179063 0.016747 2 0.468918 \n", - "8 PIP2 Raf PKC 1.972761 0.372924 2 1.000000 \n", - "9 Mek P38 PKA|PKC 3.012076 0.555806 4 1.000000 \n", - "10 Akt P38 PKA|PKC 2.354396 0.670884 4 1.000000 \n", - "11 Jnk Raf PKA|PKC 0.981685 0.912560 4 1.000000 \n", - "12 Erk Raf Mek|PKA 8.282501 0.081761 4 1.000000 \n", - "13 Akt Jnk PKA|PKC 8.209905 0.084185 4 1.000000 \n", - "14 Akt Mek Erk|PIP3|PKA 4.456759 0.725918 7 1.000000 \n", - "15 Akt PIP2 PIP3|PKC 2.326599 0.675931 4 1.000000 \n", - "16 P38 PIP3 PKC 1.081993 0.582168 2 1.000000 \n", - "17 PIP2 PKA PKC 0.795188 0.671935 2 1.000000 \n", - "18 PIP3 Raf PKC 1.287893 0.525216 2 1.000000 \n", - "19 Mek PIP3 PKC 1.933821 0.380256 2 1.000000 \n", - "20 Erk Plcg PKC 5.372049 0.068151 2 1.000000 \n", - "21 Mek PIP2 PKC 0.732168 0.693444 2 1.000000 \n", - "22 P38 Raf PKA|PKC 2.173855 0.703819 4 1.000000 \n", - "23 Jnk Mek PKA|PKC 0.317885 0.988631 4 1.000000 \n", - "24 P38 PIP2 PKC 0.564378 0.754131 2 1.000000 \n", - "25 Erk PKC Mek|PKA 4.004536 0.405392 4 1.000000 \n", - "26 Jnk Plcg PKC 1.378401 0.501977 2 1.000000 \n", - "27 PIP3 PKA PKC 0.961809 0.618224 2 1.000000 \n", - "28 Erk P38 Mek|PKA 7.116543 0.129856 4 1.000000 \n", - "29 Erk Jnk Mek|PKA 4.060855 0.397833 4 1.000000 \n", - "30 Jnk PIP3 PKC 0.027516 0.986336 2 1.000000 \n", - "31 Jnk PIP2 PKC 2.862771 0.238978 2 1.000000 \n", - "32 PKA Plcg PKC 0.344113 0.841932 2 1.000000 \n", - "33 Akt Plcg PIP3|PKC 0.692523 0.952248 4 1.000000 \n", - "34 Akt Raf Erk|PIP3|PKA 5.133173 0.643715 7 1.000000 \n", - "\n", - " p_adj_significant \n", - "0 True \n", - "1 True \n", - "2 True \n", - "3 True \n", - "4 True \n", - "5 True \n", - "6 False \n", - "7 False \n", - "8 False \n", - "9 False \n", - "10 False \n", - "11 False \n", - "12 False \n", - "13 False \n", - "14 False \n", - "15 False \n", - "16 False \n", - "17 False \n", - "18 False \n", - "19 False \n", - "20 False \n", - "21 False \n", - "22 False \n", - "23 False \n", - "24 False \n", - "25 False \n", - "26 False \n", - "27 False \n", - "28 False \n", - "29 False \n", - "30 False \n", - "31 False \n", - "32 False \n", - "33 False \n", - "34 False " + "" ] }, - "execution_count": 6, "metadata": {}, - "output_type": "execute_result" + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| left | right | given | stats | p | dof | p_adj | p_adj_significant |\n", + "|:-------|:--------|:-------------|---------:|------------:|------:|-----------:|:--------------------|\n", + "| Erk | PIP3 | PKC | 447.612 | 0 | 2 | 0 | True |\n", + "| Plcg | Raf | PKC | 245.416 | 0 | 2 | 0 | True |\n", + "| Jnk | P38 | PKA;PKC | 174.846 | 0 | 4 | 0 | True |\n", + "| Erk | PIP2 | PKC | 86.6709 | 0 | 2 | 0 | True |\n", + "| Mek | Plcg | PKC | 206.312 | 0 | 2 | 0 | True |\n", + "| Akt | PKC | Erk;PIP3;PKA | 36.8695 | 4.96534e-06 | 7 | 0.00014896 | True |" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" } ], "source": [ - "print_graph_falsifications(graph, data, method=\"chi-square\", verbose=True, significance_level=0.01)" - ] - }, - { - "cell_type": "markdown", - "id": "d04980abb4ea5ded", - "metadata": { - "collapsed": false, - "jupyter": { - "outputs_hidden": false - } - }, - "source": [ - "Out of 35 d-separations implied by the network, six failed. As the precentage of failed tests is below 30 percent, its effect on the estimation of causal query is minor. Hence, we proceed to the next step." - ] - }, - { - "cell_type": "markdown", - "id": "ffc6d06ac551ed33", - "metadata": { - "collapsed": false, - "jupyter": { - "outputs_hidden": false - } - }, - "source": [ - "## Step 2: Check query identifiability\n", - "\n", - "If the query is identifiable, the $Y_0$ package will return its estimand. Otherwise, nothing will be shown." + "eliater.step_1_notebook(graph=graph, data=data)" ] }, { @@ -963,30 +1423,42 @@ "outputs": [ { "data": { - "text/latex": [ - "$\\sum\\limits_{Mek, PIP_2, PIP_3, PKA, PKC, Plcg} P(Erk | Mek, PIP_2, PIP_3, PKA, PKC, Plcg, Raf) P(Mek | PIP_2, PIP_3, PKA, PKC, Plcg, Raf) P(PIP_2 | PIP_3, Plcg) P(PIP_3 | Plcg) P(PKA | PIP_2, PIP_3, PKC, Plcg) P(PKC | PIP_2, PIP_3, Plcg) \\sum\\limits_{Erk, Mek, PIP_2, PIP_3, PKA, PKC, Raf} \\sum\\limits_{Akt, Jnk, P_{38}} P(Akt, Erk, Jnk, Mek, P_{38}, PIP_2, PIP_3, PKA, PKC, Plcg, Raf)$" + "text/markdown": [ + "\n", + "## Step 2: Check Query Identifiability\n", + "\n", + "The causal query of interest is the average treatment effect of $Raf$ on $Erk$, defined as: \n", + "$\\mathbb{E}[Erk \\mid do(Raf=1)] - \\mathbb{E}[Erk \\mid do(Raf=0)]$.\n", + "\n", + "\n", + "Running the ID algorithm defined by [Identification of joint interventional distributions in recursive\n", + "semi-Markovian causal models](https://dl.acm.org/doi/10.5555/1597348.1597382) (Shpitser and Pearl, 2006)\n", + "and implemented in the $Y_0$ Causal Reasoning Engine gives the following estimand:\n", + "\n", + "$\\sum\\limits_{Mek, PIP_2, PIP_3, PKA, PKC, Plcg} P(Erk | Mek, PIP_2, PIP_3, PKA, PKC, Plcg, Raf) P(Mek | PIP_2, PIP_3, PKA, PKC, Plcg, Raf) P(PIP_2 | PIP_3, Plcg) P(PIP_3 | Plcg) P(PKA | PIP_2, PIP_3, PKC, Plcg) P(PKC | PIP_2, PIP_3, Plcg) \\sum\\limits_{Erk, Mek, PIP_2, PIP_3, PKA, PKC, Raf} \\sum\\limits_{Akt, Jnk, P_{38}} P(Akt, Erk, Jnk, Mek, P_{38}, PIP_2, PIP_3, PKA, PKC, Plcg, Raf)$\n", + "\n", + "Because the query is identifiable, we can proceed to Step 3.\n" ], "text/plain": [ - "Sum[Mek, PIP2, PIP3, PKA, PKC, Plcg](P(Erk | Mek, PIP2, PIP3, PKA, PKC, Plcg, Raf) * P(Mek | PIP2, PIP3, PKA, PKC, Plcg, Raf) * P(PIP2 | PIP3, Plcg) * P(PIP3 | Plcg) * P(PKA | PIP2, PIP3, PKC, Plcg) * P(PKC | PIP2, PIP3, Plcg) * Sum[Erk, Mek, PIP2, PIP3, PKA, PKC, Raf](Sum[Akt, Jnk, P38](P(Akt, Erk, Jnk, Mek, P38, PIP2, PIP3, PKA, PKC, Plcg, Raf))))" + "" ] }, - "execution_count": 7, "metadata": {}, - "output_type": "execute_result" + "output_type": "display_data" } ], "source": [ - "identify_outcomes(graph=graph, treatments=RAF, outcomes=ERK)" + "eliater.step_2_notebook(graph=graph, treatment=treatment, outcome=outcome)" ] }, { "cell_type": "code", "execution_count": 8, - "id": "d788d937c534ddc6", + "id": "d4dd9120fe7b258", "metadata": { "ExecuteTime": { - "end_time": "2024-01-25T17:50:54.309241Z", - "start_time": "2024-01-25T17:50:54.196868Z" + "end_time": "2024-01-25T17:50:54.358237Z", + "start_time": "2024-01-25T17:50:54.229933Z" }, "collapsed": false, "jupyter": { @@ -996,190 +1468,47 @@ "outputs": [ { "data": { - "text/latex": [ - "$\\sum\\limits_{Mek, PKA, Raf} P(Erk | Mek, PIP_2, PIP_3, PKA, PKC, Plcg, Raf) P(Mek | PIP_2, PIP_3, PKA, PKC, Plcg, Raf) P(PKA | PIP_2, PIP_3, PKC, Plcg) P(Raf | PIP_2, PIP_3, PKA, PKC, Plcg)$" + "text/markdown": [ + "## Step 3/4: Identify Nuisance Variables and Simplify the ADMG" ], "text/plain": [ - "Sum[Mek, PKA, Raf](P(Erk | Mek, PIP2, PIP3, PKA, PKC, Plcg, Raf) * P(Mek | PIP2, PIP3, PKA, PKC, Plcg, Raf) * P(PKA | PIP2, PIP3, PKC, Plcg) * P(Raf | PIP2, PIP3, PKA, PKC, Plcg))" + "" ] }, - "execution_count": 8, "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "identify_outcomes(graph=graph, treatments=PKC, outcomes=ERK)" - ] - }, - { - "cell_type": "markdown", - "id": "9d1f152e662579c5", - "metadata": { - "collapsed": false, - "jupyter": { - "outputs_hidden": false - } - }, - "source": [ - "The query is identifiable. Hence, we can proceed to the next step." - ] - }, - { - "cell_type": "markdown", - "id": "6d43d2928ac2ff5f", - "metadata": { - "collapsed": false, - "jupyter": { - "outputs_hidden": false - } - }, - "source": [ - "## Step 3: Find nuisance variables and mark them as latent" - ] - }, - { - "cell_type": "markdown", - "id": "39eab800e3dca3a5", - "metadata": { - "collapsed": false, - "jupyter": { - "outputs_hidden": false - } - }, - "source": [ - "This function finds the nuisance variables for the input graph." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "d4dd9120fe7b258", - "metadata": { - "ExecuteTime": { - "end_time": "2024-01-25T17:50:54.358237Z", - "start_time": "2024-01-25T17:50:54.229933Z" - }, - "collapsed": false, - "jupyter": { - "outputs_hidden": false - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The nuisance variables are {Akt}\n" - ] - } - ], - "source": [ - "nuisance_variables = find_nuisance_variables(graph, treatments=RAF, outcomes=ERK)\n", - "\n", - "print(f\"The nuisance variables are {nuisance_variables}\")" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "9a8cceac6ffc9622", - "metadata": { - "ExecuteTime": { - "end_time": "2024-01-25T17:50:54.539377Z", - "start_time": "2024-01-25T17:50:54.241294Z" - }, - "collapsed": false, - "jupyter": { - "outputs_hidden": false - } - }, - "outputs": [], - "source": [ - "latent_variable_dag = mark_nuisance_variables_as_latent(\n", - " graph,\n", - " treatments=RAF,\n", - " outcomes=ERK,\n", - ")" - ] - }, - { - "cell_type": "markdown", - "id": "1fe9e972339f1c2", - "metadata": { - "collapsed": false, - "jupyter": { - "outputs_hidden": false - } - }, - "source": [ - "## Step 4: Simplify the network" - ] - }, - { - "cell_type": "markdown", - "id": "a2cd73aa0e2c6173", - "metadata": { - "collapsed": false, - "jupyter": { - "outputs_hidden": false - } - }, - "source": [ - "In eliater, step 3, and 4 are both combined into a single function. Hence, the following function finds the nuisance variable (step 3), marks them as latent and then applies Evan's simplification rules (Step 4) to remove the nuisance variables. As a result, running the 'find_nuisance_variables' and 'mark_nuisance_variables_as_latent' functions is not necessary to get the value of step 4. However, we called them to illustrate the results. The new graph obtained in step 4 does not contain nuisance variables. " - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "d94935cc62703c68", - "metadata": { - "ExecuteTime": { - "end_time": "2024-01-25T17:50:55.248308Z", - "start_time": "2024-01-25T17:50:54.254332Z" + "output_type": "display_data" }, - "collapsed": false, - "jupyter": { - "outputs_hidden": false - } - }, - "outputs": [ { "data": { - "image/png": "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fl0trb+/f71pMzIyuO2VfR0AMJlMptfncP78eRYaGsqsra31aopWffSNmI5qJz5dr6eeeopNnTqVffbZZ+zs2bMaO3tqq+uaLF26lNtWUx+ExMREXt2bPHmy1rL17t1b6wyQBw8e5LbLzc1VW3/y5EluxsnOnTuzP/74g7femLpOjEMtA6RVu3DhArccEBDALStbBgQCAXx9fbWmP3ToELf8yiuvaNyGMYasrCwMGzYMa9asQVJSEs6fP48zZ85g3759EIvFAIBbt25h4cKFaun37t2LnJwcTJkyBQDg6uqKnJwc3ku1jKrHoXp82uzatQsDBw7Et99+i5qamnq3B6hloKlou/Xk4uKCf/zjH/jiiy+Qm5uLe/fu4cCBA3j77bcxaNAgCAQCtTTa6romypYBOzs79OrVS+t6W1tbLFiwAMnJyXjjjTdw5MgRpKWlYd++fejduzeA2lsOe/bs0bkfkUiktp9PP/0UY8eOxf379/H8888jPT0dgwcP5m1jaF0nDWDuaIQQU/r444+5K4tdu3Zx77u6unKd6bQ5cOAA95jftGnTtG5XUVGh8YpflfKxQGtra1ZaWqpxG+VVUFBQkM684uPjuWPauHGjzm0ZY+yNN94wuJNhTU1NvfmShlOOKeHq6speffVV9tVXX7GLFy8a9ZintrquibOzMwPA+vfvr3F9UFAQl5eTk5PaFTtjtU9H2NnZMQBs+vTpGvOZOHEiA8AGDBjAvff48WP26quvcvm/8cYbWud3MLSuE+NRMEBatddee02tOfTOnTvcey+//DJve7lczrKzs9nixYuZlZUVA2qf79bWDKqvo0ePcvu8cuWK2nrVpxuWL1+uM6+srCwur9dee63efRcWFrJevXrpHQiIRCKjj5MYrqysrFHGeNBU1zW5efMmt93s2bM1btOpUydum+PHj2vNy9fXlwFgkyZN0rhe+ZjjnDlzGGOMXb16lT333HMMqH20NTY2VucxGVrXifFsGqFxgZBmS7Vzk6enJwB+50GJRKKxyRUABg8ejDlz5mD27NmwtrbWe5/FxcUoKSlBeXk5GGMAwOutb2dnp5bm2rVr3NMN9fXuVh6Hcl/16dKlC/744w907NiRK48udIugabVp06ZR8tFU1zWpr/NgUVER7t69CwAYP348XnrpJa15KZ86cXZ2VltXUlICqVTK7ScpKQkzZszAw4cP4ebmhoMHD2Lo0KE6j8nQuk6MR8EAadXkcjm3rOyZrBoM6FJSUoIxY8boFQgcOXIEX3/9Nf773/+iqKhI63a2trZwd3dXe1+1TPU9gqU8DoB/fLqUlZXpFQgAFAy0VJrquiaqwYCmwFN1fVhYmNZ8ysvLUVhYCKD20dW6VOv0kSNHcPToUTDGMHToUBw8eBBubm5a81Yypq4T41AwQFo11We4hUIhAP6P1KlTp+Do6Aig9oR59epVbN68GRkZGbhy5Qpmz56NX3/9VWv+MpkMISEhOH78uF7l6dmzJ2xs1P/bKcvUpk0b9OzZU2ceqi0LFRUVeu03NzdXr+0ACgZaKk11XZP6WgZU148YMUJrPtnZ2VAoFAA0j9Whmk9qaioAYOzYsUhOTtZZPlXG1HViHHqagLRqqj86yh9L5YnX1dUVw4cPh6+vL3x9fTFo0CBMnz4dv//+O5599lkAwH/+8x+tLQnV1dUIDAzkAoFJkybh22+/xZUrV1BaWoqamhqw2n456NSpEwCgf//+GvNS/nD26dOn3pYI1R9FTbccNKFgoPXTVNc1UdY1Ly8vdOjQQet6V1dXdO7cWWs+qv8vNNVr5fpu3bpxTwWcPn0aly9f1n4QdRhT14lxKBggrcr9+/exYMECxMfHA1BvZiwrK8O1a9cAaG+Ob9OmDd5//33ub9VR3VTt3LkTaWlpAIAdO3bg0KFDCAkJQc+ePdG+fXtYWdX+97p48SJ3D1bbPpU/nPqMBqdvc7AqQ4IBbX0oSPOmT5N6eXk5V/+11TVlMKAtcFXKyMgAADz99NMagwZlnR44cCAOHz4MNzc3PHnyBBMnTsS9e/d0H4yG49C3rhPjUDBAWpU5c+Zg27ZtiIiIQGJiIq9jU2FhIa9pU9e9+cmTJ3Mdu3744QeN2yjHIOjZsyciIiK05hUbG8sta/qBLSoqwp07d+otk5LyPi0AODk51bs9YFgwQB21Wqa6dV2T3NxcbqwJTXWtsrISeXl5APQPBjTlU1VVhUuXLgGoDTrc3d1x+PBhiEQiFBYWYtKkSXo1+xtT14lxKBggrUZaWhqSkpK4v+fPn8/rrJeenq53R722bdtizJgxAIDr169zP2yq/vrrLwDgDSNcV1ZWFrZt26Zzn4Z0HgRqj0Opvh9sAFAoFAbNq/DUU0/pvS1pPlTrjmodUVVffwHVOQv8/f217qumpoZ7QkZTPpcvX+ZuVShbIAYOHMi12P3xxx86A2hNx6FPXSfGo2CAtBrR0dG8vx8/fsy7qk9LSzPoxDt+/HhuWSKRqK1X3m/Nzs7W+ARBTk4Oxo8fz/24enp6ary6Uf5ACwQCrZMmqVLemgDqH2kOAKRSKZ48eVLvdkoeHh56j1RImg/VuqBaR1TVV/9VgwVdJ98rV66gvLxcaz6q+1G9HfHaa69xt+ASExPx0Ucfad0HYHhdJ8ajYIC0CufOncORI0fU3lfOAgjwWwbatm1bb6991WAgOTlZbf24ceMAAKWlpRg9ejS+/fZbpKen49ixY1i4cCEGDhwIe3t7dOzYEUD9/QV8fHzQvn17nWVSHoeSrqs3JUNuEQDA4cOHsX//foPSEPNTrQv1tQx06NABXl5eWtc7ODjA29tb676UtwgAzUGDMh8nJyd4eHjw1q1duxaTJ08GAHzwwQdab8PVPQ596joxHj1aSIwmk8lw4cIF7iT74MEDyOVyVFZWQigUQiQSwdnZGX5+fggICIC/vz93YmxsdVsFNMnIyOB66vfp04fr4KdNly5d0LdvX2RnZ+PMmTN48OAB777skiVLcODAAWRlZeHixYt47bXXeOmHDBmCPXv2cDPMabvSUgYD+twiqK6u5n5ofXx8uMcidTE0GACg9XtqTt854evYsSO8vb1x/fp1ZGZmorq6Wu0x1vqmE1bWLT8/P50dSesLqnV1iBUIBPjmm28wfPhwZGZmIiwsDN26dVP7/2FMXScNYM7hD0nLUl1dzSQSCQsNDWXe3t4Gj3cPgHl7e7PQ0FAmkUhYdXV1o5TrzJkzBpdj3rx5euX93nvvcWn27Nmjtv7Ro0fsnXfeYV27dmW2trbM1dWVBQYGst27d7OamhqWlpbGpT906JBa+vLycm4mwXXr1tVbnqSkJC6/0NBQvY5BdZhaXS8vLy+2aNEi3iyOzfU7J5qFhoZyn7tEIuGty8vL49b985//1JheOWfB4sWLde5nzJgxDAAbPHiwznyWLFmiNQ+pVMrNEeLh4cFu377NW29MXSfGo2CA1KuoqIitX7+eG2e8sV5du3Zl69evZ0VFRQ0qn+qkKvW9xGJxI30q5hEcHMwdS3Jysl5p+vTpo/MzGTFiBMvJyeGNj9/cv3OimUQi0VrXv/rqK27d0aNHzVRC/RlT14nxKBggWkmlUjZ9+nQmFArVftRFIhEbMmQIe+utt9iuXbtYdnY2KykpYXK5nCkUCiaXy1lJSQnLyspi8fHx7K233mJDhgxhIpFILS+hUMjCwsKYVCo1uIynT5826GQkEAhYfn6+CT4t08vPz+ddxet7lf38889z6dq2bcsmT57MPv/8c25Gxl69enHbtoTvnGhXXV3NBXB16/rQoUMZAPbUU0+xqqoqM5ayfsbWdWI8CgaIGoVCwWJjY5m9vb3aiVQsFjOJRGL0j0lVVRWTSCRMLBZzJyPly97ensXFxRk0g9vYsWMNvjqNiooyquzmFhkZyR3Dhg0b9E5348YN9sknn7CUlBRWXl7OvT9ixAguvytXrrSY75zotn79erW6vn//fu696OhoM5ewfsbWdWI8CgYIj1QqZYGBgbwfbCcnJxYVFcUKCgoadV/5+fksKiqKOTk58fYXGBio1xXjb7/9ZlRTtZOTEyspKWnUYzE1mUzGfU5CobBRmtk3btzIfSY9e/ZsEd85qV9RURGztbXlgq3Fixdzf/fo0YOVlpaau4g6maKuk/pRMEA4CQkJaleG4eHhJj9xymQyFh4ernbFmJiYqDPdM888Y/S96/DwcJMeU2ObPXs2V/awsLBGyVO1Q1lL+c6JfuoG9ABY9+7d2ZUrV8xdtHqZoq6T+lEwQBhjjG3evJn3w+Hh4cFSU1ObtAwpKSnM3d2dV44tW7Zo3DYzM9PoQED5SklJadLjM9aRI0d4J8zCwsJGybelfedEfytXruR9pnPnzmWPHz82d7HqZaq6TupHwQBha9as4f1wzJw502zN6DKZjM2YMYNXnrVr12rcTtn0aWtrywYMGMCeeuopg4IBd3f3Zn+7QCaT8U6WcXFxjZJvS/zOLY1CoWDl5eXs/v377Pr16yw7O5v9/vvv7NixY+zAgQNs165dbOnSpWzVqlUaO9jFxsZSXSd6o2DAwtW9Oly9erXZO3MpFAoWHR1d79Xi48eP2ZUrV1hNTQ2LiooyqnVg5syZZj9ebRQKBe8kGRQU1ChlbcnfeWuWnZ3NRowYwbp06cIcHR2ZjY2N3vVY07gACoWCd7vAEus60R8FAxYsISGB94OyadMmcxeJZ9OmTbzyabufrPr8tDGv5tq7etWqVY3eZNpavvPWaMGCBUbX4ZUrV2rMUyqV8voBWVJdJ4ahYMBCtdQfibo9zlNSUpiVlVWDggFLOSm2lu+8tfr++++NqrvPPfccq6mp0ZovBYBEHxQMWCCFQsF7Pr8lNh8qFAq2detWjYFAmzZt2FNPPcU8PT3Zs88+ywICAtjIkSNZcHAwmzJlCgsLC2Pz5s1jkydPVmshMPfnoFAoeCdDAGzr1q2Nkm9L/85bO4VCwQ0MpO+rffv27Pr16/XmvWXLFoup68Q4FAxYINWORR4eHi2uY1FMTAx74403eD8iEydOZPfu3dN5haTJ2rVrefnMmDGDyWQy0xxIPUzZka6lf+eW0pnM0Hk2YmJi9M7bUuo6MQ4FAxamblNxS3m8LiUlhSuzcmIf5WvFihUGBwGq6naoc3d3b/LPxZSP2LWG79ySbhdMmDBBr0AgMDDQ4Kv71l7XifEoGLAwYWFh3H/A5jrwTnl5OdeTWnUmP9XBSAAwOzs79s033zTKPrUNuGTqKyeZTKZ2XA4ODo1637QlfOfaWNIANMXFxWzZsmV6PUXQoUMHozvZtea6ToxHwYAFuXfvntpVtaenp15pk5OT1X6Qbt68aZJynj9/ntuH6mxlqsOUAmBHjhxp1P1qG4o5MjKy0Sc3ys/PZ5GRkWrD8gYFBTVqT+p79+5xkw7pGoZ527ZtWk88dnZ2rFu3biwsLIydP3++0cqmD0sYmrayspJ9/vnnanVB1+vrr79u0D5bY10nDUPBgAVRncBE+RIIBPWOVV5dXc169+7NS+fi4mKycu7YsUNrwGHqCUwUCgWLi4vTOGFPcHAwS0pKatCEPUlJSbypWVWvkHbs2KGx2beoqIgNHz6cvfLKK3p1FlOladIaTebNm6fXScja2ppt377d4GNviNY6aY1CoWBJSUlq80KIRCIWFRXFXFxcNH4HL7/8cqN0/muOdZ2YDwUDFkJ1alOgtse9cvns2bM6027fvp27MlOmeemll0xW1oULF2oNOJpqalOpVMrCwsK0TuU7ePBgtmDBAhYfH8+ysrKYTCZj5eXl3KhxMpmMm8p3wYIFbPDgwTqn8tV1hRQSEqJ2RfXDDz+wyspKncegazrbugYPHswAMEdHR5aTk8O9MjMz2aFDh1hQUBC3fxsbmyadBro1TmebkZHBRo8erVYfpk+fztUF5f+7ulfvd+7cadSyNKe6TsyHggELIZFIeP8xJ02axNq2bcsAsPj4eK3pSktLWadOnRgA9o9//INLHxkZabKyDh8+XGfAoXq1oXobwRSKiorYhg0beIFUY7y8vLzYhg0b9Gr2/vDDDzXm0alTJ7ZixQp248YNjelUv3OxWKw1/5qaGq4ujBo1Sut2qp+7al+OptCU37kp3bp1i4WHh6tN5Tx8+HB27tw53rZVVVXsueee4223b98+k5WtOdR1Yj4UDFiI0NBQ3n/Q1atXs4EDB9Z7YleeiJycnNiuXbu49AkJCSYpp0KhYA4ODjrLlZSUxJUjNDTUJOWoq7q6miUnJ7PQ0FDm4+Nj1I+ij48PCw0NZcnJyQZd3d68eVNnvgKBgAUFBbGDBw/yWgtUv3OJRKI1/8uXL3PbaRrWVkl1UJzp06frXf7GYI7vvDE9fvyYrV69mgu6lC9vb2924MABrU3mR48e5bb9xz/+0SRN6+as68R8bEAswrlz53h/+/n5QSqV4vz587h48aLGNLdv38ann34KAPjggw/w559/cuv69++vdV95eXmIi4vDiRMn8Oeff6K8vBydO3fGmDFjEBUVhWeeeUZr2hs3buDRo0dcGTXp06cPBAIBGGPYv38/XnrpJURERGjNszFYW1tj/PjxGD9+PACgpKQEFy5cQHp6OjIyMlBcXAy5XI6KigrY2dlBJBLByckJ/fv3R0BAAPz9/eHo6GjUvt3d3dG7d29cunRJ43rGGI4dO4Zjx46hU6dOCA8Px5w5c7jvXCQSITg4WGv+mZmZ3LK2zxwAOnfuzC3X1NQYdhANJBaLIRKJIJfLcf78+Sbdd0MoFAokJCRgxYoVuHXrFvd+hw4d8OGHH+Ktt96CnZ2d1vRBQUH49ttvce3aNSxduhQCgcDkZTZnXSdmZO5ohJhecXGxWuQulUrZ1q1bGaD9iYKIiAguyq+srGSvvPIKA2r7G2iK9isqKtiiRYt0Dg/cpk0b9uOPP2ot68GDB7ltc3Nz1dafPHlSrWOVuQZOaUqLFy82upl2yJAhOvNevnw5t21GRobW7b777jtuu2XLljXyEdZP2a+hpXznv/76K/P39+d9F9bW1mzRokXs/v375i4eITxWJosySLNx4cIF3t8dO3aEp6cn+vbtCwD466+/8PjxY942ubm5+PrrrwEAGzZsgK2tLXcF6evrC2tra972NTU1mDJlCv79739DoVBg/Pjx2LNnD06fPo3jx49j1apVcHBwQHl5OV5//XUUFhZqLGtWVhaA2qvZXr168dZ9+umnGDt2LO7fv49OnTppPb7WaOzYsUanDQgI0Lle+b3a2tqid+/eWrdLTk7mlkeOHGl0eYylehzN+Tu/du0apkyZghdeeIFXzpdffhm5ubn4/PPP8dRTT5mxhIRoYO5ohJjexx9/zLs6eeGFFxhjjP3999/ce3WfKFD2Hh86dChjrPZ5b+W2c+fOVdvHkiVLGFA7Vvrx48c1liM9PZ3Z2dkxAGz58uUat5k4cSIDwAYMGMC99/jxY/bqq69y+3/jjTd4w+tu3LjRqM+lJSktLWW2trZ6twao9ubetWuXzrxdXV0ZANavXz+t25w4cYIbDMfT05OVl5c37gHqIT4+vll/58XFxWzp0qVq31O/fv3Yzz//bO7iEaITtQxYANV7wsD/7gs7OzvDzc0NAHj9Bo4fP45jx44BADZt2qSWR937ymlpafjss88AAIcPH8ZLL72ksRz+/v544YUXAACnT5/WuI2yZUC5j2vXrmHw4MH47rvvIBQKERsbi+3bt2Pw4MFcmoyMDI15tSbt27fH0KFD9drWw8MDL774Ive3rpaBu3fv4t69ewDUv1e5XI6cnBysWLECYrEY1dXVsLGxQUxMDEQikeEH0UCqx9GcvvOqqip8/vnn6N69O7Zs2YKqqioAQKdOnbBz506kp6djzJgxZi4lIbpRMGABHjx4wPu7X79+3LLyVoGyc5pCoUBUVBQAYOrUqXj++ecB8IOBup0H33vvPTDG8I9//AOjR4/WWRZPT08AtZ2S6iopKYFUKgVQe2JKSkrCwIEDcfHiRbi5ueHXX3/F3LlzefkAQHFxsc59thb63Crw9fXFmTNneB38VD+rulS/1927d0MgEHCvNm3aoG/fvli/fj0qKyvRsWNHfPfddxCLxQ06DmM1t++cMYbDhw/D19cXixcv5srUpk0bfPDBB7h27RrCw8PVbqkR0hxRMGAB5HI572/VK0BlMKBsGdizZw+ysrJga2uLDRs2cNspTxpWVlZcGqD2iYOff/4ZAHDgwAHeyUTTKy4uDgA09jZWPTEdOXIEkyZNwsOHDzF06FCkp6fzroxVr0zrHl9rpU8wEBgYCA8PD95nousqvm6rUV3W1tbw8/PDmjVrkJeXh8mTJ3Pr5HI5li1bhpEjR6Jz584QiUTo1KkThg0bhl27dnFXyHUxxvDDDz/gxRdfhJubG9q2bYtnnnkG8+bNw/Xr17WWpTl95xkZGRgzZgwmTZqEq1evcu+HhYXhypUrWLNmDdq3b2/GEhJiGHq00AJUVlZyy3U7ifXp0wdAbTBQXl6OlStXAgAWLFiA7t27c9spTxrdu3dHu3btuPePHDliVJl8fHzU3lPeIgCA1NRUALUnwOTkZAiFQt62qo9jVVRUGFWGlmbAgAFwdHTU2KqitHnzZvj4+PC+87qfnSrl92ptbY20tDTY2NT+JFhZWcHe3h4uLi5ag4nHjx9j27ZtGDRoEMaPHw8XFxfIZDKkpqYiPDwc3377LVJTU2Flxb/miIyMxObNm+Hm5oZJkybBwcEBWVlZiIuLw759+3D69Gn4+vqq7a85fOe3b9/G+++/j927d4Mxxr0/YsQIbN68GQMGDDBLuQhpKAoGLIDqyaBXr168v1WfKFi9ejVu3boFR0dHfPDBB9w2lZWV3G2EuveVc3NzAQBdunRBSkqK3mVycXFRe095YurWrRucnJyQnp6O06dP4/Lly7xbGwD/ZKDrOe3WxNraGqNHj8YPP/zAe/+dd96Bp6cnFi9eDABYuHAhnn32WW59ZWWl1s9I+Zn36NFD5xgDmjg5OeHhw4dqwUZ1dTXGjh2Ln376Campqdzz6kBtH4WtW7eia9euyMrKQocOHbh1W7ZswbJly7B582bEx8er7c+c3/mTJ0+wadMmbNy4EWVlZdz73t7e+OSTTzB58uQmGQOAEFOhYMAC2NracsvPPfccb92zzz4LW1tbVFVV4ZNPPgEArFixAs7Oztw2ly5d4pp8654wlJ3POnXqpPFqzhDKE9PAgQOxefNmDBw4EHfu3MHEiRNx7tw5uLq6ctvq2wze2owdO5YLBgQCATZv3owlS5YAAO7cuYMNGzaAMYa8vDwujVwu13jyLCsrw7Vr1wCAd+tHX1ZWVhpbHWxsbDB58mT8+uuvyM/P5637888/oVAoMGzYMF4gAAATJkzAsmXLcP/+fY37M8d3rlAo8M0332DFihW4ffs2976+gwYR0lJQnwELoNpM26VLF946oVDIjQioUCjQtWtXvP3227xtdHUeLC8vB6DeSdFQVVVVXOtDv3794O7ujsOHD0MkEqGwsBCTJk3iXRmqjlPg5OTUoH23JCEhIfD29oajoyO+/fZbLhAAgH/961+YPn06gNrvUknbmA7Z2dncdsYEA9ooFAocPXoUANQCxB49ekAoFOL333/nRppUUo5joK3nfVN/57/++isGDhyIWbNmcYGAtbU1Fi1ahPz8fCxbtowCAdJqUMuABaivI5O/vz93hbh+/Xq1HzhdjxW6u7sDAK5fv45r166hR48eRpXx8uXL3H1u5S2BgQMHIj4+Hq+//jr++OMPREREICEhAQCQnp7OpdU1NHJr07FjR1y7dg2VlZVqV8cCgQA7d+7E3bt3uU6dQO1npewbokr1e21IMFBZWYl//etfYIzhwYMHOHHiBPLy8jB79my1E7uzszM2bNiAd955B7169cIrr7zC9Rk4efIkFixYgIULF2rcT1N959euXcO7776LH3/8kff+yy+/jI0bN6oNhkVIq2DOQQ5I05gwYQI3AEpERITB6UeNGsUAMFdXV7V1qsMHjx49WudgNKWlpeyrr77SuG737t1cPn/99Rdv3fvvv8+tU86Wt2DBAu69EydOGHxMjNXO1nflyhV28OBBlpOTY1QezdHDhw95E8y89dZbGrebN28et422mQ/1UVpaqjZxUmRkJKuqqtKaZv/+/cze3p6Xbvjw4ey3337TmqYxvnNdHjx4wJYsWcINrgSVQYNMsT9CmhMKBixAQECA3uPUa+Lo6MgAsKCgILV11dXVrF+/flz+vXr1Yl988QU7c+YMu3DhAvvll1/Ytm3b2LRp01j79u3Z8OHDNe5j2bJlDKidHbEuhULBJk+ezJ1oDh48aPA49ZWVlSwrK4t9/fXX7O2332bDhw9n7du35/Kws7NjUqnU4M+mubp06VK937nyM3RwcGiUfdbU1LC//vqLffXVV8zR0ZENGzaMPXz4UG271atXM1tbW7Z+/Xr2119/sdLSUnbq1Ck2YMAAZmNjww4fPqyzvPp+5/qqqKhgW7duZR07duQFAZ06dWLx8fE06x6xCALGVJ6PIS2KTCbjZhPLzMzEgwcPIJfLUVlZCaFQyM0mdvDgQa4DoEgkQmlpKfcIWX3+/PNPdOvWDQCwfPly3tgDSoWFhRg/fjz3ZIEuS5cuxebNm9XeHzNmDE6ePIkXX3wRJ0+eVFv/5MkTDB8+HJmZmWjbti2qq6tRWVkJHx8ftU5qypHzLly4gIyMDFy4cAHZ2dn1Po6Wm5ur1sGyJfP09MRff/2l8TtXKBSwt7dHWVkZhg0bht9++02vPPWpc87OzrCyskJiYiLefvttbnRKAPj5558xduxYjfXg7t278Pb2hru7O3fbSqm6uhr29vaQy+Uav3NjMMaQlJSEqKgo3v7atGmDqKgoREVF0VgBxHKYORghBqiurmYSiYSFhoYyb29vo2exGzlyJJNIJHpd8Rw6dIhLt2/fPq3byeVytn37dhYUFMRcXV2Zra0ts7OzY507d2ajRo1i7733Hvv999+1pnd2dmYA2JIlS7RuI5VKuXH0la+6c9t/9NFHTCAQGPyZuLq6spqamno/j5YkNDSUOz6JRMJbd/nyZW7dm2++qTWPxqhz3t7eLDQ0lEkkEm4Oi6SkJI3769+/PwPASktLee8nJSVp/c6NkZ6ezl544QW1ss6YMUPtNhUhloCCgRagqKiIrV+/nnXt2tXoAEDTq2vXrmz9+vWsqKjI3IdokODgYO4YkpOTeet69+5t1GcRFhZmpqMxHYlEwh2fWCw2KK2p6pyyn8DWrVs17tfDw4NZWVkxuVzOe1/Xd26ImzdvspkzZ6oFjCNHjmTnz583Ol9CWjoKBpoxqVTKpk+fzoRCodqPqkgkYkOGDGFvvfUW27VrF8vOzmYlJSVMLpczhULB5HI5KykpYVlZWSw+Pp699dZbbMiQIbzZ7JQvoVDIwsLCWsQ98/z8fK7cXl5eaq0bR48eNWh2P+UrMTHRTEdkOtXV1dzJXCAQsPz8/HrTGFLnDh06xG7fvq1W5/744w/m6+vLALAuXbporHMCgYCFhITw6ty2bdsYADZs2DBemer7zvXx+PFjtmrVKta2bVteOXx8fNgPP/zAFAqFwXkS0ppQMNAMKRQKFhsbq9bbWiAQMLFYzCQSic6e2rpUVVUxiUTCxGKx2tWRvb09i4uLa9Y/jJGRkVx5N2zYoHGbK1euME9PT4OCgWXLlrHffvvN6M+1uVq/fj13jFFRUVq3M6bOrVq1itnb2zOxWMzefPNNtnz5cjZ9+nTuls+IESNYWVkZr87V/dxtbW1ZYGAgGz16NAPA2rRpozadtj7fuTY1NTVs165drHPnzrz9Ojo6ss2bN7OKigqD8iOktaJgoJmRSqUsMDCQ98Pl5OTEoqKiWEFBQaPuKz8/n0VFRTEnJyfe/gIDA5tlK4FMJuPKKhQKdd7euHXrFuvTp4/BLQQdOnRgU6dOZbGxsc3yMzBUUVERd5Xv5OTESkpK1LYxts6dP3+ezZ07lz333HPM0dGR2djYMGdnZ/biiy+y7du3awys8vPz2dKlS1mbNm14+7Ozs2OTJ09mly5d4m1vyHde18mTJ7k+CMqXjY0Ne/vtt9nff/+tdz6EWAIKBpqRhIQEtSuz8PBwjT/gjUkmk7Hw8HC1VoLm1nQ+e/Zsrnz63OOXyWRs5MiRBgcEqq9nn32WLVmyhKWmprKysrImOMrGFxYWxqtPqpp7nTP0O2estmXolVdeUfsuJ06cyPLy8kxxOIS0eBQMNBObN2/m/XB5eHiw1NTUJi1DSkoKc3d355Vjy5YtTVoGbY4cOcI7aRQWFuqVrry8nBujQNvr4MGDLD4+noWEhKi1kqi+RCIRCwwMZJs3b2YXL15s1rdTVEmlUt4JPyUlhTHW/Oucod/5gwcP2OLFi9UGDfLz82MnT55sgqMhpOWiYKAZWLNmDe/Ha+bMmSa/MtNGJpOxGTNm8Mqzdu1as5RFtUyqJ4y4uDiD0ldXV/NG26t7NVpZWcnb9o8//mCrV69mQ4cOZVZWVlqDAw8PDzZnzhz2/fffs+Li4sY+7EYVGxvLldvd3Z2tWLGiWde5999/X+/vvKKigm3ZskVt0CA3Nze2a9cuGjSIED1QMGBmda/OVq9ebfYrToVCwaKjo5tFC4FCoeCdKIKCgoz6fDQdEwA2efJknemKi4vZ999/zyIiIpiHh4fWwMDKyooNHTqUrV69mv3xxx/N7gSkUCjU+gU09zpX33euUCjYoUOHWPfu3Xnbt2nThq1atUptrAJCiHYUDJhRQkIC70ds06ZN5i4Sz6ZNm3jlM0cfglWrVhl1e0Cbbdu28a72Y2Ji9E6rUCjYxYsX2ebNm1lgYCCzs7PTGhw4OTmxkJAQFh8fz27dutWgMjcWqVSq9phfc69zIpFI43eenp7OzZlRt4WDBg0ixHAUDJhJ3fu40dHR5i6SRnVPxk3Zw95UwcjBgweZk5MT69mzZ4PGuC8rK2NHjx5lS5YsYc8++6zOfgl9+vRhkZGR7Pjx42oD6jSVusFAS6hzIpGIV+eKioo0Dho0atQolpaWZsZSE9KyUTBgBgqFgo0dO5Z3NWPuZlptGquZ3tB9qp4QAO0j1hmroqKi0Y9DKpWyuLg4NnXqVNahQwetgUHbtm3ZuHHj2GeffcauXLnSJN99a6lz48aN432W3bt3Z4cOHWq2x0JIS0HBgBmoduby8PAwW8ctfTW0A5+h+2puHRiNUVVVxX777Tf2wQcfsEGDBumcL8HLy4vNmzeP/fDDDxpn+WsMraXOKR8ZdHR0ZFu2bKFBgwhpJBQMNDFtj3k1dykpKSa/XdCcH21sqPv377N9+/axWbNmMTc3N62BgY2NDRsxYgT76KOPWFpaWqNMntSa6lxZWRk7fvx4s396g5CWhoKBJqZrAJimVF5ezj2PvW7dOr3SGDMAjD5kMhkvbwDMwcGh2Q161FgUCgXLyspiGzduZGPGjNE4D4Dy5eLiwqZNm8b27NnD7t69a9T+mkudM4ap6hwhhI+CgSZ07949rUPDKidpMeQVHx9vdFnOnz/P5aPvLHANGRpWk/z8fBYZGak20E9QUFCDnxpoSR4/fsySk5PZokWLWI8ePXR+5/3792f//Oc/2S+//KJXE7lqnas7SY/qy87OjnXr1o2FhYVpnb1PtY5+++23Ovf7008/MUdHRwbUPnb5ySefaN02Pz+fffLJJ2zMmDGsR48ezMHBgZv+esyYMdzQxY1R5wghmlEw0IR0TRqjbVAcXa/c3Fyjy7Jjxw4un5s3b+qdriGTxjBWey89KSmJNyWtamvAjh07LL4z2PXr19m2bdvYK6+8wtq3b6/1+2/fvj2bOHEi+/LLL7XOSKha5/r166dXvbK2tmbbt29Xy0u1juoa1vfzzz9n1tbWXPO+RCLRuN2tW7fY1KlTDarzq1evNu5DJYToJGCMMRCTq6mpgY+PD6RSKQQCAa5duwYfHx9u/ZAhQ3D27Fk8/fTTOHHihF559u7dG1ZWVkaVZ9GiRfjiiy/g4uKCoqIivdMVFBSge/fuAAA7OzvMnj0bgwYNQkBAADw9PSESiWBnZ4eKigrI5XIUFhYiPT0daWlpSE9PR1ZWFuRyOS9PoVCIkJAQfPTRR+jSpYtRx9NaVVZW4syZMzh27BiOHTuGCxcuaN22e/fuCA4OxsqVK+Hq6qpW5/r27YusrCw4Ojri1KlTXLqamhrcuHEDMTExOHbsGADAxsYGeXl5Gutou3bt8OjRI7W6V11djYULF2L79u0AAC8vL0gkEvj6+qqV9fTp05g4cSIePHgAAOjatSvCwsLw/PPPw9XVFY8fP8b169chkUggkUhQVVUFAOjcuTMKCwthbW1t5CdKCNHI3NGIpZBIJNzVjVgs5q2rqanhmnBfeumlJinP8OHDjd6fpqt6Y15eXl5sw4YN1PRrgLt377JvvvmGTZ8+nT399NMaP9fAwEDGGL/OBQcHc3Vs1KhRWvNX/W5V+5Ko1tGhQ4eqpXvw4AF78cUXubTDhw/X+r2eO3eOtWvXjmuFWLNmjc5bHnl5ebxbSfre1iKE6M+4y0pisMTERG55wYIFvHVXr15FWVkZAKBPnz4mLwtjDNnZ2QAAPz8/g9PXLb8hfHx8EBoaiuTkZOTn52P58uVwcXExOj9L4+rqiunTp+Obb77BnTt3kJ6ejn/9618YNWoUbGxsANReZQP8Ojdx4kSujun6ziMiIrjlvLw8blm1jtZNn5eXh8GDB+OXX34BAMyaNQsnTpzQ+L0+fPgQU6ZMwZMnT2BlZYW9e/figw8+gFAo1FqmZ555Bjt37uT+TkhI0LotIcQ4NuYugKU4d+4cAEAkEiE4OJi3LjMzk1s2NhjIy8vDs88+CwDYu3cvQkNDsXfvXuzevRtZWVm4f/8+Ro4ciV9//RU3btzAo0ePAGg/Mdy8eRNTp07FuXPnYGdnhy+//JI7UYjFYohEIsjlcnTu3BlLlixBRkYGiouLIZfLUVFRATs7O4hEIjg5OaF///4ICAiAv78/HB0djTo+os7Kygr+/v7w9/fHe++9h0ePHuH27dtc075qnXNwcODS6QoGOnfuzC3X1NRwy6p1tH///tzysWPHEBISgocPH8LKygobNmxAVFSU1vwXLVqEmzdvAgBWrVqFV199Va9jnTBhAlfnzp8/r1caQoj+KBhoAjKZDNevXwdQ+0OsvIJTaoxgICsri1vu1KkTRo0axbsvDAB9+/ZV25+mE8Mvv/yCkJAQ3L9/H507d8YPP/yAwYMHc+ttbGzQr18/nD17Frdv38bcuXPpJN8MODg4cCf9unUuJyeH205XMHDr1i1u2c3NjVvWVGc+//xzLFu2DDU1NbC3t8fevXsxYcIErXmnpaXhm2++AQD4+vpixYoVeh+bap0rKChASUkJ1TlCGhHdJmgCqp2+AgIC1NYrf2itrKzQu3dvo/ahGgwsWrQIv/32G15//XUkJSUhLS0Nhw4dQmhoKG9bkUiEXr168fL59NNPMXbsWNy/fx/PP/880tPTeYGApuPQ1amNmEfdOqesY7a2tjrrWHJyMrc8cuRIblmZ3sbGBr169cK8efOwePFi1NTUwMvLC7///rvOQAAAPvnkE275ww8/VAuK60N1jhDToZaBJpCens4tDxgwQG298ofWzc2Nu5rTxc3NDc7Ozrz3VIOBgoICJCUl8X6cVX9Ilfvz9fXlemU/efIE4eHh+O677wAAb7zxBv79739rvZerehzp6ekYPXp0veUmTadunTtw4ACA2idQtH2nJ0+exN69ewEAnp6eCAoK4tYp64yrqysmTpyIX3/9FQAwbNgwHDp0qN5+Hw8ePMDBgwcB1N6KmDp1qsHHRHWOENOhYKAJqDax1m0ZuHv3Lu7duwegtolWn9sEBw4cUPsxVd3Hl19+qfMqTRk4KJt7r127hsmTJ+PixYsQCoX44osvMHfuXJ1lUD2OjIyMestMmpZqfejatStXx+reIpDL5bh27Rr27duHTz/9FNXV1bCxsUFMTAxEIhEA9TqqvJUwc+ZMxMbG6uz8p3Ty5EmuD8KUKVOMeiSW6hwhpkPBQBNQPksN1F5xqVL90dbXwIEDeX///fffuH37NrcuPDxca9qSkhJIpVIAtSeGpKQkzJgxAw8fPoSbmxsOHjyIoUOH1lsG1eMoLi42+BiIaanWOdXvZ/fu3di9e7fWdB07dsTOnTshFou591TrqFAoRGVlJQBg+PDhegUCAPCf//yHWx4xYoReaeqiOkeI6VCfgSagOsiO8mpLSfWH9vjx42C1o0LqfNUNKFRvEcyfP19nWVT3d+TIEUyaNAkPHz7E0KFDkZ6erlcgUPc46g4iRMxP9Tu5fPmyzm2tra3h5+eHNWvWIC8vD5MnT+atV60zMTEx3C2BhQsX4uzZs3qVRxmAAtA4CJE+qM4RYjrUMtAElFdSANSupFR/aJW9/Q2lGgyo3uetb9vU1FQAwNixY5GcnKz3VR5QO/qgUkVFhd7pSNNQrXO5ubkAak/6aWlpXMc9Kysr2Nvbw8XFRS1IVaVaRydMmIBu3bph7NixqKiowJQpU5Ceno5OnTrpLI/qKJfGjitBdY4Q06GWgSagepJV/ZEG/vdD26lTJzz99NNG5a/Mw93dHe7u7npt261bN+4e7OnTp+u9eqxL9cdY9UeaNA+qdU55f71Hjx7w8/ODr68vfH190bt3b3Tp0kVnIADwO7i6uLjghRdewMcffwwAuH37NqZOnapWr+tiKqOeGzuUMNU5QkyHgoEmoK15s6ysDNeuXQNgfKsA8L+rfdXBYLRR/rAPHDgQhw8fhpubG548eYKJEydyncT0oevWBzE/1e8kPz8fgHF1TLWOqnY+XLZsGfeo6unTp7Fo0SKd+ai2Bty9e9fgcgBU5wgxJQoGmoDqY4CFhYXccnZ2NhQKBQCgX79+RuVdWVnJXdXXN7RwVVUVLl26xO3P3d0dhw8fhkgkQmFhISZNmqR386vqcTg5ORlVdmI6qnVOWceMCQZU62jd+rVjxw7u6ZfY2FjExsZqzUf1scC6g2Hpi+ocIaZDwUATUP0RVX3+uzH6C1y+fJmb0a2+loHLly9zzbnK4GPgwIGIj48HAPzxxx+8sel1UT0OfVokSNPSFBgaU8d0jVbZrl07HDp0iBsJcNGiRThz5ozGfF555RVu+YsvvuDqbH0qKiq44YepzhFiOhQMNAHV56PT0tK4ZdUfWmNbBrSNGV/ftqr7e+211/D+++8DqJ3c5qOPPqp3v6rHoWlURWJemr4TY4a6rq+O+vj4ICEhAQKBAJWVlZg6dSr3mKsqf39/vPzyywBqOzRGRETo7GdQU1OD77//Hn379uVGG6Q6R4jp0NMETcDf359b1tQyYGVlherqaq7Xty4+Pj5o06YN97eyv0CHDh3QrVs3nWmV2zo5OcHDw4O3bu3atbh06RIOHTqEDz74AM8++yymTJmiNS/V41A9PtI81P1OHBwc4OXlZXA+yjrarl079OjRQ+M248ePR3R0NFatWoU7d+5g6tSp+M9//qP2dMrOnTsxcOBASKVSfPPNN/j9998xZ84cDB48GE5OTigtLcXNmzdx6tQpJCcn46+//gLwvxM/1TlCTEfAVLv5EpPx8fHB9evXIRKJUFpayj3WpZwWVl+3b9/mTSAzZswYnDx5EqNGjeKGiNVGue2LL76IkydPqq1/8uQJhg8fjszMTLRt2xa//fabxtaG6upq2NvbQy6Xw8fHh+ugRpoXb29v3LhxAwDw/PPP4/fffzcovUKh4OrokCFDtN4CAGqfFnjllVcgkUgAAHPmzEFcXJzadnfv3sW0adM01j9NBg4ciFOnTsHa2pqrc25ubliyZAkyMzPx4MEDyOVyVFZWQigUQiQSwdnZGX5+ftxMmR07djTouAmxSIw0idDQUAaAAWASiYRdvnyZ+1vfV+fOndXydXZ2ZgDY4sWL6y2DctslS5Zo3UYqlTJXV1cGgHl4eLDbt2+rbZOUlMSVKTQ01KDPgTSdcePGcd+TWCw2OL1qHZ0/f36925eUlLAePXpwab766iut2548eZLNnTuX9e7dm3Xo0IFZW1sze3t71rNnTzZp0iT26aefssuXL7Pq6momkUjYiBEjDP7/onx5e3uz0NBQJpFIWHV1tcGfAyGWgFoGmkhycjJ3z1QsFiMlJcXMJTKeWCzG0aNHAdQe1/jx481cIqJJS65z9+/fx86dOxETE8MbvbChunbtivnz5yMiIsLowY8IaY0oGGgiNTU18PHxgVQqhUAgwLVr1+Dj42PuYhmsoKAA3bt3BwB4eXkhPz/f6EFkiGm1xDpXWFiI999/H999951aB0ORSMQ1/w8YMAABAQHw9PSESCTi5kyQy+WQSqVIT0/nXpmZmWrDFwuFQoSEhGDdunVqw3sTYpHM2zBhWdavX881XUZFRZm7OEaJjIzkjmHDhg3mLg6pR0upcwqFgsXGxjJ7e3teE79AIGBisZhJJBJWVVVlVN5VVVVMIpEwsVjMBAIBL397e3sWFxfHFApFIx8RIS0LtQw0ofv378PDwwOVlZVwcnLC9evX0aFDB3MXS28lJSXw8fFBcXExhEIhbt68SU2tzVxLqHOFhYWYO3cufvrpJ+49JycnREREYP78+fD29m60fRUUFGD79u3YuXMnb+bDwMBAxMXFUSsBsVzmjkYsTVhYGHdVEh4ebu7iGGT27Nlc2cPCwsxdHKKn5lznEhIS1FoDwsPDWUlJiUn3K5PJWHh4uForQWJiokn3S0hzRcFAE5NKpbwfv5SUFHMXSS9Hjhzh/WgWFhaau0hET821zm3evJl3Mvbw8GCpqalNWoaUlBTm7u7OK8eWLVuatAyENAcUDJhBbGws98Pj7u5u8qughpLJZLwfzLi4OHMXiRioudW5NWvW8E7AM2fONFuZZDIZmzFjBq88a9euNUtZCDEXCgbMQKFQsMDAQN4PYXPtwKRQKHg/lEFBQc22rES75lTn6rYIrF692ux1SqFQsOjoaGohIBaLggEzqdt0Gx0dbe4iabRq1Sq6PdBKNIc6l5CQwDvhbtq0qcnLoMumTZt45aM+BMRSUDBgRvTDSJqaOetccwhG9FE3AJZKpeYuEiEmR8GAmW3ZsoX34xwdHd0smkxVfxABsK1bt5q1TKTxmKPOKRQKNnbs2GZxm6I+dGuMWCIKBpqBtWvX8n6cZ8yYwWQymVnKQp2pLENT1znVDoweHh5m78BYH+o0SywNBQPNRN1OVe7u7k3+CBg9ZmVZmqrONddHG+uTkpJCtwuIxaBgoBnRNgCLqVsJZDIZb0AhAMzBwYH6CFiApqhzjTHoUXl5ObOxsWnylioaaItYCgoGmhmpVMp7BAwAc3JyYpGRkSw/P79R95Wfn88iIyOZk5MTb39BQUH01IAFMWWdu3fvHhMKhby8677s7OxYt27dWFhYGDt//rzGfM6fP89tL5FIGlQmQ8hkMu7/h1AoZEVFRU22b0KaEgUDzZBCoWBxcXEaJ20JDg5mSUlJDZq0JSkpiQUHB6v9KDs4OLAdO3ZQZykLZKo6pzpRkj4va2trtn37drV8duzYwW3z119/NcYh640m5yKWgCYqasYKCwuxcuVK7N+/X+N0rv369dM4naudnR0qKiogl8tRWFiI9PR0pKWlIT09HVlZWVqnc/3oo4/QpUuXpjxE0sw0Zp07d+4c4uPjefk4Ojri1KlT3N81NTW4ceMGYmJicOzYMQCAjY0N8vLyeNMtL1q0CF988QWeeuop3L9/38SfAh9N200sgrmjEVK/oqIitmHDBta1a1eDrrLqe3l5ebENGzZQ0ydR09h1ztramgFgo0aN0rpP1daqdevW8dYNHz6cAWBjxowx8ZHXX7bk5GSzlIEQU7IyVZBBGo+LiwuWL1+OgoICJCcnIzQ0lHfVZAgfHx+EhoYiOTkZ+fn5WL58OU1DTNQ0Zp0DalsAAMDPz0/rNhEREdxyXl4et8wYQ3Z2dr3pTWnBggXcckJCglnKQIgp2Zi7AER/1tbWGD9+PMaPHw8AKCkpwYULF5Ceno6MjAwUFxdDLpejoqICdnZ2EIlEcHJyQv/+/REQEAB/f384Ojqa9yBIi9KQOrdlyxbcuXMHtra2qKqqAqD7ZN65c2duWRk8AMCNGzfw6NEjAEC/fv10lreoqAhxcXE4fvw48vLyUFxcjDZt2uCZZ57BhAkTEBISgmeeeUYtnUKhwN69e7Fnzx5kZGSgrKwMPXr0QHh4ON566y2MGDGC2/b48eP1f3CEtDTmbpoghLQ+xcXFXLN6586dueWMjAytab777jtuu2XLlnHvHzx4kHs/Oztba/qNGzeyNm3a6LxdMWzYMLV09+7dY0OHDtWaZsKECbynGQCYbVAwQkyFWgYIIQCAuLg4REZGok+fPjh16hQEAoHReV24cIFbtrGp/ZmxtbVF7969taZJTk7mlkeOHMktZ2VlAQDs7Ozw7LPPakw7d+5c7NixAwDQtWtXzJ07F88//zwcHR1x7949/Prrr9i9ezcCAgJ46R4/fowXXngBly9fhkAgwGuvvYbQ0FC4u7vj+vXrWL9+PZKTk/HkyRO14xs9erQ+HwUhLYO5oxFCiHkpFAq2detW3pVvQUFBg/L8+OOPeY+sAmD9+vXTuv2JEye4QYU8PT1ZeXk5t27ixIkMAPP399eY9qOPPuL2NXv2bFZRUaFxu8ePH7O8vDzee9OmTWMAmI2NDTt8+LDGNB4eHmqtBRs3btTjUyCk5aAOhIRYsKqqKsyfPx9Llizhvf/w4cMG5ZuZmcktK+/31+0vIJfLkZOTgxUrVkAsFqO6uho2NjaIiYmBSCTitlO2DGjqb3Dx4kV8+OGHAIAJEyZgx44dEAqFGsvUrl07Xn+BU6dOITExEQAQHR2NiRMnakyzePFitfczMjI07oOQlopuExBioR48eID/+7//wy+//KK27vHjxw3Ou67du3dj9+7dWtN07NgRO3fuhFgs5t4rKSmBVCoFoLnz4LvvvouamhrY29tj165dsLLS//pmzZo1AABPT08sX75c63bPPfec2nvFxcV674eQloCCAUIsUF5eHiZMmICCggKN65VX88aqO7CVNtbW1ujTpw+mTJmCefPm4emnn+atV21hqNsycPfuXaSmpgKoffTvqaee0rt8t2/fxs8//8ylVfZr0KRDhw5q7+l7fIS0FBQMEGJhfvrpJ7z66qs6bwWUlpY2aB91Ry+0trZGWload9K1srKCvb09XFxceLcE6lLeIhAIBGotA8nJyWD/fwDVf/zjHwaV7+jRo9zyuHHjdG6rqRWgoqLCoP0R0txRMECIhWCM4YsvvsCSJUugUCh0btvQYKDuffsePXoYNWCQsmXAy8tL7Qo9JycHQO1TCnWfEtA3Xzs7O/Tp00fntrm5uQCAtm3boqysjEtHSGtCHQgJsQBVVVVYsGAB3n777XoDAaDhtwnqXu337dvXqHyUJ21NgcTdu3cBAK6urgY/BqlMq8/om8pBhlQfi9TVmkFIS0TBACGtHGMMU6dORUxMjN5pGtoy4OzszPvbmGCgqqoKly5dAqA5GFDet1eObmgIZTN/fUFPXl4e18HSy8uLe9/JycngfRLSnFEwQEgrd+fOHUgkEoPSNDQYqHvyNiYYuHz5Mtf3QNOTBMrhi+/du4fCwkKD8lZ2VHz06BH++usvjdsoFAosWrSI65fQpk0bbl3//v0N2h8hzR0FA4S0cm5ubnj77bcNeuyuocFA3Xv49d2X10TXkwQA8OKLL3LLH3zwgdZ8qqqqcPXqVd57Q4YM4ZbXr1+vlqampgYLFy7knjgAwBuF0NA+CoQ0dxQMENLKCQQCfPbZZygoKEBkZKTGR+XqamifAX9/f27Z2tqa18SuL+WTBB07dkTXrl3V1k+ZMgW9evUCAOzZswejR4/G3r17kZaWhrS0NBw4cABvv/02PD09eU8PAMD//d//oWPHjgCAbdu2Ye7cufjll19w/vx57N69G0OGDMG2bdvg6ekJoPYzVG19UD0+QloDAVO2gRFCWgyZTMbNHpiZmYkHDx5ALpejsrISQqEQIpEIzs7O8PPz42asVJ78Hj9+jK+//hrvvvsuysvLNeY/btw4HDlyxOjyKRQKWFtbA6g9kVZWVup8ll+TMWPG4OTJk3jhhRc0DowEAFevXoVYLMb169d15vXf//6XN/MgAPzwww8ICQlBdXW12vY2NjZ47733IJPJ8MUXX+C5555DQUEB5HI5fHx8kJ+fb9CxENLsmXMsZEKIfqqrq5lEImGhoaHM29tb58x82l7e3t4sNDSUSSQSVl1dzaqqqtihQ4fYSy+9pLbtyJEjG1Tezz//nJefRCIxOA9nZ2cGgC1ZskTndo8ePWKbNm1iw4YNYx07dmQ2NjbM1dWV+fv7swULFrDU1FRWXV2tMe3p06fZuHHjmKOjIxOJRMzHx4fNmzePmx2xb9++DAAbN24cdyyhoaEGHwshzR0FA4Q0Y0VFRWz9+vWsa9euRgUA2l5du3Zl69evZ0VFRYwxxnJyctjcuXOZSCRiAFhUVFSDyuzi4sLbn1gsbqyPpMlkZGRw5R84cCC3nJycbO6iEdLo6DYBIc1QYWEh3n//fXz33Xdqo/mJRCKu+X/AgAEICAiAp6cnRCIRhEIhKisrIZfLIZVKkZ6ezr0yMzPVhtEVCoUICQnBunXr4OnpiQcPHiA/Px8DBw40qMOhEmMMr776Kg4cOMB7XyAQ4Nq1a/Dx8TH8wzADhUKBl156Cb/88gu8vb252xBeXl7Iz8/nboEQ0mqYORghhKhQKBQsNjaW2dvb866sBQIBE4vFTCKRsKqqKqPyrqqqYhKJhInFYiYQCHj529vbs7i4OKZQKBpU/n379mltjWhIa0Njy8/P17quvLyczZgxgyv35MmTueUNGzY0YSkJaTrUMkBIM1FYWIi5c+fip59+4t5zcnJCREQE5s+fD29v70bbV0FBAbZv346dO3fyxt4PDAxEXFwc14veEHfu3IGvr6/WGf2cnJxw/fp1vZ5mMDV/f3/Y2dkhNDQUfn5+6NChA2QyGf744w/Exsbizz//BAC89dZb2LdvH4qLiyEUCnHz5k29Ri0kpMUxdzRCCGEsISFBrTUgPDyclZSUmHS/MpmMhYeHq7USJCYmGpSPQqFgEyZMqLevQnh4uImORH9VVVXMzs5OZzltbGzYunXr2KxZs7j3wsLCzF10QkyGggFCzGzz5s28E5GHhwdLTU1t0jKkpKQwd3d3Xjm2bNmid/pdu3bp3XkxJSXFdAeih6qqKrZv3z72+uuvs169ejFnZ2dmY2PDnJyc2KBBg9h7773HpFIpO3LkCC9AKiwsNGu5CTElCgYIMaM1a9bwTpQzZ840eWuANjKZjHevHABbu3ZtvekKCwuZg4OD3sGAu7u72Y5RXzKZjBccxcXFmbtIhJgUBQOEmEndFoHVq1c3uANfQykUChYdHa13C4FCoWAjRoww+NHGmTNnmv1YtVEoFLygKCgoqNmWlZDGQsEAIWaQkJDAOzlu2rTJ3EXi2bRpE6982voQvPPOO0aPdRAdHd3ER6WfVatW0e0BYnEoGCCkiUmlUl5nwZZyUpRKpWrbeHh4GB0MtOQgiJDWhh4tJKQJMcYQFBSE48ePAwBmzpyJXbt2QSAQmLlk6hhjmDVrFvbs2QMACAoKQmpqKq+s27dvx/Lly2FnZwcfHx84OjrC3t4e7du31/rv8ePHERMTw+URHR2NDz/80KyfAWMMq1evxurVq7n3tm7disWLF5utTIQ0KbOGIoRYmNjYWN5TA5bakW7t2rW8K/AZM2YwmUzWKHkbytiOk4S0JtQyQEgTKSwshK+vL0pLSwEAKSkpEIvFZi5V/VJTUzFu3DgAgL29PXJzc40alKiuLVu2YNmyZdzf7u7uiIuLa9LPJDU1FXPnzsWtW7d45VqyZEmTlYGQ5sDwwccJIUZZuXIlFwiEh4e3iEAAAMRiMWbPng0AKC0txcqVKxsl36VLlyIhIQH29vYAgFu3bmHcuHGIiIhASUlJo+xDm5KSEoSHh2PcuHFcIODg4IDExEQKBIhlMnfTBCGW4N69e0woFDIAzMnJSe2xQtWXnZ0d69atGwsLC2Pnz5/XmN+2bdu47fft26dzvTH51yWTyZiTkxMDwIRCITfbYWOQSqUsMDCQV0YnJycWGRmpcw4BY+Tn57PIyEjuWJSvoKAgemqAWDQKBghpAuvXr+dOPFFRUWzevHl69ba3trZm27dvV8tPNf3ly5d1rjcmf00iIyO5dI09YY9CoWBxcXEaJ2gKDg5mSUlJDZqgKSkpiQUHB6sdv4ODA9uxYweNI0AsHvUZIMTEampq4OPjA6lUyk3lO23aNJw9exaOjo44deoUb9sbN24gJiYGx44dAwDY2NggLy+PN/3vkCFDcPbsWbRt2xalpaVq0w0r1xubvyYFBQXo3r07gMaZyvfHH3/EqlWr4O/vj8WLF8PPzw+FhYVYuXIl9u/fr3Hq5n79+mmcutnOzg4VFRWQy+UoLCxEeno60tLSkJ6ejqysLK1TN3/00Ufo0qWL0cdASKth7miEkNZOIpFwV6JisZjV1NSwtm3bMgBs1KhRWtOpXsmuW7eOe181/eDBg9XSNTR/XVTTJCcn65VGmyFDhvCu0l944QV26NAhVl1dzYqKitiGDRtY165dGzSOQd2Xl5cX27BhQ6Pe5iCkNaAOhISYWGJiIre8YMECXL16FWVlZQAAPz8/rekiIiK45by8PG65vvQNzV+XBQsWcMsJCQl6pdHXr7/+ismTJ8PR0RHvvvsu3nzzTRQUFCA5ORmhoaH1tlxo4+Pjg9DQUCQnJyM/Px/Lly+naYgJqcPG3AUgpLU7d+4cgNpm7uDgYBw4cIBbp+tk3blzZ265pqaGW87MzNSZvr719eWvi1gshkgkglwux/nz5/VKo43yKYK6Hj9+jK+//hoHDx5EeHg4Fi1ahH379gGofQrgwoULSE9PR0ZGBoqLiyGXy1FRUQE7OzuIRCI4OTmhf//+CAgIgL+/PxwdHRtUTkIsAQUDhJiQTCbD9evXAdSemG1sbPQ+Was+++7m5sYtN1YwoC1/XWxsbNCvXz+cPXsWBQUFKCkpMfpk6+DgoHN9aWkpPvvsM3z++ed4+eWXsXr1avj5+WH06NEYPXq0UfskhGhGtwkIMaELFy5wywEBAQD+d7K2tbVF7969taZNTk7mlkeOHMktK9NbWVmhb9++aukamn99lMcB8I/PUNpaBupijCEpKQkjRoxQ61RICGkcFAwQYkLp6enc8oABAwD872Tdu3dvCIVCjelOnjyJvXv3AgA8PT0RFBTErVOm79GjB9q2bauWtqH510d5HAD/+AylbzCg1KFDBygUCqP3RwjRjoIBQkxItck+ICAAd+/exb179wCoN+HL5XLk5ORgxYoVEIvFqK6uho2NDWJiYiASiQBAZ/r61uuTvz5UWwYyMjL0TldXfbcJVHXr1g3Hjh0zqJyEEP1RnwFCTOjBgwfcsqenJ86cOcP9vXv3buzevVtr2o4dO2Lnzp28YYsN6S9gTP76UJ2XoLi42KC0qvRtGRgxYgQOHjxITwAQYkLUMkCICakOdiMSiXgna02sra3h5+eHNWvWIC8vD5MnT+atNyQYMCb/W7duYevWrQgMDISnpyeEQiE6deqEqVOn4uzZs9xxaDo+Q+kTDMyePRvHjx+nQIAQE6OWAUJMSLXDm1Ao5E7W1tbWSEtLg41N7X9BKysr2Nvbw8XFRWdTuL7BgLH5//vf/8bHH38MHx8fBAYGwsXFBdeuXcOPP/6IH3/8EXv37sWrr77KbV9RUVHfR6CVrtsEAoEAGzduxDvvvAOBQGD0Pggh+qFggBATUu3AV1lZyev8p+uxP22U6V1dXdGpUyet643Nf9CgQfj1118xatQo3vunTp3CmDFj8OabbyI4OJh7387OzuB9KGlrGWjfvj327duHCRMmGJ03IcQwFAwQYkKqV+HFxcW4du0aAGh8JLA+ZWVlXHpNJ3rV9cbkDwBTpkzR+P6IESPw4osv4qeffuI9TtiQDn2aWga6du0KiUSCPn36GJ0vIcRw1GeAEBNydnbmlk+cOME9GmfMyTo7O5tLrykYUF1vbDCgi62tLQDg/v373HtOTk5G51e3+f/555/HuXPnKBAgxAwoGCDEhFRP2sePH+eWjTlZG9J5sLGDgcLCQvz8889wc3NDaWkp937//v2NzrNv377crIfDhg3DyZMn8fTTTze4rIQQw9FtAkJMSPWZfNUBeoy5+jUkGGjMq+uqqiqEhYWhoqICH3/8Mf744w9unerxGcrJyQn5+fm4fPmywY83EkIaF7UMEGJC/v7+3LJUKgVQe6/cy8vL4LyUJ/u2bduiZ8+eWtcbm78mCoUCs2bNwn//+1/MnTsXYWFhvKBG9fiM4eXlRYEAIc0AtQwQYkIdO3aEt7c3rl+/jsePHwMw7qpdoVAgJyeHS29lZaVzfWNQKBQIDw/H3r17MX36dMTExKC6uhpZWVkAaic3io2NRWZmJh48eAC5XI7KykoIhUKIRCI4OzvDz8+Pmz2wY8eOjVIuQkjjo2CAEBMbNGgQN3MhYNz9/KtXr6KsrAyA5lsEqusbo7+AQqHA7NmzsWfPHrz22mvYuXMnUlJSsHHjRm6goTt37mD58uU681FOPQwA3t7eGDRoEKZNmwaxWMz1FyCEmJ+AMcbMXQhCWrPk5GS8/PLLAACxWIyUlBQzl0g31UBg0qRJGDhwIGJjY7nbHI2ha9eumD9/PiIiImh0QUKaAQoGCDGxmpoa+Pj4QCqVQiAQ4Nq1a/Dx8TF3sTRS3hrYvXs3PD09cefOHVRVVfG2EYlEXPP/gAEDEBAQAE9PT4hEIgiFQlRWVkIul0MqlSI9PZ17ZWZmqg1fLBQKERISgnXr1vHmPCCENC0KBghpAhs2bMB7770HAIiKisLGjRvNXCLNVq1ahTVr1mhc1717dwwcOBDLli3jTWOsr+rqahw9ehRfffUVjh49CtWfHnt7e2zevBkRERE0/DAhZkDBACFN4P79+/Dw8EBlZSWcnJxw/fp1dOjQwdzF4iksLMTQoUNx+/Ztndvt2rULs2bNatC+CgoKsH37duzcuZM382FgYCDi4uKolYCQJkaPFhLSBFxcXBASEgKgdljiZcuWmblEfImJifD19eUFAuHh4SgpKQFjjPdqaCAAAD4+Pti4cSMKCgoQHh7Ovf/TTz/B19cXe/fubfA+CCH6o5YBQppIYWEhfH19uRH8UlJSmsUz9lu2bOEFJx4eHoiLi+NNSGRqqampmDt3Lm7dusUr15IlS5qsDIRYMmoZIKSJeHp64tNPP+X+njt3Lh4+fGjGEgFr167lBQIzZ85Ebm5ukwYCQO1TFrm5uZgxYwb33tKlS7Fu3bomLQchloqCAUKa0Jw5cxAYGAgAuHXrFhYvXgxzNc5t2bIFH374Iff36tWrsWvXLrP1ZXB0dMTXX3+N6Oho7r0PPvgAW7duNUt5CLEkdJuAkCZW93ZBdHQ0Vq1a1aRlSExMxPTp07m/N23ahHfeeadJy6DLp59+isjISO7vxMREvP7662YsESGtGwUDhJiBOU/GzSEY0Ud0dDRWr14NoPbRw9zcXHrKgBATodsEhJjBtGnTsGXLFu7vyMhIrF692uS3DBhjmDNnDhcIzJw5k3eroDlZtWoV14egtLQUb7zxhtluqRDS2lHLACFmtG7dOnzwwQfc3zNmzMBnn30GR0dHk+wvLi4Ob7zxBoDapwZyc3Ob3XgHqkpKSuDr68s9ZRAXF4c5c+aYuVSEtD4UDBBiZnUf7XN3d0dcXFyjP3bYXB9trE9qairGjRsHgG4XEGIqdJuAEDNbunQpEhISYG9vD6D2KYNx48YhIiICJSUljbaflStXcoFAeHh4iwgEgNrHDmfPng2g9nbBypUrzVwiQlofCgYIaQamTZuG3Nxc7rFDAIiPj4ePjw+ioqJQUFDQoPyLioqwf/9+AEDbtm0RHx8PgUCg9hKJRPD29saMGTOQlpamMa+YmBhu+2+//VbnemPy12Tz5s1wcnICAOzfvx/379834lMghGhDwQAhzYSnpyeOHj2KuLg4rpWguLgYmzZtQo8ePSAWiyGRSFBdXW1w3vHx8aisrAQA9OjRQ+t2FRUVuHHjBr755hsMGTIEsbGxattkZmZyy35+fjrXG5O/Jo6OjtywxZWVlYiPj9crHSFEP9RngJBmqLCwECtXrsT+/fu5k7iSSCRCv379NE4hbGdnh4qKCsjlchQWFiI9PR3nzp3jggGBQIC+ffsiKysLjo6OOHXqFJdvTU0Nbty4gZiYGBw7dgwAYGNjg7y8PN6Uy0OGDMHZs2fRtm1blJaWwsqKf02hXG9s/toUFBSge/fuAAAvLy/k5+fD2trawE+WEKIRI4Q0W0VFRWzDhg2sa9euDECDX8HBwaxt27YMABs1apTW/QYHB3Np1q1bx71fU1PDpR88eLBaOtX1xuRfH9V0ycnJeqcjhOhGtwkIacZcXFywfPlyFBQUIDk5GaGhoXpdRWszceJElJWVAdDcxK8UERHBLefl5XHLV69e1Zm+vvX15V+fBQsWcMsJCQl6pyOE6GZj7gIQQupnbW2N8ePHY/z48QBqn7+/cOEC0tPTkZGRgeLiYsjlclRUVMDOzg4ikQhOTk7o378/tmzZgjt37kAkEsHBwYHLU9fJunPnztxyTU0Nt2xIfwFj8q+PWCyGSCSCXC7H+fPn9U5HCNGNggFCWiBHR0eMHj0ao0eP1rmdTCbDu+++C6D25JyTk8Ot03WyVp1K2M3NjVturGBAW/71sbGxQb9+/XD27FkUFBSgpKTEZAM0EWJJ6DYBIa3YhQsXuOWAgADuZG1ra4vevXtrTZecnMwtjxw5kltWpreyskLfvn3V0jU0f30EBARwy6rHRwgxHgUDhLRi6enp3PKAAQO4k3Xv3r0hFAo1pjl58iT27t0LoPZxx6CgIG6dMn2PHj3Qtm1btbQNzV8fAwYM4JZVj48QYjwKBghpxVSb7bt27Yp79+4BUG/Cl8vlyMnJwYoVKyAWi1FdXQ0bGxvExMRAJBIBAO7evas1fX3r9clfX6otAxkZGQalJYRoRn0GCGnFHjx4wC0XFxdzy7t378bu3bu1puvYsSN27tzJG7LYkP4CxuSvL9V5CVSPiRBiPAoGCGnF5HI5t3z58mWd21pbW6NPnz6YMmUK5s2bh6effpq3viEjD+qTv1wux4oVK5CWlob8/HwUFxfD0dERPj4+mDNnDqZPnw5bW1teS4Lq8RFCjEfBACGtmOrohbm5uQBqT8ppaWmwsan9729lZQV7e3u4uLjobLLXNxgwNv/Hjx9j27ZtGDRoEMaPHw8XFxfIZDKkpqYiPDwc3377LVJTU2FnZ8elqaioqPczIITUj4IBQlox1U58yvvrPXr00PnYnzbKk72rqys6deqkdb2x+Ts5OeHhw4dqHQ+rq6sxduxY/PTTT0hNTcWYMWO4daqBASHEeNSBkJBWTPVKPD8/HwA0PhJYn7KyMly7dg2A5lYB1fXG5A/UtiBoegLBxsYGkydPBlB7DKq3BgztfEgI0YyCAUJaMWdnZ25ZoVAAMO5knZ2dzaXXFAyorjc2GNBGoVDg6NGjAABfX18UFhZy65TTGhNCGoZuExDSivn5+WHfvn2894w5WRvSebChwUBlZSX+9a9/gTGGBw8e4MSJE8jLy8Ps2bMxZswY7Nq1i9u2f//+DdoXIaQWBQOEtGKqz+Qr9enTx+B8DAkGjMlfVWVlJVavXs39LRAIEBkZifXr1wMA0tLSuHWajo8QYji6TUBIK+bv78/728HBAV5eXgbnozzZt23bFj179tS63tj8VbVv3x6MMdTU1OCvv/7Cl19+iR07duCFF17Ao0ePeKMO1j0+QohxqGWAkFasY8eO6NatG27cuAGg9p67oRQKBTfBUZ8+fWBlZaVzfWOxsrKCh4cH3nzzTTz11FN49dVXsXbtWmRlZQEAfHx8aJIiQhoJtQwQ0so9++yz3HKHDh0MTn/16lWUlZUB0HyLQHV9Y3ceVAoMDAQAJCUlcU8TDBw40CT7IsQSUcsAIa3cm2++iZSUFKPT9+rVC4wxo9c3htu3bwMAioqKuPemT59u0n0SYkkEzNT/iwkhZlVTUwMfHx9IpVIIBAJcu3YNPj4+5i6WmkuXLsHLy0ttNsSysjJMnTqVe7wQALy8vJCfnw9ra+umLiYhrRLdJiCklbO2tsb8+fMBAIwxbN++3cwl0uy7775Dp06dMG7cOCxYsAD//Oc/ERYWBk9PTxw9ehQeHh7ctvPnz6dAgJBGRC0DhFiA+/fvw8PDA5WVlXBycsL169eN6j9gSmlpaYiNjcXp06dx69YtPH78GB06dEDfvn0xceJErFmzBjKZDEKhEDdv3oSLi4u5i0xIq0EtA4RYABcXF4SEhAConfZ32bJlZi6RugEDBiA2Nha5ubmQyWSoqqrC33//jZMnTyI7OxsymQwAEBISQoEAIY2MWgYIsRCFhYXw9fVFaWkpACAlJQVisdjMpapfSkoKxo8fDwCwt7fHxYsX0aVLFzOXipDWhVoGCLEQnp6e+PTTT7m/586di4cPH5qxRPUrKSnBG2+8wf29efNmCgQIMQEKBgixIHPmzOGe2b916xYWL15s8scCjcUYw+LFi3Hr1i0AQFBQECIiIsxcKkJaJwoGCLEgAoEAcXFxsLe3BwDs3r0ba9asMXOpNFu9ejX27NkDoPb2QFxcHAQCgZlLRUjrRMEAIRbG09MT27Zt4/6Ojo7m3T5oDj799FPeZEUxMTF0e4AQE6JggBALNG3aNGzZsoX7OzIyEqtXrzb7LQPGGKKjoxEZGcm9t3XrVrz++utmLBUhrR89TUCIBVu3bh0++OAD7u8ZM2bgs88+M8sEQCUlJVi8eDF3awAA1q5di5UrVzZ5WQixNBQMEGLhtmzZwht3wN3dHXFxcU362GFqairmzp3LdRZUlmvJkiVNVgZCLBndJiDEwi1duhQJCQlcp8Jbt25h3LhxiIiIQElJiUn3XVJSgvDwcIwbN44LBBwcHJCYmEiBACFNiFoGCCEAagclmjt3Ln766SfuPScnJ4SHh2P+/PmNOrlRQUEBYmJiEB8fj+LiYu79oKAgxMXFUWdBQpoYBQOEEA5jDDt37sSyZcu4kQqB2kcSg4KCsGDBAojFYtjYGD77eXV1NVJTU/HVV1/xZiAEalsDNm/ejPDwcHp8kBAzoGCAEKKmsLAQK1euxP79+1FZWclbJxKJ0K9fPwQEBGDAgAEICAiAp6cnRCIR7OzsUFFRAblcjsLCQqSnpyMtLQ3p6enIysqCXC7n5SUUChESEoKPPvqIWgMIMSMKBgghWt2/fx/x8fHYtm0bpFJpo+Xr5eWF+fPnIzw8nCYdIqQZoGCAEFKvmpoaHD16FAkJCTh//jwKCgoMzsPHxwcDBw7E9OnTERwcDGtraxOUlBBiDAoGCCEGKykpwYULF5Ceno6MjAwUFxdDLpejoqICdnZ2EIlEcHJyQv/+/REQEAB/f3+zjF1ACNEPBQOEEEKIhaNxBgghhBALR8EAIYQQYuEoGCCEEEIsHAUDhBBCiIWjYIAQQgixcBQMEEIIIRaOggFCCCHEwlEwQAghhFg4CgYIIYQQC0fBACGEEGLhKBgghBBCLBwFA4QQQoiFo2CAEEIIsXAUDBBCCCEWjoIBQgghxMJRMEAIIYRYOAoGCCGEEAtHwQAhhBBi4SgYIIQQQiwcBQOEEEKIhaNggBBCCLFwFAwQQgghFo6CAUIIIcTCUTBACCGEWDgKBgghhBALR8EAIYQQYuEoGCCEEEIsHAUDhBBCiIWjYIAQQgixcBQMEEIIIRaOggFCCCHEwlEwQAghhFg4CgYIIYQQC0fBACGEEGLhKBgghBBCLBwFA4QQQoiFo2CAEEIIsXAUDBBCCCEWjoIBQgghxMJRMEAIIYRYOAoGCCGEEAtHwQAhhBBi4SgYIIQQQiwcBQOEEEKIhaNggBBCCLFwFAwQQgghFo6CAUIIIcTCUTBACCGEWDgKBgghhBALR8EAIYQQYuEoGCCEEEIsHAUDhBBCiIWjYIAQQgixcBQMEEIIIRaOggFCCCHEwlEwQAghhFg4CgYIIYQQC0fBACGEEGLhKBgghBBCLBwFA4QQQoiF+3/HLADna39ulgAAAABJRU5ErkJggg==", + "text/markdown": [ + "The following 1 variables were identified as _nuisance_ variables,\n", + "meaning that they appear as descendants of nodes appearing in paths between\n", + "the treatment and outcome, but are not themselves ancestors of the outcome variable:\n", + "\n", + "$Akt$\n", + "\n", + "These variables are marked as \"latent\", then\n", + "the algorithm proposed in [Graphs for margins of Bayesian\n", + "networks](https://arxiv.org/abs/1408.1809) (Evans, 2016) and implemented in\n", + "the $Y_0$ Causal Reasoning Engine is applied to the ADMG to\n", + "simplify the graph. This minimally removes the latent variables and makes\n", + "further simplifications if the latent variables are connected by bidirected\n", + "edges to other nodes.\n" + ], "text/plain": [ - "
" + "" ] }, "metadata": {}, "output_type": "display_data" - } - ], - "source": [ - "new_graph = remove_nuisance_variables(graph, treatments=RAF, outcomes=ERK)\n", - "new_graph.draw()" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "id": "49a2302215d6f765", - "metadata": { - "ExecuteTime": { - "end_time": "2024-01-25T17:50:55.707826Z", - "start_time": "2024-01-25T17:50:55.233007Z" }, - "collapsed": false, - "jupyter": { - "outputs_hidden": false - } - }, - "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAgMAAAGFCAYAAABg2vAPAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAAB2aklEQVR4nO3deVxU1f8/8NcADiMKwigqgoiMmZoLgriU+wKMmpaWUoomuGWaZpjf0hK3pDL188kSBS0NcilbAMFdy9RUENwXFhvcURlSg2GZOb8/+M39zGUWZkZgYOb9fDzm4Z177zn33JE79z3nnkXAGGMghBBCiM2ys3QBCCGEEGJZFAwQQgghNo6CAUIIIcTGUTBACCGE2DgKBgghhBAbR8EAIYQQYuMoGCCEEEJsHAUDhBBCiI2jYIAQQgixcRQMEEIIITaOggFCCCHExlEwQAghhNg4CgYIIYQQG0fBACGEEGLjKBgghBBCbBwFA4QQQoiNo2CAEEIIsXEUDBBCCCE2joIBQgghxMZRMEAIIYTYOAoGCCGEEBtHwQAhhBBi4ygYIIQQQmwcBQOEEEKIjaNggBBCCLFxFAwQQgghNo6CAUIIIcTGUTBACCGE2DgKBgghhBAbR8EAIYQQYuMoGCCEEEJsHAUDhBBCiI2jYIAQQgixcRQMEEIIITaOggFCCCHExlEwQAghhNg4CgYIIYQQG0fBACGEEGLjKBgghBBCbBwFA4QQQoiNo2CAEEIIsXEUDBBCCCE2joIBQgghxMZRMEAIIYTYOAoGCCGEEBtHwQAhhBBi4ygYIIQQQmwcBQOEEEKIjaNggBBCCLFxFAwQQgghNo6CAUIIIcTGUTBACCGE2DgKBgghhBAbR8EAIYQQYuMoGCCEEEJsHAUDhBBCiI2jYIAQQgixcRQMEEIIITaOggFCCCHExlEwQAghhNg4B0sXgBBbJZfLcfbsWaSnpyMzMxOPHj2CQqFAaWkphEIhRCIRmjZtCj8/PwQEBMDf3x9ubm6WLjYhxAoJGGPM0oUgxBYolUqkpqYiISEBp0+fRm5ursl5+Pr6omfPnpgwYQKkUins7e1roKSEEFtDwQAhNezBgwfYvHkzYmJiIJPJqi3fNm3aYObMmYiIiIC7u3u15UsIsT0UDBBSQ/Ly8rBo0SLs2rULpaWlvG0ikYir/u/RowcCAgLg7e0NkUgEoVCI0tJSKBQKyGQypKenc6/MzEwoFApeXkKhEOPHj8eKFSvg7e1dm6dICLESFAwQUs0YY4iLi8P777+PJ0+ecOsFAgFCQkIwa9YshISEwMHB9CY75eXl2Lt3L7755hvs3bsXmpevs7Mz1qxZg4iICAgEgmo5F0KIbaBggJBqlJeXh2nTpmH//v3cOrFYjIiICMycORO+vr7VdqycnBxs3LgRmzdvRkFBAbc+KCgIsbGxVEtACDEaBQOEVJOEhAS8/fbbvNqA8PBwrFmzBk2aNKmx4xYWFuL999/Hli1buHXOzs6IiYnBm2++WWPHJYRYDwoGCKkGa9euxfz587n3Xl5eiI2NRUhISK2VITU1FdOmTcPt27d55Zo3b16tlYEQUj/RoEOEPKPly5fzAoHJkyfj4sWLtRoIAIBUKsXFixcxadIkbt17772HFStW1Go5CCH1DwUDhDyDtWvX4pNPPuHeL126FN9++22NPhYwxNXVFd999x2ioqK4dR9//DHWrVtnkfIQQuoHekxAiJkSEhIwceJE7v3q1avx/vvvW7BEfF9++SUiIyO59wkJCdSGgBCiEwUDhJghLy8PnTt35hoLRkVFYcmSJRYulbaoqCgsXboUQEWjwosXL1IvA0KIFgoGCDERYwzBwcE4cOAAgIo2At9++22d7NvPGMNbb72Fbdu2AQCCg4ORmppaJ8tKCLEcCgYIMVFsbCymT58OoKLXwMWLFy3WRsAYhYWF6Ny5M9fLIDY2FlOnTrVwqQghdQkFA4SYoPLjgZSUFEilUguXqmqpqakYPnw4AHpcQAjRRr0JCDHB4sWLuUAgPDy8XgQCQEW3wylTpgAAnjx5gsWLF1u4RISQuoSCAUKMlJ+fj507dwKoGGK4c+fOEAgEOl8ikQi+vr6YNGkS0tLSdOYXExPD7a/OV58DBw7Azc0NAoEA9vb2WL16tcH979y5g8aNG3P5f/PNN1izZg3EYjEAYOfOnXjw4IEZnwIhxBpRMECIkbZs2cLNPhgREYFr167p3bekpAQ3btzA999/j969e2PTpk1a+2RmZnLLfn5+evP66quvIJVKUVhYCGdnZ/z222+8LoO6LF68GP/++y/3/vz583B1dUV4eDgAoLS0lDd8MSHEtlGbAUKMoFQqIZFIIJPJIBAIkJWVhQkTJuDUqVNwdXXFsWPHePveuHEDMTEx2LdvHwDAwcEBV69ehUQi4fbr3bs3Tp06hUaNGuHx48ews+PH5uXl5Zg9ezY2btwIAPDx8UFSUhI6d+5ssKznzp2Dv78/VCoVGjVqhH///Rd9+vTBiRMnkJOTg3bt2nH5ZWdnw97evlo+I0JIPcYIIVVKSkpiABgAJpVKmVKpZE5OTgwAGzBggN50ISEhXLoVK1Zw6zXT9+nTRyvdo0eP2KBBg7i0ffv2Zfn5+UaVdejQoQwAGzp0KAsNDWUAmLOzM1OpVFplSk5ONu2DIIRYJXpMQIgREhISuOVZs2bh+vXrKCoqAmC4ij8iIoJbvnr1KrdsKP3Vq1fRq1cvHDlyBADw1ltv4dChQ3B3d6+ynCkpKTh48CAEAgG++OILvPDCCwAqGg3+/fffXPnV4uPjq8yTEGL9KBggxAinT58GAIhEIoSEhBj9vL9Vq1bcslKp5JY103fv3p1b3rdvH3r37o3s7GzY2dnh888/x7fffguhUFhlGZVKJRYsWAAAmDBhAvz8/HiPFM6fPw+gomeBSCQCAJw5c6bKfAkh1o+CAUKqIJfLkZubC6Dixu/g4GB0MKA5nbCHhwe3rCv9f//7X4wYMQL//PMP11BQfXM3RlxcHC5fvgyRSISVK1cCAFczAPwvGHBwcEC3bt0AADk5OSgsLDT6GIQQ60TBACFVOHv2LLccEBAA4H838wYNGqBTp0560yYnJ3PL/fv355bV6R0cHNChQwfMmDEDc+fOhVKphI+PD44fP46RI0caXcYnT55wcyPMmTOHG1DI19eXqwW4cOGC1nlUPj9CiG2iYICQKqSnp3PLPXr0APC/m3mnTp30VuEfPnwYP/zwAwDA29sbwcHB3DZ1+hYtWmDUqFFc18OXXnoJp0+fRpcuXUwqY3R0NO7fvw+xWIyPPvqIW29vb48OHToA+F/NgOZ5VD4/QohtomCAkCpoVukHBATg3r17uH//PgDtRwQKhQIXLlzARx99BKlUivLycjg4OCAmJob7ha6Z/vbt2zh69CiAigmPDh8+bFRDQU23bt3C2rVrAQCLFi2Cq6srb7u63UB2djaKi4u581DLyMgw6XiEEOvjYOkCEFLXPXr0iFv29vbGyZMnufdbt27F1q1b9aZ1c3PD5s2becMWawYXQqGQG8iob9++RjUUrOyjjz5CcXExfHx8MHv2bK3t6nYDSqUSly9fRkBAAG9egoKCApOPSQixLlQzQEgVFAoFtywSiXg3c13s7e3h5+eHZcuW4erVq3j11Vd52zXTx8TEcDUBs2fPxqlTp0wq29mzZ7nugStXrtQZTOhqRKiupQD450cIsU1UM0BIFdS/3IGKX/Lqm7m9vT3S0tLg4FBxGdnZ2cHZ2Rnu7u68m21lmsHAyJEj0bZtWwwbNgwlJSUYM2YM0tPT0bJlS6PK9v7774MxhoCAALzxxhs699EVDDg6OnLrSkpKjDoWIcR6UTBASBU0f22XlpZyN/PnnnvOYLdCfdTpPTw84O7ujoEDB+Kzzz7D+++/jzt37mDs2LE4cuRIlY8MEhMTufYG6enpWsMZ66IOBjQDAM3AgBBim+gxASFV0PyVX1BQgKysLABA165dTc6rqKiIS68ZSMyfPx+hoaEAgBMnTmDOnDkG8ykvL8cHH3xg8vHV3QsrP/oghNg2qhkgpApNmzbllg8dOgSVSgXAvGDg/PnzXPrKtQpxcXG4dOkSLly4gE2bNiEgIADTp0/Xmc/GjRtx7do1CAQCfP3113BzczN43O+++w779u3DgwcPcO/ePeTn53Pb1NMaE0JsFwUDhFTBz88P27dvBwAcOHCAW29OMGBo5MJGjRrhl19+QY8ePVBYWIg5c+agS5cu6NOnD2+/f/75B1FRUQCAV155BW+//XaVx7116xY3g+L58+d5IyNqDodMCLFN9JiAkCpo9snXHKDH1IGBAH4woB4SWJNEIkF8fDwEAgFKS0sxduxY3Llzh7fPp59+iocPH0IgEHBBQVXat2/PLV+4cAFpaWnce83zI4TYJgoGCKmCv78/tyyTyQAALi4u8PHxMTkvdTDQqFEjPPfcczr3GTFiBHeTv3v3LsaOHcv1aJDJZPjvf/8LABg7dqzRtROawcD58+d5QY3m+RFCbJOAMcYsXQhC6jqJRMJNVgRUDBv8559/mpSHSqWCs7MzioqK0Lt3b97gRZUxxjB69GgkJSUBAKZOnYrY2Fi8+eab2L59O+zs7HD+/Hlet0FDysrK0LBhQyiVSnTr1g3Xrl2DQqFA8+bNsXv3bvTt29ekc6kucrkcZ8+eRXp6OjIzM/Ho0SMoFAqUlpZCKBRCJBKhadOm8PPzQ0BAAPz9/atsH0EIMR21GSDECD179uQFA+a0F7h+/TqKiooAGJ7pEAAEAgG+//57BAYGIisrC3FxcfDy8sKOHTsAAK+//rrRgQBQMaFS27ZtkZ2djcuXL6OsrAwAkJ+fj/79+2P//v0YOnSoyedkKqVSidTUVCQkJOD06dO8z9QQdZsNoGLypZ49e2LChAmQSqWwt7evqeISYjOoZoAQIyQnJ+Pll18GAEilUqSkpFi4ROaTSqXYu3cvb12rVq1w/vx5Xs+J6vTgwQNs3rwZMTEx3KOW6tCmTRvMnDkTERERJs/pQAj5HwoGCDGCUqmERCKBTCaDQCBAVlYWJBKJpYtlspycHLRr107ntrFjx+LHH3+EQCCotuPl5eVh0aJF2LVrF28kR6BifAN19X+PHj24ORNEIhE3Z4NCoYBMJkN6ejr3yszM1BpCWSgUYvz48VixYgVv3gVCiJEYIcQoq1atYgAYALZgwQJLF8cskZGR3Dnoen377bfVchyVSsU2bdrEnJ2defkLBAImlUpZUlISKysrMyvvsrIylpSUxKRSKRMIBLz8nZ2dWWxsLFOpVNVyHoTYCqoZIMRIDx48gJeXF0pLSyEWi5Gbm4smTZpYulhGKywshEQiMThLYePGjZGZmflMtR55eXmYNm0a9u/fz60Ti8WIiIjAzJkz4evra3beleXk5GDjxo3YvHkz77yCgoIQGxtLtQSEGMvS0Qgh9UlYWBj3KzQ8PNzSxTHJlClTDNYKqF99+vQx+1d7fHy8Vm1AeHg4KywsrOaz4ZPL5Sw8PFyrliAhIaFGj0uItaBggBATyGQy3s0uJSXF0kUyyp49e4wKBNSvpUuXmnyMNWvW8PLw8vJiqampNXA2+qWkpDBPT09eOdauXVurZSCkPqJggBATbdq0ibvReHp61viv3mcll8u1bpBVvezt7dnJkyeNPsayZct46SdPnmyxz0Uul7NJkybxyrN8+XKLlIWQ+oKCAUJMpFKpWFBQEO/GV1cbrKlUKq0bo7EviUTCnjx5UuUxKtcILF261OKfh0qlYlFRUVRDQIiRKBggxAyVHxdERUVZukg6LVmyxKxAQP0aPny4wfzj4+N5+69evbqWzsw4q1ev5pWP2hAQohsFA4SYqb7dCM197dy5U2f+9TEgcnZ2ZjKZzNJFIqTOoYmKCDHThAkTsHbtWu59ZGQkli5dCmbh3rqMMURFRSEyMpJbN3bsWDRo0MCs/IqLi3UeY+rUqXjy5AkAYPLkyfjkk0/MK3ANW7JkCSZNmgQAePLkCaZPn27x/yNC6hoaZ4AQE/z777+YN28ezp49i7i4OHTv3h0rVqzAxx9/zO0zadIk/Oc//4Grq2utl6+wsBBz587Ftm3buHXLly/H4sWL8fTpUzx+/BglJSVQKBS8fyuvKy4uxsWLF9GhQwfMmjVL6zixsbGYPn06AMDLywsXL16s02MuFBYWonPnzrh9+zaAivJPnTrVwqUipA6xZLUEIfVJYWEhe+mll7gq5w8++IDbVrkRnaenZ613O6ytbnX1tXtlSkoKPS4gRA8KBggxwv3791n37t25m4mLiwu7dOkSbx99A+7I5fIaLZtcLtcaUMjFxUVnYzmVSvXMLf3r08BLiYmJbOTIkczDw4M1aNCA9xmFhYVZuniE1BkUDBBShZs3b7Lnn3+eu4m4u7uzs2fP6txXJpPxuh0CYGKxmEVGRrLs7OxqLVd2djaLjIxkYrGYd7zg4GCWl5enc38nJyfWoEEDNnbsWHbw4EGTRxq8f/8+EwqF3HkVFhayDRs26G186OTkxJ5//nk2c+ZMdvXq1eo6daMsXrzYYMNIoVDI8vPza7VMhNRVFAwQYsD169dZmzZtuBuIl5cXu3Llit79b968yT744AM2efJknZP0hISEsMTExGeapCcxMZGFhIRo3dxcXFxYXFyc3l/+mhMtaQY2M2bMYIcOHTKqTLoma5oxY4ZRvRIcHR3ZTz/9ZNZ5myojI4ObxOill15iv/32G8vMzGQXLlzgDVscHR1dK+UhpK6jBoSE6HH+/HkEBQXh/v37AIB27drh4MGDaNOmjd40r732Gnbv3g0AcHR0hIeHB27duoXy8nLefiKRCN26ddM5fa+joyPXkC8vLw/p6elIS0tDeno6zp07p3f63pUrV6J169Z6y3bnzh14enrq3d68eXOMGTMG48aNQ//+/WFvb8/brm8a5969e+PUqVNo0qQJ/vzzT27/0tJSZGdnY926dTh58iQAwMnJCTk5OWjZsqXeclSHt99+GzExMXBxccHff/8NNzc3bpvmNM4+Pj7Izs7WOldCbI6loxFC6qKTJ08yV1dX7hdk165d2d27d6tMN3z4cJ2/ihs3bsxcXFyqpd+/+uXj48Oio6NNquru16+fUXm3aNGCvf322+zIkSOsvLycMcZYUlISt10qlTLGGFMqlczJyYkBYH379tV5TKVSyXr06FGjjRor8/X1ZQDYuHHjdG7XrFlJTk6u8fIQUtfROAOEVHLo0CEMHToUhYWFAIDevXvj6NGjRv2a1ffLXN2tDwCaNGmCpk2bmlU2iUSC0NBQJCcnIzs7GwsXLoS7u7vR6d944w2j9rt//z42bNiAQYMGoW/fvlAqlUhISOC2q7sbXr9+HUVFRQCArl276szLzs4OM2fO5N5funTJ6PKa4+HDh8jNzQUAvPTSSzr30ewuGR8fX6PlIaQ+cLB0AQipS3777TeMGzcOpaWlAIAhQ4bg119/RePGjY1Kb6iaXu2ff/4BAAgEAvTr1w9Dhw7FlStXUFBQwPX1d3R0hEgkglgsRvfu3REQEAB/f/9nHrtgzJgxmD17NlQqldFp/vrrL+Tn5+P06dMAKh5xhISEAAAyMzO5/bp06aI3D81HK5UfmWgqKipCamoqDh48iLS0NOTm5uLx48cQiURo164dRowYgfnz50MsFmulnThxIi9gAYC5c+di7ty53PuEhAS8+eabkEqlEIlEUCgUOHPmjOEPgBAbQMEAIf9ffHw83nrrLSiVSgDA6NGjsWPHDohEIqPzMCYYUGOM4Y8//sDMmTN5gxbVpBYtWmDAgAE4cuSI0WnmzZsHkUjE/dr28/ODg0PFV4dmMKCvZgAAHjx4wC37+vrq3W/48OH4/ffftdY/ffoUmZmZyMzMxHfffYdjx46hbdu2vH2uXLlS5bl06tQJAODg4IBu3brh1KlTyMnJQWFhoUUGiSKkrqDHBIQA+OabbxAWFsYFAhMnTsSPP/5oUiAAmBYMAIC7uzsGDRpkUppn9frrrxu97zvvvIM1a9bg7Nmz3LqAgABuWR0MCAQCdO7cWW8+v/zyC7c8evRonfswxnDu3Dm89NJLWLZsGRITE3HmzBmcPHkS27dvh1QqBQDcvn0bs2fP1kr/ww8/4MKFCxgzZgyAisDnwoULvJdmGTXPQ/P8CLFJlm60QIilffrpp7zGc7NmzWJKpdKsvLKysoxuAFhVN8Wacu/ePWZnZ1dl+WbPns11U/zss8+49d9++y2XV4sWLbjGjPr89NNPXDe/CRMm6N2vpKSE5ebmGiy7ulugvb293umVe/XqxY23YMiWLVu4c/r8888N7kuItaOaAWKzGGP4v//7P3z00Ufcuo8++gjr16+HnZ15l4aXl5dR+0kkEhw7dgwdOnQw6zjPokWLFujfv7/BfUQiEaZNmwaBQACA/zhA/Yv63r17XLfLyu0FSkpKcOHCBcybNw/jxo0DYwyDBw/Gpk2b9B5TKBRqVf1XNm7cOAAV3Rzv3LmjtV2lUuHChQsAKh5nGKJZM5CRkWFwX0KsHbUZIDZJqVTinXfewcaNG7l1n332GT744INnylckEsHd3Z33jLyyF154AQcOHICHh8czHetZvP766zh69Kje7QqFAkOGDMHhw4fRpUsXPHr0iNvm7e0NgB8gJCUlcYFDZb169cLUqVMxZcoUk/rzFxQUoLCwEMXFxdwsg+obPVAxjkNlWVlZXO+Gbt26GcxffR7qYxFiyygYIDanrKwMkydPxvbt2wFUPO/esGEDZsyYUS35t27dWm8w0KNHD+zdu9fsroXVRd2rgFUac2z69OnIyMjAmTNn8PDhQwwePBhHjhzhDXSkbkehGQwYUlhYiCFDhhgVCOzZswffffcd/vjjD+Tn5+vdr0GDBjoHUNIsU1U1A5rtQSoP5ESIraHHBMSmFBcXY8yYMVwg4ODggISEhGoLBAD9jQj79++PQ4cOWTwQAICWLVtqPSp49913ERMTg/3796Nnz54AKvrsDxo0iBtzAaiozgf4N95jx45xjfROnTqF77//Ht27dwcAXLt2DVOmTDFYHrlcjqCgIIwcORI//fSTwUAAANq3b8/1aNCkLlPDhg3Rvn17g3lo1iyUlJQY3JcQq2fZJguE1J7Hjx+zgQMH8sbKT0pKqvbjvPPOO1qN8aRSKfv333+r/VjPYvPmzVz53n33Xd6cBnK5nAUGBnLbNWf8UygUjDHGTd7UokULnfkXFRWxjh07cukyMjJ07ldWVsYbofCVV15hO3bsYNeuXWNPnjzhNeZs2bIlA8AmTpyoMy+pVMoAsJ49e1Z5/sXFxdwxBwwYUOX+hFgzekxAbMKjR48glUq5AWYaN26MpKQkDBw4sNqPxSpVvb/++uuIj4/nflHXFVOmTIFKpUKjRo0QGhrKe+bv6uqK/fv3IygoCGfOnEFZWRm3TaFQQKlUIisrC4D+6viGDRti0aJFmDhxIoCKAX907bt582akpaUBAOLi4hAREaEzv0uXLuHevXsGj6muGaiqvYD6PNRM7UJKiLWhxwTE6t25cwcDBgzgAgGxWIxDhw7VSCAA8FvWDx06FNu3b69zgQBQ0VZi6tSpeOONN3Q2/lMHBIGBgbz1eXl5OH/+PDeKoaFn86+++ioaNmwIAPj555917qMeg6B9+/Z6AwEAvJ4I6kcQmvLz83H37t0qy6SWl5fHLesa0ZAQW0I1A8Sq3bhxA0OHDuVGz/Pw8MD+/fsNDpDzrGbOnIk7d+6grKwMK1euNLubYl2gDgg6d+6M27dvAwDS09N5v6oN3XidnJwwZMgQJCcnIzc3F5cvX+ZGAVS7efMmABicY+HcuXPYsGGDwWOa0ngQqDgPNV3BBSG2pP5+SxFShcuXL6Nv375cINC2bVscO3asRgMBtWXLlmHVqlX1OhBQc3V1xddff829T0tLM+nGO2LECG45KSlJa3uTJk0AVEwZravh4IULFzBixAjuUYW3t7fOX/Lnzp0DUFHjYWhoZM3zUNMcc4AQW1T/v6kI0SE9PR39+/fnBqbp2LEjjh07BolEYuGS1U+aPQ/S09O5YMDJyanKVvuawUBycrLW9uHDhwMAnjx5gsGDB2PHjh1IT0/Hvn37MHv2bAQGBsLZ2Rlubm4Aqm4vIJFIjJpYSrNmwN/fv8r9CbFm9JiAWJ0//vgDI0eOxJMnTwBU/Orbu3cvmjVrZlR6uVyOs2fPcje9R48eQaFQoLS0FEKhECKRCE2bNoWfnx83m6D6RmWt3Nzc4Ovri9zcXGRkZHBjBnTp0qXK2o/WrVuja9euOH/+PE6ePIlHjx7xulfOmzcPP/30E86dO4dLly5pTbPcu3dvbNu2Dc8//zwA/VX66mDAmEcE5eXlXE2CRCKhSYqIzaNggFiVlJQUjB07lnum3b9/fyQlJcHFxUVvGqVSidTUVCQkJOD06dPcY4WqqMcqACpm4uvZsycmTJgAqVRq0kh79UXPnj2Rm5vL65NvzI0XqKgdOH/+PJRKJVJSUhAWFsZta9y4MY4dO4alS5fip59+wp07dyAWi9GtWzdMmDABEydOREZGBtdLQ9cxFQoFrl27ZnSZUlNTub+Ryg0kCbFFAla5HxQh9dTOnTsxceJElJeXAwCkUil++uknODk56dz/wYMH2Lx5M2JiYiCTyaqtHG3atMHMmTMRERFhsFFcfZOcnIyXX34ZQMVnm5KSYuESmU8qlWLv3r0AKs5L81EGIbaIggFiFeLi4jB9+nTu1+O4cePw/fff6+zSl5eXh0WLFmHXrl0oLS3lbROJRFz1f48ePRAQEABvb2+IRCIIhUKUlpZCoVBAJpMhPT2de2VmZmoNaSsUCjF+/HisWLGCNw5+ffD333/ju+++Q0JCAhhjSElJgUQigUQigUwmg0AgQFZWVr1sg5GTk4N27doBAHx8fJCdnW2VNTmEmMRy4x0RUj1Wr17NG+1v6tSprLy8XGs/lUrFNm3axJydnXn7CwQCJpVKWVJSEisrKzOrDGVlZSwpKYlJpVJuul71y9nZmcXGxvJG+KuLiouL2fbt29nQoUO1zmHjxo2MMcZWrVrFrVuwYIGFS2yeyMhI7hyio6MtXRxC6gQKBki9pVKp2Mcff8y7ab3//vs6b7oymYwFBQXx9hWLxWzBggUsJyenWsuVnZ3NFixYwMRiMe94QUFBTCaTVeux1M6ePcvmzJnD0tLSzEo7e/Zs5ubmpjWMsp2dHXvttdfYkydPGGOM5efnM6FQyH1+hYWF1X0qNUoul3P/L0KhkOXn51u6SITUCRQMkHpJqVSyOXPm8G5cy5cv1xkIxMfHa9UGhIeH1/iNTC6Xs/DwcK1agoSEhGo9zpkzZ1jjxo0ZAObl5WVU7UZBQQFbv3496969u1YAAIBJJBK2cuVKdvPmTa20YWFhvM+xPpkyZQpX9rCwMEsXh5A6g4IBUu+UlZWxyZMn825e//3vf3Xuu2bNGt5+Xl5eLDU1tVbLm5KSwjw9PXnlWLt2bbXkfe3aNebu7s7LW9/kS0qlkh08eJC98cYbzNHRUSsAaNiwIQsLC2NHjx7lTQ5UmUwm4wVXKSkp1XIuNW3Pnj28oCwvL8/SRSKkzqBggNQrCoWCvfrqq7xq7O+++07nvsuWLePd7CZPnmyxam25XM4mTZqkVZPxLG7fvs3atGmjdVN/5ZVXePvJZDK2dOlS5uPjo7MWIDAwkMXExJj02WzatIlL7+npWecfF8jlcl5AFhsba+kiEVKnUDBA6o2nT5+yYcOGcV/oQqGQ7d69W+e+lWsEli5davEGfCqVikVFRVVLDUFBQQHr3Lmzzpu7g4MDk8lkbOfOnSw4OFirMSAA1rRpUzZv3jx2/vx5s89Fsw3G5MmTLf756qNSqXiBWHBwcJ0tKyGWQsEAqRfkcjl78cUXuS90Jycntn//fp37xsfH8258q1evruXSGla594OpbQiKiopY3759dQYCmlX+ldcJBAIWEhLCfvzxR6ZQKJ75PCo/LoiKinrmPGvCkiVL6PEAIVWgYIDUeffu3WPdunXjvtCbNGnCjh8/rnPf+nqDMraXQVlZGXv55ZcNBgKVX23btmXLly+vkZugtQdehNgKCgZInSaTyVj79u25L/PmzZuzjIwMnfuqVCreYwRrq7pWqVS81vBVvYKCgtjhw4cNNgasDmvXruUdNyoqyuKfu0ql4gVcANi6dessWiZC6jIKBkidde3aNda6dWvuy7x169bs2rVrevfXbNTm5eVldY3aFi5caFKNQERERC2dCWPLly/nHXvSpElMLpfX2vE11URjTUKsHQUDpE7KzMxkzZs3577Mn3vuOYNV6fW1u1tKSopRjwveeecdkwIBAKxx48bcYEG1oXKjTU9Pz1r/f6jJbpyEWDMKBkidc/z4cebq6sp9mXft2pXdu3fPYJr6MBBOcXExc3BwYADYihUruPVVDYSTmZlpciCgfm3evLk2T1HvAE81XUsgl8u1HqG4uLhQGwFCjETBAKlTDhw4wJycnLgv9D59+rCCggKDae7fv8/s7e15NwJvb2+jjpecnKx1A71161Z1nIqWM2fOcMdITk7m1lc1RG5ubq7O7oHGvAYNGlQj52KIvqGfIyMjWXZ2drUeKzs7m0VGRmoN/RwcHEy9BggxAQUDpM74+eefuXHvAbChQ4caVc2tOXmO+iUQCKpMW15ezjp16sRL5+7uXl2noyUuLk5vwFHV5Dnnz59n0dHRbM2aNeyDDz5gYWFhbOjQoaxz586sadOmeoOBgQMH1tj5GKJSqVhsbKzOSaFCQkJYYmLiM00KlZiYyEJCQrTO18XFhcXFxVm8ASMh9Q1NYUzqhG3btiE8PBxKpRIA8Morr2D79u0QiUQG0ymVSm5aXQBo2LAhiouLAQCnTp1Cz5499abdtGkTZsyYwU1NDABDhw7FgQMHquOUtMyZMwfr16+Hu7s78vPzeduedVrd0tJS3L9/H3fv3sXdu3dx7949KBQKjB07Fl5eXtV6HqbIy8vD4sWLsXPnTp3TRXfr1k3ndNGOjo4oKSmBQqFAXl4e0tPTkZaWhvT0dJw7d07vdNErV65E69ata/MUCbEOlo5GCPnqq694v+7CwsKM/tWYlJTES/vKK69wjxm2bNmiN92TJ09Yy5YtGQD22muvcekjIyOr67S0qAcKGjp0qM7tmr90NR8jWIP8/HwWHR2tc/jkZ3n5+Piw6Ohomn2QkGdkV/PhBiG6McawcuVKzJkzh1s3e/ZsfPfdd3BwcDAqj4SEBN777t2744UXXgAAXL58WW+6L774Avfu3YNYLMaIESO49X5+fiacgfEYYzh//rzBY8yaNYtbjo+Pr5FyWIq7uzsWLlyInJwcJCcnIzQ0FBKJxKy8JBIJQkNDkZycjOzsbCxcuBDu7u7VXGJCbItx37iEVDPGGD744AOsXr2aW7do0SIsX74cAoHA6HxOnz7Ne+/n5weZTIYzZ87g0qVLOtPcuXMHX375JQDg448/xt9//81t6969u95jXb16FbGxsTh06BD+/vtvFBcXo1WrVhgyZAgWLFiA559/Xm/aGzdu4PHjx1wZdenSpQsEAgEYY9i5cyeGDh2KiIgIvXnWR/b29hgxYgQXgBUWFuLIkSOYNWsW7t27B6Ciyr9Tp05o0qQJRCIRxGIxunfvjoCAAPj7+8PV1dXgMRhjWLFiBZo2bYq3337bpL8nQmyWResliE0qLy9n06ZN41X3fv755ybnU1BQoFVtLJPJ2Lp16wz2KIiIiGAAmEQiYaWlpWz06NEMqBjPv7y8XGv/kpISNmfOHGZnZ6e3urphw4bs119/1VvW3bt3c/tevHhRa/vhw4e1piK21KA9lvDgwQPWpUsX7tw9PT3Z9evXzcrrk08+4fLp27cvu3//fjWXlhDrQ8EAqVWlpaVs/PjxvNblGzduNCuvgwcP8m6ebm5ujLGKG6s678o9Ci5cuMB1Q/zxxx8ZY4x7jh0YGKh1jPLycjZixAjuGCNGjGDbtm1jJ06cYAcOHGBLlixhLi4uDKiYPEnfoEHqG5RIJNIKOFavXs2VSd2OAQA7dOiQWZ9LfZWfn68VEGRlZZmcz/Tp03l/F82aNWO7du2qgRITYj0oGCC1pqioiHdjdXBwYNu3bzc7v88++0xnN7qHDx9y606dOsVLExwczICK8QsYq+jjr9532rRpWseYN28eAypG8ztw4IDOcqSnpzNHR0cGgC1cuFDnPqNGjWIAWI8ePbh1T58+ZePGjeOOP336dN6QyubUltR31REQxMTE6Ky9GT9+PHvw4EENlZyQ+o0aEJJa8fjxY0ilUuzZswdARbeyX3/9FaGhoWbnmZmZyXuvfhbftGlTeHh4AACv3cCBAwewb98+AODaKmjmUflZflpaGv7zn/8AAH777TcMHTpUZzn8/f0xcOBAAMCJEyd07nPu3DneMbKystCrVy/s2rULQqEQmzZtwsaNG9GrVy8uTUZGhs68rJm7uzsOHTqELl26AABu376NgQMHIjs72+g8mjRponP9zp078cILL+DXX3+tjqISYlUoGCDPrLi4GDdu3NC7/eHDhxgyZAh+//13AEDjxo2RmprKa8VvjkePHvHed+vWjVvu2rUrgP/1KFCpVFiwYAEAYOzYsXjxxRcB8IOByo0HP/zwQzDG8Nprr2Hw4MEGy+Lt7Q2gokFcZYWFhdw4CH5+fkhMTERgYCAuXboEDw8PHD16FNOmTePlAwAFBQUGj2mt1AFB586dAVQEBIMGDTI6IHB2dta7LT8/H6+++iomTpxos58vITpZumqC1G8KhYJ17tyZAWDvvfee1shvt27d4o3yJxaL2enTp6vl2P379+dVA2tObbxgwQIGgEmlUsYYY99++y0DwBo0aMCrdp48eTIDwOzs7NjTp0+59bdv3zar33u/fv20ynnkyBFuu1Qq5YYW7tOnD7tz5w5v3+LiYm7fAQMGVMvnVF/l5+dzf1tAxUyUxgxn/Pvvvxv1f+Xh4WF14zkQYi6qGSDPJDk5GRcvXgQArF27Fp988gm3LTc3F/369eN+nXt4eOCPP/5AYGBgtRxbc0S7Bg0aoFOnTtx7dTXzpUuXUFxcjMWLFwOo6MuvHukP+F/NQLt27dCoUSNuvfpxhql09Z1XPyIAgNTUVDDGMGzYMBw9epR7nKHm6OjILZeUlJhVBmtRuYbg1q1bGDhwIHJycgymM1QzoOnu3bsYOXIkwsPDtUY0JMTW0DgD5Jls27aN937FihVo0qQJpFIphg0bhrt37wIA2rZti4MHD8LX17faji0UCrnlDh068N6rHxPcvHkTS5cuxe3bt+Hq6oqPP/6Y26e0tJQLVCq3F1AHOK1bt0ZKSorRZdI1+I064Gjbti3EYjHS09Nx4sQJXLlyhfdoA+AHAJqBga1q3rw5Dh06hMGDB+PSpUtcQHD06FG9gxYZGwyoffvtt2jfvj3+7//+rzqKTEj9ZOmqCVJ/5efnc1PyVn5pzjzYqVOnGpkJcMiQIdwxQkNDedtKSkpYgwYNuEcA0NE6PyMjg0v/6aef8rapuz/q6m5oKj8/PwaAjRs3jt26dYt5eHhw4yBUnppZs3dDcHDwMx/bWty/f5+98MIL3GfTunVrvY8M7t+/b/Ljnfj4+Fo+I0LqFnpMQMy2fft2lJeX69xWVFQEAOjRowd+//13eHp6Vvvx7ez+9+dbeXIaoVDIjQioUqnQpk0bvPvuu7x9DDUeVE92VLmRoqnKysq42odu3brB09MTv/32G0QiEfLy8vDKK6/wagPy8vK4ZbFY/EzHtibNmzfH4cOHuaGmb968iUGDBiE3N1drX1NqBtq1a4dff/0VEyZMqLayElIfUTBAzFb5EUFlAoEAH3zwAZo1a1Yjx2/cuLHB7f7+/nB0dISjoyNWrVqlVe1uqFuhOnjJzc1FVlaW2WW8cuUK17ZB/UggMDAQW7ZsAQD89ddfvCGH09PTuWVDQyPbInVAoG4bcvPmTQwcOFArIBCJRFXO+Ojq6oo1a9bg0qVLGD16dI2VmZD6goIBYpZLly7xbly6MMYwadIkrkthdSsrK+OWdXUT27p1KxQKBRQKBd544w2t7epgoEWLFmjZsiVvm+aYAjNnzjTYwOzp06fYsGGDzm2aAYdm+4A33ngDixYtAlAx2dLKlSsBVIxtoBYQEKD3mPo8fvwYR44cwRdffIHx48dj8ODBOHz4sMn51FXNmzfHkSNHDAYEAoGgytqBGTNm4L333uO1MyHEpln6OQWpnz744AOjn8c2bty42roTagoICOCO0bt3b5PTu7q66n02X15ezrp168bl36FDB7Z+/Xp28uRJdvbsWXbkyBG2YcMGNmHCBNa4cWPWt29fnceYP38+16WyMpVKxV599VUGVAydvHv3btarVy/umFXNTfD06VP2559/snXr1rEJEyaw559/Xufnrx6Z0Zrcu3eP12XV29ub5eTkcNtbt26t9TkMGDCAaz/i5OTEbt++bcEzIKRuod4E9ZhcLsfZs2eRnp6OzMxMPHr0CAqFAqWlpRAKhRCJRGjatCn8/Py4Gd/c3Nye+bhKpdKkKXafPn2K4cOHIzc31+SW3vqoVCpcuXKFe5+ZmYny8nKjpz7++++/uQGCdM0iaG9vj8TERIwYMQIXL17E1atXMXv2bL356esuqa4ZqNxrAKj4Bfv999+jb9++yMzMRFhYGNcGQyKRaM3Od+XKFWzatAn5+fm4cOECLl26BJVKVeW5tmnTpsp96psWLVrg8OHDGDx4MC5fvoy8vDwMGjQIR48eRdu2beHt7Y2bN28CADp37ow1a9Zg2LBhmDNnDtavX4+ioiJ8/vnnWLduncHjWOoaI6TWWToaIcYrLy9nSUlJLDQ0lPn6+po1KI6vry8LDQ1lSUlJOmfoM8b+/fvNOvb58+er7bO4cuWKVv5JSUlGp//ll1+4dIbmR1AoFGzjxo0sODiYtWjRgjVo0IA5OjqyVq1asQEDBrAPP/yQHT9+XG/6pk2bMgBs3rx5eveRyWSsRYsWvHOp3DuiuLiYm8zI1Jc1t5S/d+8e69ixI6+GIDc3l50+fZpNmDCBxcbGsrKyMm7/hw8fMrFYzACwN998Uyu/unKNEVLbKBioB/Lz89mqVau42fWq69WmTRu2atUqlp+fb1J53nzzTZOO07lzZ7Z+/Xqt0QmrQ1JSEncc9WiD9VVISAh3LpVHxnv69Ck3cqGpr8rdF62NvoBAn2vXrrHVq1ezu3fvcuvq2jVGSG2jYKAOk8lkbOLEiUwoFGp9yYhEIta7d2/2zjvvsG+//ZadP3+eFRYWMoVCwVQqFVMoFKywsJCdO3eObdmyhb3zzjusd+/eTCQSaeUlFApZWFiY3ul3Nf3zzz9V/kIVCoUsODiYffXVV+zGjRvV+pmoVCr2119/sZiYGHb37l1WXl7OfYELBAKjhquti7Kzs7nPz8fHR+cvyq1bt+r8WzD06tixowXOpvbdvXvXpIBArS5eY4RYAgUDdZBKpWKbNm1izs7OvC8UgUDApFIpS0pK4lV9mqKsrIwlJSXxxshXv5ydnVlsbKzBX/ArV67UedNp3rw5mzJlCvv555/Z48eP9aY/ffq0WY8LHj9+zGJiYrgBfACwkJAQxhhjq1at4tYtWLDA5LzrgsjISO4coqOj9e537tw51qpVK5MCgk6dOrG5c+eypKQkg/839V3lgKBNmzZ6g9G6fI0RYgkUDNQxMpmMBQUF8b5AxGIxW7BgAa+1dHXIzs5mCxYs4J6hql9BQUF6f8EcPHiQ269t27Zs8eLF7K+//mJKpbLK433xxRcMAHNwcGBnzpwxqoyZmZls5syZrHHjxlo3ualTpzLGKqp41b/sxGIxKywsNP5DqAPkcjn3fyAUCqusUpbJZLyW9Ka8HBwcWL9+/djSpUvZiRMnzL7h1VV3795lHTp04M73hRde0Lrx1vVrjBBLoGCgDomPj9f6pRIeHl7jNze5XM7Cw8O1fsEkJCTo3F8mkxlVBatp+/btvPwnTJigd9+ioiL23Xffsd69e+u8ofXs2ZNt2bKFlZaWcmnCwsJ4n1l9MmXKFK7sYWFhRqUpKChg/fr1M3jjt7e3Zz179jT4WMfFxYWNHj2arV+/nl27ds0qfrFqBgQikYg9efKE21ZfrjFCahsFA3XEmjVreF8UXl5eLDU1tVbLkJKSwjw9PXnlWLt27TPne/ToUa1nskKhkD148IC335UrV9i8efOYm5ub1k2rUaNGbPr06Sw9PV3nMWQyGe9LPiUl5ZnLXRv27NnDuznk5eUZnba4uJi99tprem/06vEFCgsL2S+//MJmzZrF2rdvbzCA8Pb2ZuHh4Wz79u31utHbgwcP2IoVK9i+ffu4ddZ8jRHyrCgYqAOWLVvG+3KYPHmyxaq65XI5mzRpEq88y5cvNzu/S5cucYP7VH598cUXrKSkhO3YsYMNHDhQ5z5dunRh33zzDfvnn3+qPNamTZu4dJ6ennX+cYFcLufdGGJjY03OQ6lUsrlz5+r87FauXKkzjUwmY3FxcSw0NJQ1a9bMYHDg5+fHFixYwPbv38+Kioqe9ZQtxpqvMUKqAwUDFlb518rSpUstXlWrUqlYVFTUM/96uXPnDvP29tZ7o3Fzc2Pu7u5a6x0dHdmkSZPYiRMnTPosVCoV71nw5MmTLf5Z6qNSqXg3hODg4Gcq65dffqn1OZ46darKdEqlkp09e5Z9/vnnbNiwYTpbwmv+vwwZMoRFR0eztLQ0o9qJ1AXWfI0RUl0oGLCg+Ph43pfB6tWrLV0kntWrV/PKZ8rzzcePH7Pu3bsb/NVZ+dW+fXu2Zs0a9vDhQ7PLXPlxQVRUlNl51aQlS5aY/XhAn+3bt3PTNrdo0cKsAW+Ki4vZwYMH2cKFC5m/v7/BsQ2aNm3Kxo0bx2JjY6u9C2l1seZrjJDqRMGAhdTXm5YxLaBLS0t5A+gYegkEAvb666+zw4cPV9uvNVu+AZw8eZJNmzaN/f7779WS34MHD9jOnTvZ1KlTqxyQp127duztt99mu3fvrnJehdpgzdcYIdWNggELUKlUbNiwYVZZna1SqVhERITRtQH29vY1MmHM2rVreceJioqy+GesUql4X/wA2Lp16yxaJlOoVCp2/fp19s0337BXX32VNWnSRO//q52dHevVqxdbtGgRO3r0KCspKan1slrrNUZITaBgwAI0G7p5eXlZVUM3U2YzVL9qqvHU8uXLeceZNGmSxX6xWmOjsbKyMvbXX3+x5cuXs/79+3OPKHS9nJycmFQqZWvWrGEXLlyo8ZudNV9jhNQECgZqWX3tApeSklJlVabmSICmvFq3bl1jE7pUbjzm6elZ65+5rXQne/LkCduzZw+bN28e69y5s8H/85YtW7KJEyeyrVu3VnvNkDVfY4TUFAoGalldGRynuLiYOTg4MABsxYoVRqWpanCcwMBAs4IBAGzPnj3VfYocfQPN1HQtgVwu531mQMUgP7bSSOzOnTts27ZtbNKkSczDw8Pg/391DplcV64xc5gzABUh1YGCgVp0//59vcPmbtiwweQb6JYtW8wuy5kzZ7h8Ks+Qp09Vw+ampaUxiUTCWrZsyTw9PVmjRo2MPpevv/7a7HMxhr4haCMjI6t9cqPs7GwWGRmpNQRtcHBwtfQaqI9UKhW7ePEiW7duHRsxYoTBv41nGTJZ8xpzcnLSewxHR0fWtm1bFhYWpndobM1rcseOHQaPu3//fm48DTs7O/bFF1/o3Tc7O5t98cUXbMiQIey5555jLi4u3LTYQ4YMYQ0bNtR7jRFSUygYqEWGJtSZMWOGycHAxYsXzS5LXFwcl8+tW7eMTmfshDpqRUVF7ObNmywjI4MdPHiQ7dixg61fv55FRUWx2bNns9DQUPbuu++yp0+fmn0uxlKpVCw2Nlbn5DQhISEsMTHxmSanSUxM1NmLwsXFhcXFxVGjMA0lJSXs999/Zx9//DHr3bs3s7Oz0/t3bsqQyZrXWLdu3Yy6juzt7dnGjRu18tK8Jq9evar3mP/973+5IZ+dnZ1ZUlKSzv1u377Nxo4da9I1vnTpUtM/XELMIGCMMZAap1QqIZFIIJPJIBAIkJWVBYlEwm3v3bs3Tp06hebNm+PQoUNG5dmpUyfY2dmZVZ45c+Zg/fr1cHd3R35+vtHpcnJy0K5dOwCAj48PsrOzYW9vb1YZLCUvLw+LFy/Gzp07UVpaytsmEonQrVs3BAQEoEePHggICIC3tzdEIhEcHR1RUlIChUKBvLw8pKenIy0tDenp6Th37hwUCgUvL6FQiPHjx2PlypVo3bp1bZ5ivVNYWIijR4/iwIEDOHDgALKysvTu27p1awwbNgzDhg3DqFGj4OTkBED7GuvatSvOnTsHV1dXHDt2jEuvVCpx48YNxMTEYN++fQAABwcHXL16Vec12ahRIzx+/FjrWisvL8fs2bOxceNGABXXQ1JSEjp37qxV5hMnTmDUqFF49OgRAKBNmzYICwvDiy++iBYtWuDp06fIzc1FUlISkpKSUFZWBgBo1aoV8vLy6t01RuohS0cjtiIpKYmL9qVSKW+bUqnkqjSHDh1aK+Xp27ev2cfT/PVr7COGuig/P59FR0dX2X/e1JePjw+Ljo6mKt5n8Pfff7O4uDg2fvx4g0MmBwYGcmk0r7GQkBDumhowYIDe42j+LWu2ndG8Jvv06aOV7tGjR2zQoEFc2r59++r9/z59+jT3WMTe3p4tW7bMYFfLq1ev8h4x1edrjNQfFAzUktDQUO7irlyNeOXKFW7be++9V+NlUalUzMXFhQFgkZGRJqdPTEzkyhsaGloDJaxd5eXlLDk5mYWGhjKJRGJWACCRSFhoaChLTk6usZ4Rtko9ZPJnn33Ghg4dyhwdHbnP3c3Njfu8Na+xb775hlueO3eu3rx//PFHbr+JEydy6zWvybfffpuX5sqVK6xdu3bc9rfeekvvzb2wsJB5eXkxoKItwc6dO406519++cWqrjFS9zmYVZ1ATHb69GkAFdXQISEhvG2ZmZnccpcuXczK/+rVq+jYsSMA4IcffkBoaCh++OEHbN26FefOncODBw/Qv39/HD16FDdu3MDjx48BAH5+fjrzu3XrFsaOHYvTp0/D0dERX3/9NSIiIgAAUqkUIpEICoUCZ86cMau8dYm9vT1GjBiBESNGAKiosj579izS09ORkZGBgoICKBQKlJSUwNHRESKRCGKxGN27d0dAQAD8/f3h6upq2ZOwYnZ2dujevTu6d++ODz74AMXFxTh+/DjOnTuHAQMGcFXomteYi4sLl17f3zhQUQ2vplQquWXNa7J79+7c8r59+zB+/Hj8888/sLOzQ3R0NBYsWKA3/zlz5uDWrVsAgCVLlmDcuHFGnfPIkSOt6hoj9YCloxFbUFBQwEX5vXv31tq+cOFCbru+ls1V2bFjB5fH4cOHdc51P2fOHMYYY7t37+bW6WqEePjwYW4CoVatWrG//vpLa59evXpxedSFoWeJbat8jWleUxkZGXrT7dq1i9tv/vz53HrN9KdPn2aMMfaf//zHqIaCapo9djp37mxy41S6xkhtMq/1GTHJ2bNnueWAgACt7epfIXZ2dujUqZNZxzh37hy3PGfOHPz555948803kZiYiLS0NPzyyy8IDQ3l7SsSidChQwdePl9++SWGDRuGBw8e4MUXX0R6ejp69eqldTzN89A8P0IsofI1pr6mGjRoYPCaSk5O5pb79+/PLavTOzg4oEOHDpgxYwbmzp0LpVIJHx8fHD9+HCNHjjRYpi+++IJb/uSTT+DgYFpFLF1jpDbRY4JakJ6ezi336NFDa7v6i8fDwwO5ublV5ufh4YGmTZvy1mkGAzk5OUhMTOR9WWl+saiP17lzZ66K9d9//0V4eDh27doFAJg+fTq++uorCIVCnWXQPI/09HQMHjy4ynITUlMqX2M//fQTgIoeN/r+hg8fPowffvgBAODt7Y3g4GBum/oaadGiBUaNGoWjR48CAF566SX88ssvcHd3N1ieR48eYffu3QAqHkWMHTvW5HOia4zUJgoGaoHm88fKNQP37t3D/fv3AQC3b982qs3ATz/9pPXlonmMr7/+2uCvFnXgoH6WmpWVhVdffRWXLl2CUCjE+vXrMW3aNINl0DyPjIyMKstMSE3S/Ptv06YNd01Vbi+gUCiQlZWF7du348svv0R5eTkcHBwQExMDkUgEQPuavH37NgBg8uTJ2LRpk97gQtPhw4e5NghjxowxqwswXWOkNlEwUAvUfYuBil8gmjS/xIwVGBjIe//w4UPcuXOH2xYeHq43bWFhIWQyGYCKL8rExERMmjQJ//zzDzw8PLB792706dOnyjJonkdBQYHJ50BIddK8xjT/Hrdu3YqtW7fqTefm5obNmzdDKpVy6zSvSaFQyI1F0bdvX6MCAQD4/fffueV+/foZlaYyusZIbaI2A7VAczAa9a8PNc0vngMHDoBVdPc0+KocUGg+Ipg5c6bBsmgeb8+ePXjllVfwzz//oE+fPkhPTzcqEKh8HpUH2yGktmn+DV65csXgvvb29vDz88OyZctw9epVvPrqq7ztmtdITEwM90hg9uzZOHXqlFHlUQfcAHQOQmQMusZIbaKagVqgOcpd5V8Wml88Xbt2NSt/zWBA87lnVfumpqYCAIYNG4bk5GSjf/UAgKOjI7dcUlJidDpCaoLmNXbx4kUAFTf9tLQ0ruGenZ0dnJ2d4e7urhWUa9K8JkeOHIm2bdti2LBhKCkpwZgxY5Ceno6WLVsaLI/mqJ5VtS/Qh64xUpuoZqAWaN5kKw9/q/7iadmyJZo3b25W/uo8PD094enpadS+bdu25Z5JnjhxospfU5VpfjlpfmkRYgma15j6+fpzzz0HPz8/dO7cGZ07d0anTp3QunVrg4EAwG/Q6+7ujoEDB+Kzzz4DANy5cwdjx47Vuo4rYxqjvJs7lDBdY6Q2UTBQC/RV9xUVFXFjsJtbKwD879e+5uAo+qi/6AIDA/Hbb7/Bw8MD//77L0aNGsU1mjKGoUcfhNQ2zb/B7OxsAOZdU5rXpGbjw/nz53Ndc0+cOIE5c+YYzEezNuDevXsmlwOga4zULgoGaoFmN8C8vDxu+fz581CpVACAbt26mZV3aWkp96ve0EhrAFBWVobLly9zx/P09MRvv/0GkUiEvLw8vPLKK0ZXR2qeh1gsNqvshFQXzWtMfU2ZEwxoXpOVr6e4uDiut8+mTZuwadMmvflodgvUnCTJFHSNkdpEwUAt0PxS0ewPXR3tBa5cucLNcFZVzcCVK1e46k118BEYGIgtW7YAAP766y9uyOGqaJ6HMTUShNQkXYGwOdeU5jVZOc9GjRrhl19+4YaenjNnDk6ePKkzn9GjR3PL69ev567RqpSUlHDDD9M1RmoTBQO1QLO/cFpaGres+cVjbs2AvjHUq9pX83hvvPEGFi1aBABISEjAypUrqzyu5nnoGlWRkNqk62/QnHk+qromJRIJ4uPjIRAIUFpairFjx3LdejX5+/vj5ZdfBlDRoDEiIsJgOwOlUokff/wRXbt25UYbpGuM1CbqTVAL/P39uWVdNQN2dnYoLy/nWkEbIpFI0LBhQ+69ur1AkyZN0LZtW4Np1fuKxWJ4eXnxti1fvhyXL1/GL7/8go8//hgdO3bEmDFj9OaleR6a50eIJVT+G3RxcYGPj4/J+aivyUaNGuG5557Tuc+IESMQFRWFJUuW4O7duxg7dix+//13rd44mzdvRmBgIGQyGb7//nscP34cU6dORa9evSAWi/HkyRPcunULx44dQ3JyMm7evAngfzd+usZIbRIwzWavpMZIJBLk5uZCJBLhyZMnXDenoqIik/K5c+cOPDw8uPdDhgzB4cOHMWDAAG7IVH3U+w4aNAiHDx/W2v7vv/+ib9++yMzMhJOTE/7880+dtQ3l5eVwdnaGQqGARCLhGmwRYkm+vr64ceMGAODFF1/E8ePHTUqvUqm4a7J37956HwEAFb0FRo8ejaSkJADA1KlTERsbq7XfvXv3MGHCBJ3Xmy6BgYE4duwY7O3t68w1JpfLuVk8MzMz8ejRIygUCpSWlkIoFEIkEqFp06bw8/PjZvF0c3OzWHmJeahmoJb07NkTubm5UCgU2Lt3L9q1a2dyINCqVSteIABoDy1siHpffY8kGjVqhN9++w09e/bE/fv3MWrUKJw+fVrrmKmpqVxL58qjIRJiKR07duSCgSZNmpic/vr169w1WdX1JBAI8P333yMwMBBZWVmIi4uDv78/3n77bd5+LVu2xKFDh3DkyBFs374dx48fx+3bt/H06VM4OTnBw8MDnTp1Qr9+/TB8+HBu4rCkpCSLXWNKpRKpqalISEjA6dOnjZovBQC2b9/OLfv6+qJnz56YMGECpFKp2d0rSS2yyFyJNigpKYmbjlQqlVq6OM8kJCSEO5fk5GRLF4cQxhhdY88qPz+frVq1irVp00Zr+vNnebVp04atWrWK5efn18p5EPPQY4JaolQqIZFIIJPJIBAIkJWVBYlEYulimSwnJwft2rUDAPj4+CA7O5uiflIn0DVmnry8PCxatAi7du3SauQoEom46v8ePXogICAA3t7eEIlE3LwNCoUCMpkM6enp3CszM1NrCGWhUIjx48djxYoVWkOqkzrA0tGILVm1ahUXLS9YsMDSxTFLZGQkdw7R0dGWLg4hPHSNGU+lUrFNmzYxZ2dn3i95gUDApFIpS0pKYmVlZWblXVZWxpKSkphUKmUCgYCXv7OzM4uNjWUqlaqaz4g8C6oZqEUPHjyAl5cXSktLIRaLkZuba9azTUspLCyERCJBQUEBhEIhbt26Zfa464TUBLrGjJOXl4dp06Zh//793DqxWIyIiAjMnDkTvr6+1XasnJwcbNy4EZs3b+bNvhgUFITY2FiqJagrLB2N2JqwsDAuQg4PD7d0cUwyZcoUruxhYWGWLg4hOtE1Zlh8fLxWbUB4eDgrLCyskeOpyeVyFh4erlVLkJCQUKPHJcahYKCWyWQy3oWYkpJi6SIZZc+ePbwLOC8vz9JFIkQna73GlEolKy0tfabq9TVr1vBuxl5eXiw1NfVZi26SlJQU5unpySvH2rVra7UMRBsFAxawadMm7iLw9PSs8Yj8Wcnlct7FGxsba+kiEWKQtV1jW7ZsYXZ2dgwAs7OzYw0bNmSurq6sZcuWrE2bNuz5559nXbt2ZYGBgaxfv35s6NChbOTIkWz27NnswYMHjDHGli1bxrsBT5482WKfi1wuZ5MmTeKVZ/ny5RYpC6lAwYAFqFQqFhQUxLso62pjGpVKxbtog4OD62xZCVGztmts8ODBZnfti4qK0qoRWLp0qcU/D5VKxaKioqiGoI6gYMBCKldlRkVFWbpIOi1ZsoQeD5B6yZqusTNnznA1A6a+3nnnHd771atXW+As9Vu9ejWvfNSGwDIoGLCg+Ph4ukgJqUHWdI1t3LjR5ECgffv29TIgkslkli6SzaFgwMLWrl2rVaVXF6rvNC9OAGzdunUWLRMh5rKWa0ylUrHRo0ebFAx0797dah6VkJpFwUAdsHz5ct4FPGnSJCaXyy1SFmrYQ6yRtVxj+fn5rGXLlkYFAu3ateOWvby86n0jSlKzKBioIyo38PH09Kz1LlHU5YdYM2u5xlJTU40KBpycnLjl+tK9MiUlhR4XWAgFA3WIvsFAavoXjFwu5w12AoC5uLhQGwFidazlGpszZ47BQKB169a88zNHcXExc3BwqPXaQRrczDIoGKhjZDIZr0sUACYWi1lkZCTLzs6u1mNlZ2ezyMhIJhaLeccLDg6mXgPEalnDNVZUVMQ6deqkMxAQCASsQYMGBoMFR0dH1rZtWxYWFsbOnDmj8xhnzpzh9k9KSjK7rKaSy+Xc5yUUCmm2w1pCwUAdpFKpWGxsrM4JREJCQlhiYuIzTSCSmJjImyJV85dKXFwcNdwh9VZxcTFbv3498/HxYQMHDmRKpVLnftZwjWVkZOi86ffo0cOoxwjql729Pdu4caNW/nFxcdw+N2/efObymoImRKt9NFFRHZaXl4fFixdj586dOqcW7datm86pRR0dHVFSUgKFQoG8vDykp6cjLS0N6enpOHfunN6pRVeuXInWrVvX5ikSUi0uXbqEuLg4bN26FXK5nFufkpICqVSqN119v8ZWr16NBQsWcO8dHR3h7u6OW7ducetcXV1x7Ngx7r1SqcSNGzcQExODffv2AQAcHBxw9epV3pTPc+bMwfr169GsWTM8ePCg2spsDJoq3QIsHY2QquXn57Po6GjWpk0bkyL+ql4+Pj4sOjqaquFIvfT06VO2ZcsW1qdPH71/48b+bdfXa0ypVLJBgwZxxxszZgzvFz8ANmDAAL3pNWsvVqxYwdvWt29fBoANGTKkRspeFc2yJScnW6QMtoSCgXqkvLycJScns9DQUCaRSMz6cpJIJCw0NJQlJyez8vJyS58SISZLS0tjM2fOZC4uLgb/1rt162Zy3vXxGrtz5w4LCQlhY8aMYWPHjtUqz9y5c/Wm/fHHH7n9Jk6cyK1XqVTc5/v+++/X+DnokpiYyJUtNDTUImWwJQ5V1x2QusLe3h4jRozAiBEjAFTMfX727Fmkp6cjIyMDBQUFUCgUKCkpgaOjI0QiEcRiMbp3746AgAD4+/vD1dXVsidBiBmePn2K77//HrGxscjIyDAqzcsvv2zycerjNebh4YHU1FQA4Kr5GzRogLKyMgCAn5+f3rStWrXilpVKJbd848YNPH78GADQrVs3g8fPz89HbGwsDhw4gKtXr6KgoAANGzbE888/j5EjR2L8+PF4/vnntdKpVCr88MMP2LZtGzIyMlBUVITnnnsO4eHheOedd9CvXz9u3wMHDlTxKZBnZulohBBCqhIQEGDyL/Rjx45Zuti1qqCggDv3Vq1accsZGRl60+zatYvbb/78+dz63bt3c+vPnz+vN/3nn3/OGjZsaPD/4aWXXtJKd//+fYOPd0aOHMnrzQDAYoNE2QqqGSCE1Gnl5eXIyckxKY2zszN69epVQyWqm86ePcstOzhUfLU3aNAAnTp10psmOTmZW+7fvz+3fO7cOQAVDRI7duyoM+20adMQFxcHAGjTpg2mTZuGF198Ea6urrh//z6OHj2KrVu3IiAggJfu6dOnGDhwIK5cuQKBQIA33ngDoaGh8PT0RG5uLlatWoXk5GT8+++/Wuc3ePBgYz4KYg5LRyOEEFKVX3/9lTk6OhpdKzB69GhLF7nWffbZZ9z5q5/3G2o3cejQIW5QIW9vb1ZcXMxtGzVqFAPA/P39daZduXIld6wpU6awkpISnfs9ffqUXb16lbduwoQJDABzcHBgv/32m840Xl5eWv+nn3/+uRGfAjGXXW0GHoQQYo7Ro0fjwIEDRj+PDw4OrtkC1UGZmZncsvp5f+X2AgqFAhcuXMBHH30EqVSK8vJyODg4ICYmBiKRiNtPXTOgq73BpUuX8MknnwAARo4cibi4OAiFQp1latSoEa+9wLFjx5CQkAAAiIqKwqhRo3SmmTt3rtZ6Y9uKEPPQYwJCSL3Qr18/HDt2DEOHDsX9+/cN7hsUFFRLpao7Hj16pLVu69at2Lp1q940bm5u2Lx5M28shsLCQshkMgC6Gw9+8MEHUCqVcHZ2xrfffgs7O+N/Uy5btgwA4O3tjYULF+rd74UXXtBaV1BQYPRxiOkoGCCE1Buurq5V3nx8fX15g+fYisoDHeljb2+PLl26YMyYMZgxYwaaN2/O265Zw1C5ZuDevXtcz4VZs2ahWbNmRpfvzp07OHjwIJdW3a5BlyZNmmitM/b8iHkoGCCE1AtyuRxSqRR3794FUFGdXLmRGWCbjwgAaI2gaG9vj7S0NO6ma2dnB2dnZ7i7u/MeCVSmfkQgEAi0agaSk5PB/v+gta+99ppJ5du7dy+3PHz4cIP76qoFKCkpMel4xDQUDBBC6jyFQoHRo0fj4sWLACp+/R86dAhz585FYmIib19bfEQAQOu5/XPPPWdwjAF91DUDPj4+Wr/QL1y4AKCil0LlXgLG5uvo6IguXboY3Ff9/+zk5ISioiIuHak51ICQEFKnKZVKTJgwgRtf393dHfv27YOPjw92796N6dOnc/va29tj0KBBliqqRVX+td+1a1ez8lHftHUFEvfu3QMAtGjRAgKBwKR81Wnd3d2r3Fc9yJBmt0hDtRnk2VEwQAipsxhjePfdd/Hzzz8DqHg0kJKSwk1io24JHx0dDU9PTyxdulTn82Zb0LRpU957c4KBsrIyXL58GYDuYED93F49uqEp1NX86p4O+ly9ehVHjhwBUFE7oSYWi00+JjEeBQOEkDrr008/xTfffAOg4sa/e/du9OjRg7ePQCDAwoULcevWLSxatMgSxawTKt+8zQkGrly5wrU90NWTQD188f3795GXl2dS3uqGio8fP8bNmzd17qNSqTBnzhyuXULDhg25bd27dzfpeMQ0FAwQQuqkLVu2YPHixbz3tto40BiVn+FX9VxeF0M9CQDwHsF8/PHHevMpKyvD9evXeet69+7NLa9atUorjVKpxOzZs7keBwB4DURNbaNATCNg6hCMEELqiOTkZLzyyivc5Dmff/45FixYYOFS1W1yuZyrSre3t0d5ebnJebz//vtYs2YN3NzcdLboLy8vR5cuXXD16lUAFcHB1KlT0b59ewDA33//jT/++AM//vgjPvzwQ7z77rtc2sePH8PHxwdyuRwAMHXqVLz55pto3LgxLl++jPXr1yMtLQ3e3t7Iy8uDQCBAQEAA0tLSuPOjidZqDgUDhBCD5HI5N3NfZmYmHj16BIVCgdLSUgiFQohEIjRt2hR+fn7czH1ubm5mH++vv/7C4MGDUVxcDACYN28e1qxZY3KDNWt18+ZN7N+/H/v378exY8fg6+uL1NRUNGrUCA4ODmCMQSAQoLS01GBffl2GDBmCw4cPY+DAgdxz+8quX78OqVSK3Nxcg3n98ccfvJkHAeDnn3/G+PHjdQYqDg4O+PDDDyGXy7F+/Xq88MILyMnJgUKhgEQiQXZ2tknnQkxkuZGQCSF1UXl5OUtKSmKhoaHM19fX5NkCATBfX18WGhrKkpKSWHl5udHHvnLlChOLxVw+48ePZ0qlsgbPtu578uQJS05OZu+++y7r0KGD3hkar1y5wluXlJRk8rGaNm3KALB58+YZ3O/x48ds9erV7KWXXmJubm7MwcGBtWjRgvn7+7NZs2ax1NRUvf/vJ06cYMOHD2eurq5MJBIxiUTCZsyYwc2O2LVrVwaADR8+nDuX0NBQk8+FmIaCAUIIY4yx/Px8tmrVKtamTRuzAgB9rzZt2rBVq1ax/Px8g8e/ffs279iDBw9mCoWils6+7lAqlSwtLY19+umnbODAgaxBgwZ6P9smTZqwuXPnchMFJSUlcdukUqmFz8R0GRkZXPkDAwO55eTkZEsXzerRYwJCbFxeXh4WLVqEXbt2aY1iJxKJuOr/Hj16ICAgAN7e3hCJRBAKhSgtLYVCoYBMJkN6ejr3yszM1Bo+VigUYvz48VixYgW8vb152/755x/0798f58+fB1DRkv2PP/6Ai4tLzZ58HXHr1i3s378fBw4cwIEDB3TOMwBUtAXo1asXgoKCEBQUhMDAQN6jAKVSCYlEAplMBoFAgKysrHozNLNKpcLQoUNx5MgR+Pr6co8hfHx8kJ2dDXt7ewuX0MpZOhohhFiGSqVimzZtYs7OzrxfmwKBgEmlUpaUlMTKysrMyrusrIwlJSUxqVTKBAIBL39nZ2cWGxvLVCoVt/+sWbO47T4+PuzOnTvVdZp10tOnT9mePXvY3LlzWceOHQ3WrEgkEvb222+zX375hRUWFlaZ96pVq7i0CxYsqIWzMU52drbebcXFxWzSpElcuV999VVuOTo6uhZLabuoZoAQG5SXl4dp06Zh//793DqxWIyIiAjMnDkTvr6+1XasnJwcbNy4EZs3b+a1UA8KCkJsbCy8vb3xxhtvYMeOHWjWrBmOHz/OtU63FiqVCpmZmVzDv+PHj2vVwqi5uLhgyJAhCAoKwrBhw0z+Zf/gwQN4eXmhtLQUYrEYubm5dWIgJn9/fzg6OiI0NBR+fn5o0qQJ5HI5/vrrL2zatAl///03AOCdd97B9u3bUVBQAKFQiFu3bhk1aiF5RpaORgghtSs+Pl6rNiA8PNyoX53PQi6Xs/DwcK1agoSEBPbw4UO2efNmdvv27RotQ226desW+/bbb9kbb7zBmjVrpveXv52dHevTpw9bsmQJO378uNm1MZrCwsJ4/7eWVlZWxhwdHQ3WgDg4OLAVK1awt956i1sXFhZm6aLbDAoGCLEha9as4X0Be3l5sdTU1FotQ0pKCvP09OSVY+3atbVahprw77//stTUVPbee++xF154weCNz8fHh82YMYPt3r2byeXyai+LTCbjBXwpKSnVfgxTlJWVse3bt7M333yTdejQgTVt2pQ5ODgwsVjMevbsyT788EMmk8nYnj17eIFiXl6eRcttSygYIMRGLFu2jHdDmjx5co3XBugjl8t5z4gBsOXLl1ukLOZSKpXs7NmzLDo6mg0ZMoQJhUK9N39nZ2f2yiuvsK+//pplZWXx2kvUlE2bNnHH9/T0tNj/tbHkcjkvSIyNjbV0kWwKBQOE2IDKNQJLly6tlRuSISqVikVFRdVYDYFKpWLJycksMTGx2vK8ffs2++6779ibb77JmjdvbrDqv3fv3uyTTz5hf/75JystLa22MhhLpVKxoKAgXvBn6f9zfVQqFS84DA4OrrNltVYUDBBi5eLj43k3qtWrV1u6SDyrV6/mlS8hIeGZ8ywrK2PTp09/5mryf//9l+3du5fNnz+fde7cucrxFKZPn85++uknVlBQ8MznUB0qPy6IioqydJF0WrJkCT0esDAKBgixYvX1ZiCTyczO699//2WjRo3i3ainTJliVFqlUskyMzPZ559/zoYOHWqw0Vvjxo3ZqFGj2Pr169n169fr7C9ZWwwGiekoGCDESqlUKjZs2DCbqiZ++PAh69Onj9aN29PTU29+d+7cYdu2bWMTJ05kLVq00HvzFwgErGfPnmzx4sXsjz/+sEjVv7nWrl3LO5eoqCiL/y2oVCpeEAiArVu3zqJlsmUUDBBipTQbkHl5eVl9A7K///5b79j9ANilS5cYY4wVFRWxffv2sffff5916dLFYNW/t7c3mzZtGvvxxx/Zo0ePauK0a83y5ct55zZp0qQa6clgDGtoQGptKBggxArVta5lxkpJSTHrcUFmZibz8PAweGMfNWoUGzZsWJVV/y+//DL76quv2LVr1yz+67k6qFQqbuyCyg1JPT09a/1vw1q7ltZ3FAwQYoXq2qAzppgyZQpXdmMGnTl8+DBzcXExGAgYqvoPDAxkixYtYr///js34Y+1uHnzJvP392fNmjVjGRkZjDH9g07VdC2BXC7n/d8CYC4uLtRGoI6gYIAQK3P//n2uz7tYLNb6Naj5cnR0ZG3btmVhYWHszJkzOvPbsGEDt//27dsNbjcn/8rkcjk3jbFQKDQ42+GOHTsM9u/X9WrdujWLiIhgO3fuZA8fPjTuQ62HCgoKeIMfffXVV9w2mUzG63ao/luJjIw0OIeAObKzs1lkZCRvamp1uxDqNVB3UDBAiJWpPFHNjBkzjLpJ2tvbs40bN2rlp5n+ypUrBrebk78ukZGRXDp9E9V8+OGHJtcEfPfdd1ZR9V+VoqIi1q9fP+68JRKJVuCjUqlYbGyszomqQkJCWGJi4jNNVJWYmMhCQkK0/g9cXFxYXFycTfw/1CcUDBBiRcrLy1mbNm24L/Xs7GzWq1cvBoC5urqyCxcucK/MzEz2yy+/sODgYO6L2sHBQeuXoTq9k5MTUyqVWsd81vx1yc7O5tL4+Piw8vJy3vYPPvjArMcCCxcufLYPuB4oLy/nzfrXvHlzg5+5TCZjYWFhOmtYRCIR69WrF5s1axbbsmULO3fuHJPL5ay4uJipVCpWXFzM5HI5O3fuHNuyZQubNWsW69WrFxOJRFp5CYVCFhYWRrUBdRQFA4RYkaSkJO7LVyqVMqVSyZycnBgANmDAAL3pNH/BrVixgluvmb5Xr15a6Z41f0M00yQnJ/O2DRo0yKxgoHv37kYdu75SqVRs5syZ3Pk2atSIpaWlGZU2Pz+fRUdHc8Fkdb18fHxYdHS0wcc9xPLsQAixGgkJCdzyrFmzcP36dRQVFQEA/Pz89KaLiIjglq9evcotV5X+WfM3ZNasWdxyfHw8b9uOHTswdOhQ+Pr6omHDhkblBwAZGRnIz883ev/6ZuXKlYiJiQEAODg44Oeff0ZAQIBRad3d3bFw4ULk5OQgOTkZoaGhJk+frCaRSBAaGork5GRkZ2dj4cKFNA1xHedg6QIQQqrP6dOnAQAikQghISH46aefuG2GbtatWrXilpVKJbecmZlpMH1V26vK3xCpVAqRSASFQoEzZ87wtjVv3hwHDhzg8rt+/TrS09O5V0ZGBp4+faoz3wsXLmDIkCFGlaE+iYuLw8cff8y9//bbbxEUFGRyPvb29hgxYgRGjBgBACgsLMTZs2e5z7WgoAAKhQIlJSVwdHSESCSCWCxG9+7dERAQAH9/f7i6ulbXaZFaQsEAIVZCLpcjNzcXQMWN2cHBweib9e3bt7llDw8Pbrm6ggF9+Rvi4OCAbt264dSpU8jJyUFhYaHOm4y9vT06duyIjh07YuLEiQAAlUqlFSCcO3cO7dq1Q/fu3Y06fn2SlJSEGTNmcO+/+OIL7rN4Vq6urhg8eDAGDx5cLfmRuomCAUKsxNmzZ7llddWw+mbdoEEDdOrUSW/a5ORkbrl///7csjq9nZ0dunbtqpXuWfOvSkBAAE6dOgWg4vyMvSHZ2dmhQ4cO6NChAyZMmGD08eqjkydPYvz48VCpVACA9957D++//76FS0XqG2ozQIiVSE9P55Z79OgB4H83606dOkEoFOpMd/jwYfzwww8AAG9vbwQHB3Pb1Omfe+45ODk5aaV91vyroj4PgH9+tuTXX3/FmjVrdD72uHr1KkaOHIni4mIAQGhoKFavXg2BQFDbxST1HNUMEGIlNKvsAwICcO/ePdy/fx+AdhW+QqFAVlYWtm/fji+//BLl5eVwcHBATEwMRCIRABhMX9V2Y/I3hmbjt4yMDKPTWYvz589jzJgxYIxh+/bt2LNnD5o3bw4AuHPnDoKDg1FQUAAAGDJkCL777jvY2dFvPGI6CgYIsRKPHj3ilr29vXHy5Enu/datW7F161a9ad3c3LB582ZIpVJunSntBczJ3xje3t7csvqmZ0sSExPBGAMApKWl4cUXX8S+ffvQrFkzSKVS5OXlAaj4//n555/h6OhoyeKSeoyCAUKshEKh4JZFIhHvZq2Lvb09unTpgjFjxmDGjBncL041U4IBc/K/ffs2fvzxR6SkpODq1au4d+8exGIxXnrpJXzwwQfo1asXrxZB8/xsxb59+3jvc3Jy8OKLL8LLywvnz58HALRt2xapqalwcXGxRBGJlaBggBArUVpayi0LhULuZm1vb4+0tDQ4OFRc7nZ2dnB2doa7u7vBKntjgwFz8//qq6/w2WefQSKRICgoCO7u7sjKysKvv/6KX3/9FT/88APGjRvH7V9SUlLVR2BVHj9+zKvdUcvPz+fGSmjWrBn27t2Lli1b1nbxiJWhYIAQK6HZgK+0tJTX+M9Qtz991OlbtGih82bzrPn37NkTR48exYABA3jrjx07hiFDhuDtt99GSEgIt97WqsCPHDlS5ZgMc+bMQfv27WupRMSaUUsTQqyE5q/wgoICZGVlAYDOLoFVKSoq4tLrutFrbjcnfwAYM2aMViAAAP369cOgQYMgl8t53SVNaXhoDSo/ItBlyZIl+PLLL2uhNMTaUTBAiJVo2rQpt3zo0CGu37k5N+vz589z6XUFA5rbzQ0GDGnQoAEA4MGDB9w6sVhc7cepy/bv32/UfpGRkZg/fz73/0GIOSgYIMRKaN601UP1AubdrE1pPFjdwUBeXh4OHjwIDw8PPHnyhFtvjSMH6pOTk4OcnByj91+7di1WrFhRgyUi1o6CAUKshGaffM0Berp06WJyXqYEA+bkr09ZWRnCwsJQUlKCzz77TOeoirbA2FoBTbY6KBOpHhQMEGIl/P39uWWZTAYAcHFxgY+Pj8l5qW/2Tk5OOhuoqbebm78uKpUKb731Fv744w9MmzYNYWFhvBuc5vlZO1OCAXt7e4waNQr//e9/a7BExNpRbwJCrISbmxt8fX2Rm5vLDV1rzq92lUqFCxcucOkrj2hXeXt1UKlUCA8Pxw8//ICJEyciJiYG5eXlOHfuHICKKXEtOROeujFjeno6MjMz8ejRIygUCpSWlkIoFEIkEqFp06bw8/PjZu5zc3Mz61hlZWU4ePBglfu1bdsWERERmDJlCm9WSELMQcEAIVakZ8+e3MyFgHnP869fv46ioiIAuh8RaG6vjvYCKpUKU6ZMwbZt2/DGG29wQ+ru2bOHG2goMDDwmY9jCqVSidTUVCQkJOD06dO8z9SQ7du3c8u+vr7o2bMnJkyYAKlUCnt7e6PyOHLkiN7plxs0aIBXX30V06ZNw+DBg2noYVJ9GCHEaiQlJTEADACTSqWWLk6VlEolmzRpEgPAxo8fz8rLy7ltISEh3LkkJyfXSnny8/PZqlWrWJs2bbhjV8erTZs2bNWqVSw/P7/KMrz22mta6Z9//nm2evVqo9ITYg4BY/9/4GtCSL2nVCohkUggk8kgEAiQlZUFiURi6WLppH40sHXrVrz++uv44YcfuFEMc3Jy0K5dOwCAj48PsrOzjf5lbY68vDwsWrQIu3bt4o3kCFSMb6Cu/u/RowcCAgLg7e0NkUgEoVCI0tJSKBQKyGQypKenc6/MzEytIZSFQiHGjx+PFStW8OZd0PTNN9/gnXfegUAgwKhRoxAZGYmXXnqJZiIkNYqCAUKsTHR0ND788EMAwIIFC/D5559buES6RUVFYenSpWjcuDHmzp3LBQJARQM69VC80dHRWLhwYY2UgTGGuLg4vP/++7xujAKBACEhIZg1axZCQkJ4ZTNWeXk59u7di2+++QZ79+6F5lets7Mz1qxZg4iICJ03+by8PLi4uFi0nQSxLRQMEGJlHjx4AC8vL5SWlkIsFiM3NxdNmjSxdLG0vPXWWwZnOgQqWsrfvXsX7u7u1X78vLw8TJs2jddyXywWIyIiAjNnzoSvr2+1HSsnJwcbN27E5s2bebMvBgUFITY2Vm8tASG1xnJPKAghNSUsLIx73hweHm7p4phkypQpXNnDwsJq5Bjx8fHM2dmZ91w+PDycFRYW1sjx1ORyOQsPD+cd19nZmSUkJNTocQmpCtUMEGKF8vLy0LlzZ67qOyUlBVKp1MKlqlpKSgpGjBgBoKIq/dKlS2jdujW3nTGGsrIyNGjQwOxn6GvXrsX8+fO5915eXoiNjeVNilTTUlNTMW3aNNy+fZtXrnnz5tVaGQjRRMEAIVYqNjYW06dPBwB4enri0qVLdfJxgVphYSE6d+7M3SBjY2MxdepUbvvhw4cRHByM8vJyCAQCODo6QiQSwdHRkbdceV2rVq3w0UcfwcfHB8uXL8cnn3zC5Tl58mT85z//scjnUlhYiLlz52Lbtm3cuuXLl2Px4sW1XhZC6DEBIVZKpVKxoKAgrjp68uTJTKVSWbpYOqlUKq6LIQAWHBysVdaIiAizu/ZFRESwNWvW8NYtXbrU4p+HSqViUVFRvHKtXbvWomUitomCAUKsmEwm4z0bj4qKsnSRdFqyZAnvGXpeXp7WPjdv3mSOjo5mBQOhoaG896tXr7bAWeq3evVqXvmoDQGpbRQMEGLl4uPjreZGmJKSYnIg4O7uXi8DIplMZukiERtCwQAhNmDt2rW8G2RUVFSdqCLXvAECYOvWrasy3ezZs00KBjp27Gg1j0oIqSkUDBBiI5YvX867SU6aNInJ5XKLlEUul/NufADY8uXLjUpbVFTEu8EbejVv3pxb9vLyqvGug89KLpczT09PrsyxsbGWLhKxERQMEGJDKjei8/T0ZCkpKbVahpSUFN4Nz5xGcxkZGaxBgwZVBgMNGzbklmv7PM2l+SiEHheQ2kLBACE2Rt+AOzVdSyCXy3kDCgFgLi4uZjeW+/zzzw0GAk2bNuWdX31SGwMvEaKJggFCbJBMJuN1OwTAxGIxi4yMZNnZ2dV6rOzsbBYZGcnEYjHveMHBwTp7DRhLqVSyQYMG6Q0G1DUHYrFYq0ZE8+Xo6Mjatm3LwsLC2JkzZ3Qea8OGDdz+27dvN7jdnPwrk8vl3OclFApptkJS4ygYIMRGqVQqFhsbq1VLIBAIWEhICEtMTGRlZWVm5V1WVsYSExN50xBr1gbExcVVS+O4vLw85urqqnWM5557jltesGABmzFjhlFtDOzt7dnGjRu1jqOZ/sqVKwa3m5O/LpGRkVy66OjoZ/6sCDGERiAkxMbl5eVh8eLF2Llzp87pe7t166Zz+l5HR0eUlJRAoVAgLy8P6enpSEtLQ3p6Os6dO6d3+t6VK1fyhhh+Vjt37kRoaChvnYeHB+7evctN4zxhwgScOnUKrq6uOHbsGLefUqnEjRs3EBMTg3379gEAHBwccPXqVd7Uz71798apU6fg5OSEJ0+ewM7Ojnc89XZz89eltqdxJjbO0tEIIaRuyM/PZ9HR0axNmzZG/co19uXj48Oio6NrtKpbc2Kmfv36cctSqZQplUrm5OTEALABAwbozUOzFmPFihXces30vXr10kr3rPkbopkmOTnZqDSEmIMf3hJCbJa7uzsWLlyInJwcJCcnIzQ0tMpfr/pIJBKEhoYiOTkZ2dnZWLhwYY1MQ6y2fv16vPbaaxg2bBjEYjG3ftasWbh+/TqKiooAAH5+fnrziIiI4JavXr3KLVeV/lnzN2TWrFnccnx8vFFpCDGHg6ULQAipW+zt7TFixAhu9sDCwkKcPXsW6enpyMjIQEFBARQKBUpKSrjJgMRiMbp3746AgAD4+/vD1dW1Vsvs4uKCH3/8EQC4AEYkEiEkJAQ//fQTt5+hm3WrVq24ZaVSyS1nZmYaTF/V9qryN0QqlUIkEkGhUODMmTNGpSHEHBQMEEIMcnV1xeDBgzF48GBLF6VKcrkcubm5ACpuzA4ODkbfrDWnE/bw8OCWqysY0Je/IQ4ODujWrRtOnTqFnJwcFBYW1nqgRWwDPSYghFiNs2fPcssBAQEA/nezbtCgATp16qQ3bXJyMrfcv39/blmd3s7ODl27dtVK96z5V0V9HgD//AipThQMEEKsRnp6Orfco0cPAP+7WXfq1AlCoVBnusOHD+OHH34AAHh7eyM4OJjbpk7/3HPPwcnJSSvts+ZfFfV5APzzI6Q6UTBACLEamlX2AQEBuHfvHu7fvw9AuwpfoVDgwoUL+OijjyCVSlFeXg4HBwfExMRAJBIBgMH0VW03Jn9jaNYMZGRkGJ2OEFNQmwFCiNV49OgRt+zt7Y2TJ09y77du3YqtW7fqTevm5obNmzdDKpVy60xpL2BO/sbw9vbmlgsKCkxKS4ixKBgghFgNzYGORCIR72ati729Pbp06YIxY8ZgxowZaN68OW+7KcGAOfkrFAp89NFHSEtLQ3Z2NgoKCuDq6gqJRIKpU6di4sSJvFqEygM5EVJdKBgghFgNzREUhUIhd7O2t7dHWloaHBwqvvLs7Ozg7OwMd3d3g1X2xgYD5ub/9OlTbNiwAT179sSIESPg7u4OuVyO1NRUhIeHY8eOHUhJSeH2LykpqeojIMQsFAwQQqyGZgO+0tJSXuM/Q93+9FGnb9GiBVq2bKl3u7n5i8Vi/PPPP1oND8vLyzFs2DDs378fiYmJ3HpHR0eTj0GIMagBISHEamj+Ci8oKEBWVhYA6OwSWJWioiIuva4bveZ2c/IHKmoQdPVAcHBwwKuvvgoAuHbtGrfelIaHhJiCggFCiNVo2rQpt3zo0CGoVCoA5t2sz58/z6XXFQxobjc3GNBHpVJh7969APjnpDnUMiHViR4TEEKshp+fH7Zv3w4AOHDgALfenJu1KY0HnzUYKC0txaeffgrGGB49eoRDhw7h6tWrmDJlCtcOAQC6d+/+TMchRB8KBgghVkOzT77mAD1dunQxOS9TggFz8tdUWlqKpUuXcu8FAgEiIyOxatUqzJ07l1uveX6EVCcKBgghVsPf359blslkAComMfLx8TE5L/XN3snJCe3bt9e73dz8NTVu3BiMMahUKty5cwdJSUn46KOPcPLkSV53Qs3zI6Q6UTBACLEabm5u8PX1RW5uLp4+fQrAvF/tKpUKFy5c4NLb2dkZ3F5d7Ozs4OXlhbfffhvNmjXDuHHjYG9vD6BiNkaapIjUFGpASAixKj179uS9N+d5/vXr11FUVARA9yMCze3V3XhQLSgoCMD/pjsODAyskeMQAgACxhizdCEIIaS6JCcn4+WXXwYASKVS3qA99cmVK1d4syAmJydjxIgRFiwRsWYUDBBCrIpSqYREIoFMJoNAIEBWVhYkEomli6XT5cuX4ePjozUbYlFREaRSKf744w8AgI+PD7Kzs7lHBoRUN3pMQAixKvb29pg5cyYAgDGGjRs3WrhE+u3atQstW7bE8OHDMWvWLPzf//0fwsLC4O3tzQUCADBz5kwKBEiNopoBQojVefDgAby8vFBaWgqxWIzc3Fw0adLE0sXSkpaWhk2bNuHEiRO4ffs2nj59iiZNmqBTp05IT09HUVERhEIhbt26BXd3d0sXl1gxqhkghFgdd3d3jB8/HkDFsMTz58+3cIl069GjBzZt2oSLFy9CLpejrKwMDx8+RLt27bgGiuPHj6dAgNQ4qhkghFilvLw8dO7cGU+ePAEApKSkQCqVWrhUVUtJSeEaCjo7O+PSpUto3bq1hUtFrB3VDBBCrJK3tze+/PJL7v20adPwzz//WLBEVSssLMT06dO592vWrKFAgNQKCgYIIVZr6tSpXH/927dvY+7cuairlaGMMcydOxe3b98GAAQHByMiIsLCpSK2goIBQojVEggEiI2NhbOzMwBg69atWLZsmYVLpdvSpUuxbds2ABWPB2JjYyEQCCxcKmIrKBgghFg1b29vbNiwgXsfFRXFe3xQF3z55Ze8iYpiYmLo8QCpVRQMEEKs3oQJE7B27VrufWRkJJYuXWrxRwaMMURFRSEyMpJbt27dOrz55psWLBWxRdSbgBBiM1asWIGPP/6Yez9p0iT85z//scgEQIWFhZg7dy73aAAAli9fjsWLF9d6WQihYIAQYlPWrl3LG3fA09MTsbGxtdrtMDU1FdOmTeMaC6rLNW/evForAyGa6DEBIcSmvPfee4iPj+caFd6+fRvDhw9HREQECgsLa/TYhYWFCA8Px/Dhw7lAwMXFBQkJCRQIEIuimgFCiE3Ky8vDtGnTsH//fm6dWCxGeHg4Zs6cWa2TG+Xk5CAmJgZbtmxBQUEBtz44OBixsbHUWJBYHAUDhBCbxRjD5s2bMX/+fG6kQqCiS2JwcDBmzZoFqVQKBwcHk/MuLy9HamoqvvnmG+zdu5e3zcXFBWvWrEF4eDh1HyR1AgUDhBCbl5eXh8WLF2Pnzp0oLS3lbROJROjWrRsCAgLQo0cPBAQEwNvbGyKRCI6OjigpKYFCoUBeXh7S09ORlpaG9PR0nDt3DgqFgpeXUCjE+PHjsXLlSqoNIHUKBQOEEPL/PXjwAFu2bMGGDRsgk8mqLV8fHx/MnDkT4eHhNOkQqZMoGCCEkEqUSiX27t2L+Ph4nDlzBjk5OSbnIZFIEBgYiIkTJyIkJAT29vY1UFJCqgcFA4QQUoXCwkKcPXsW6enpyMjIQEFBARQKBUpKSuDo6AiRSASxWIzu3bsjICAA/v7+Fhm7gBBzUTBACCGE2DgaZ4AQQgixcRQMEEIIITaOggFCCCHExlEwQAghhNg4CgYIIYQQG0fBACGEEGLjKBgghBBCbBwFA4QQQoiNo2CAEEIIsXEUDBBCCCE2joIBQgghxMZRMEAIIYTYOAoGCCGEEBtHwQAhhBBi4ygYIIQQQmwcBQOEEEKIjaNggBBCCLFxFAwQQgghNo6CAUIIIcTGUTBACCGE2DgKBgghhBAbR8EAIYQQYuMoGCCEEEJsHAUDhBBCiI2jYIAQQgixcRQMEEIIITaOggFCCCHExlEwQAghhNg4CgYIIYQQG0fBACGEEGLjKBgghBBCbBwFA4QQQoiNo2CAEEIIsXEUDBBCCCE2joIBQgghxMZRMEAIIYTYOAoGCCGEEBtHwQAhhBBi4ygYIIQQQmwcBQOEEEKIjaNggBBCCLFxFAwQQgghNo6CAUIIIcTGUTBACCGE2DgKBgghhBAbR8EAIYQQYuMoGCCEEEJsHAUDhBBCiI2jYIAQQgixcRQMEEIIITaOggFCCCHExlEwQAghhNg4CgYIIYQQG0fBACGEEGLjKBgghBBCbBwFA4QQQoiNo2CAEEIIsXEUDBBCCCE2joIBQgghxMZRMEAIIYTYuP8HgM7O/4vyFtcAAAAASUVORK5CYII=", + "text/markdown": [ + "The simplification did not modify the graph." + ], "text/plain": [ - "
" + "" ] }, "metadata": {}, @@ -1187,8 +1516,7 @@ } ], "source": [ - "new_graph = remove_nuisance_variables(graph, treatments=PKC, outcomes=ERK)\n", - "new_graph.draw()" + "reduced_graph = eliater.step_3_notebook(graph=graph, treatment=treatment, outcome=outcome)" ] }, { @@ -1206,37 +1534,2186 @@ }, { "cell_type": "code", - "execution_count": 13, - "id": "bc35ae3d63e96ac2", - "metadata": { - "ExecuteTime": { - "end_time": "2024-01-25T17:51:34.248174Z", - "start_time": "2024-01-25T17:51:33.010726Z" - }, - "collapsed": false, - "jupyter": { - "outputs_hidden": false - } - }, + "execution_count": 9, + "id": "3b9657cb-7af2-4f5f-abf4-d87de17808f2", + "metadata": {}, "outputs": [ { "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "", + "version_major": 2, + "version_minor": 0 + }, "text/plain": [ - "-0.3058088128067109" + "Subsampling: 0%| | 0/500 [00:00\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " 2024-04-25T08:52:07.872215\n", + " image/svg+xml\n", + " \n", + " \n", + " Matplotlib v3.8.0, https://matplotlib.org/\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n" + ], + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" } ], "source": [ - "estimate_ace(new_graph, treatments=RAF, outcomes=ERK, data=data)" + "eliater.step_5_notebook_real(\n", + " graph=graph, example=example, treatment=treatment, outcome=outcome, subsample_size=400\n", + ")" ] }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 10, "id": "d59724cde170ff98", "metadata": { "ExecuteTime": { @@ -1248,20 +3725,10 @@ "outputs_hidden": false } }, - "outputs": [ - { - "data": { - "text/plain": [ - "0.4337988728954721" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ - "estimate_ace(new_graph, treatments=PKC, outcomes=ERK, data=data)" + "# What do we need to say about this alternate query?\n", + "# estimate_ace(new_graph, treatments=PKC, outcomes=ERK, data=data)" ] }, { @@ -1281,7 +3748,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 11, "id": "5ec4866c17ae5b52", "metadata": { "ExecuteTime": { @@ -1419,7 +3886,7 @@ "4 418.0 " ] }, - "execution_count": 15, + "execution_count": 11, "metadata": {}, "output_type": "execute_result" } @@ -1433,7 +3900,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 12, "id": "c3404c589732844c", "metadata": { "ExecuteTime": { @@ -1564,7 +4031,7 @@ "4 33.7 19.8 5.19 9.73 24.80 21.10 46.1 305.0 4.66 25.7 81.3" ] }, - "execution_count": 16, + "execution_count": 12, "metadata": {}, "output_type": "execute_result" } @@ -1576,7 +4043,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 13, "id": "c674ce2242fa4810", "metadata": { "ExecuteTime": { @@ -1707,7 +4174,7 @@ "5 33.7 19.8 5.19 9.73 24.80 21.10 46.1 305.0 4.66 25.7 81.3" ] }, - "execution_count": 17, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } @@ -1734,7 +4201,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.6" + "version": "3.11.9" } }, "nbformat": 4, diff --git a/notebooks/Case_study3_The_EColi.ipynb b/notebooks/Case_study3_The_EColi.ipynb index dcb20fa..96a165c 100644 --- a/notebooks/Case_study3_The_EColi.ipynb +++ b/notebooks/Case_study3_The_EColi.ipynb @@ -84,17 +84,17 @@ " \n", " 0\n", " eliater\n", - " 0.0.1-dev-261a89cc\n", + " 0.0.3-dev-28d9867e\n", " \n", " \n", " 1\n", " y0\n", - " 0.2.7-UNHASHED\n", + " 0.2.10-dev-8f27d998\n", " \n", " \n", " 2\n", " Run at\n", - " 2024-01-26 08:49:25\n", + " 2024-04-25 09:07:53\n", " \n", " \n", "\n", @@ -102,9 +102,9 @@ ], "text/plain": [ " key value\n", - "0 eliater 0.0.1-dev-261a89cc\n", - "1 y0 0.2.7-UNHASHED\n", - "2 Run at 2024-01-26 08:49:25" + "0 eliater 0.0.3-dev-28d9867e\n", + "1 y0 0.2.10-dev-8f27d998\n", + "2 Run at 2024-04-25 09:07:53" ] }, "execution_count": 1, @@ -117,6 +117,7 @@ "import numpy as np\n", "import pandas as pd\n", "import seaborn as sns\n", + "from IPython.display import set_matplotlib_formats\n", "from matplotlib.lines import Line2D\n", "\n", "from eliater import version_df\n", @@ -128,6 +129,8 @@ "from y0.algorithm.identify import Identification, identify_outcomes\n", "from y0.dsl import P, Variable\n", "\n", + "set_matplotlib_formats(\"svg\")\n", + "\n", "version_df()" ] }, @@ -447,7 +450,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "117d7fa0680c4744996422a85110a707", + "model_id": "202871c1577b4e66b740661b9fe7ded6", "version_major": 2, "version_minor": 0 }, @@ -461,7 +464,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "cec166da905a4f9fbf3d8d0c85a42c1e", + "model_id": "9222fa05751a4948867841688e181838", "version_major": 2, "version_minor": 0 }, @@ -476,11 +479,11 @@ "name": "stdout", "output_type": "stream", "text": [ - "Of the 498 d-separations implied by the network's structure, 203 (40.76%) rejected the null hypothesis at p<0.01.\n", + "Of the 498 d-separations implied by the network's structure, 202 (40.56%) rejected the null hypothesis at p<0.01.\n", "\n", "Since this is more than 30%, Eliater considers this a major inconsistency and therefore suggests adding appropriate bidirected edges using the eliater.add_ci_undirected_edges() function.\n", "\n", - "Finished in 448.30 seconds.\n", + "Finished in 293.75 seconds.\n", "\n" ] }, @@ -584,55 +587,55 @@ " \n", " \n", " 493\n", - " aspC\n", - " cspA\n", - " \n", - " -0.109635\n", - " 7.879075e-02\n", + " cyoA\n", + " exuT\n", + " crp|dpiA\n", + " -0.011299\n", + " 8.566703e-01\n", " None\n", " 1.000000e+00\n", " False\n", " \n", " \n", " 494\n", - " appB\n", - " iscR\n", + " dcuR\n", + " rpoH\n", " \n", - " 0.142485\n", - " 2.206591e-02\n", + " 0.102291\n", + " 1.011384e-01\n", " None\n", " 1.000000e+00\n", " False\n", " \n", " \n", " 495\n", - " cyoA\n", - " phoB\n", - " cra|rpoD\n", - " 0.170390\n", - " 6.075503e-03\n", + " cspA\n", + " exuT\n", + " \n", + " -0.142326\n", + " 2.221632e-02\n", " None\n", " 1.000000e+00\n", " False\n", " \n", " \n", " 496\n", - " hns\n", - " rpoH\n", + " btsR\n", + " rpoS\n", " \n", - " 0.095527\n", - " 1.259058e-01\n", + " -0.048802\n", + " 4.350762e-01\n", " None\n", " 1.000000e+00\n", " False\n", " \n", " \n", " 497\n", - " crp\n", - " rpoS\n", - " ihfA|rpoD\n", - " 0.169058\n", - " 6.490623e-03\n", + " hns\n", + " iscR\n", + " \n", + " -0.027520\n", + " 6.599513e-01\n", " None\n", " 1.000000e+00\n", " False\n", @@ -643,18 +646,18 @@ "" ], "text/plain": [ - " left right given stats p dof p_adj \\\n", - "0 appA appB appY 0.899419 5.350841e-94 None 2.664719e-91 \n", - "1 appA phoB appY 0.840764 3.572616e-70 None 1.775590e-67 \n", - "2 appA narL appY 0.838726 1.583492e-69 None 7.854120e-67 \n", - "3 appA arcA appY 0.833926 4.864309e-68 None 2.407833e-65 \n", - "4 appA rpoS appY 0.832139 1.693584e-67 None 8.366305e-65 \n", - ".. ... ... ... ... ... ... ... \n", - "493 aspC cspA -0.109635 7.879075e-02 None 1.000000e+00 \n", - "494 appB iscR 0.142485 2.206591e-02 None 1.000000e+00 \n", - "495 cyoA phoB cra|rpoD 0.170390 6.075503e-03 None 1.000000e+00 \n", - "496 hns rpoH 0.095527 1.259058e-01 None 1.000000e+00 \n", - "497 crp rpoS ihfA|rpoD 0.169058 6.490623e-03 None 1.000000e+00 \n", + " left right given stats p dof p_adj \\\n", + "0 appA appB appY 0.899419 5.350841e-94 None 2.664719e-91 \n", + "1 appA phoB appY 0.840764 3.572616e-70 None 1.775590e-67 \n", + "2 appA narL appY 0.838726 1.583492e-69 None 7.854120e-67 \n", + "3 appA arcA appY 0.833926 4.864309e-68 None 2.407833e-65 \n", + "4 appA rpoS appY 0.832139 1.693584e-67 None 8.366305e-65 \n", + ".. ... ... ... ... ... ... ... \n", + "493 cyoA exuT crp|dpiA -0.011299 8.566703e-01 None 1.000000e+00 \n", + "494 dcuR rpoH 0.102291 1.011384e-01 None 1.000000e+00 \n", + "495 cspA exuT -0.142326 2.221632e-02 None 1.000000e+00 \n", + "496 btsR rpoS -0.048802 4.350762e-01 None 1.000000e+00 \n", + "497 hns iscR -0.027520 6.599513e-01 None 1.000000e+00 \n", "\n", " p_adj_significant \n", "0 True \n", @@ -876,7 +879,2695 @@ "outputs": [ { "data": { - "image/png": "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", + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " 2024-04-25T09:12:47.696088\n", + " image/svg+xml\n", + " \n", + " \n", + " Matplotlib v3.8.0, https://matplotlib.org/\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n" + ], "text/plain": [ "
" ] @@ -1097,7 +3788,991 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAgoAAAHHCAYAAADeX3CiAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA/d0lEQVR4nO3dZ3hU1f728XsS0kMSSgjFUEJvAQ8Khi4gRURAkCMiTREVEBFRsRySIAgqKipFRAUVsGFDDCAiiCBYQaooHaUjCSWQkMx6XvBk/pkkKySQBnw/18Wl2XvN3r+9ZmbNPbuNwxhjBAAAkAWPwi4AAAAUXQQFAABgRVAAAABWBAUAAGBFUAAAAFYEBQAAYEVQAAAAVgQFAABgRVAAAABWBIUrQOvWrdW6devCLiNP7d69Ww6HQ7Nnzy7sUnCJ0p7LSZMm5dkyY2Ji5HA4dPTo0Qu2rVy5sgYMGOD6e8WKFXI4HFqxYoVr2oABA1S5cuU8qy+30rYnvYx155es3msDBgxQYGBgvq87jcPhUExMTIGtD7lDUMhHs2fPlsPhsP5bu3Ztjpe1ZcsWxcTEaPfu3flX8EWYNm3aFfdhPm/ePE2ePLmwy0AhSkxMVExMjFuYuBzExcUV2Q/colwbslessAu4GowdO1ZVqlTJNL1atWo5XsaWLVsUGxur1q1bZ/rm8/XXX19qiRdt2rRpKl26dIF88yko8+bN06ZNmzRixIjCLgV5YNu2bfLwyP470cyZM+V0Ol1/JyYmKjY2VpIKbW9dTurOKC4uTlOnTs3VB3KlSpV05swZeXl55bLC3MmutjNnzqhYMT6OiiqemQLQqVMnXXfddfm2fG9v73xbNpCVxMRE+fv7F3YZOeLj43PBNvn9IXkxclL3pUhJSZHT6ZS3t7d8fX3zdV0XUtjrR/Y49FBEfPDBB2rUqJGKFy+uoKAg1a9fX6+88oqk84cwbr/9dknSjTfe6Dp0kbZbNOM5CmnHYD/66CPFxsaqQoUKKl68uHr27KmEhAQlJSVpxIgRKlOmjAIDAzVw4EAlJSW51TNr1iy1adNGZcqUkY+Pj+rUqaPp06e7talcubI2b96s7777zlVT+jri4+M1YsQIhYeHy8fHR9WqVdNzzz3n9s0trd2AAQMUHByskJAQ9e/fX/Hx8Tnuu507d+r2229XyZIl5e/vrxtuuEFfffWVW5u0w0AZD91kPF7dunVrffXVV9qzZ49rm9LvwTl79qxiYmJUo0YN+fr6qly5crrtttu0Y8cOV5vTp0/rkUcecW13zZo1NWnSJGX8oVaHw6Fhw4bp448/Vp06deTn56eoqCht3LhRkjRjxgxVq1ZNvr6+at26dZaHnX788Ud17NhRwcHB8vf3V6tWrbR69eoL9lnadn/44Yd68sknVbZsWQUEBOjWW2/Vvn373Nq2bt1a9erV06+//qqWLVvK399fTz75pCTp8OHDuueeexQWFiZfX181aNBA77zzjnW9L7/8sipVqiQ/Pz+1atVKmzZtcpu/YcMGDRgwQBEREfL19VXZsmV1991369ixY1ku7+jRo+rVq5eCgoJUqlQpPfTQQzp79qxbm5wc609/jsLu3bsVGhoqSYqNjXW9DmJiYjRr1iw5HA6tW7cu0zKeffZZeXp66p9//sl2XatWrdL1118vX19fVa1aVTNmzMiyXca6z507p9jYWFWvXl2+vr4qVaqUmjdvrqVLl7q2YerUqZLkdogzbZvSzhOZPHmyqlatKh8fH23ZsiXb84F27typDh06KCAgQOXLl9fYsWPdXsdZne+Rfn1py8yutrRpGfc0rFu3Tp06dVJQUJACAwPVtm3bTIdr097Xq1ev1siRIxUaGqqAgAB1795dR44cyfoJQK6xR6EAJCQkZDrpyuFwqFSpUpKkpUuXqnfv3mrbtq2ee+45SdLWrVu1evVqPfTQQ2rZsqWGDx+uV199VU8++aRq164tSa7/2kyYMEF+fn4aPXq0tm/frtdee01eXl7y8PDQ8ePHFRMTo7Vr12r27NmqUqWKxowZ43rs9OnTVbduXd16660qVqyYvvzySw0ZMkROp1NDhw6VJE2ePFkPPvigAgMD9dRTT0mSwsLCJJ3/xtmqVSv9888/uu+++1SxYkX98MMPeuKJJ3TgwAHXOQDGGHXt2lWrVq3S/fffr9q1a+uzzz5T//79c9S3hw4dUtOmTZWYmKjhw4erVKlSeuedd3Trrbdq/vz56t69e46Wk+app55SQkKC/v77b7388suS5DqpKzU1VbfccouWLVumO+64Qw899JBOnjyppUuXatOmTapataqMMbr11lu1fPly3XPPPWrYsKGWLFmiRx99VP/8849rmWm+//57LViwwNWnEyZM0C233KLHHntM06ZN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SpQoYZ0vSdWrV3f72+FwqFq1apnOh6hQoUKmk2b37Nmj6tWrZzoz37atGdclSTVq1NBHH33k+vvff/9VbGysPvjgA9drJP32XKj+qlWrysPDI18vI77ppptUrlw5zZ07V23btpXT6dT777+vrl27Znre0zty5IjOnDmTZT/UrFnzguFm7Nix6tq1q2rUqKF69eqpY8eO6tu3ryIjI3Nce1ZXX9l4eHi4fVBL558vSfnav0eOHFFiYmKWY0Dt2rXldDq1b98+1a1b1zU94/so7XWf9n7BpSEoFAFlypTR+vXrtWTJEi1atEiLFi3SrFmz1K9fv2xPDLsQT0/PXE03//8kpR07dqht27aqVauWXnrpJYWHh8vb21txcXF6+eWXc/RN1el06qabbtJjjz2W5fy0AaegZDy2nSY1NbVA68joYp+jtOfghRdeUMOGDbNsm5c3zEn/TT8/9erVSz/88IMeffRRNWzYUIGBgXI6nerYsWOOXne25zkveXp66s4779TMmTM1bdo0rV69Wvv379ddd92Vr+tt2bKlduzYoS+++EJff/213nzzTb388st6/fXXNWjQoBwtI6+fx6LyvrrQ+wWXhqBQRHh7e6tLly7q0qWLnE6nhgwZohkzZuh///ufqlWrViADYJovv/xSSUlJWrBggVtST7+rNY2trqpVq+rUqVNq165dtuuqVKmSli1bplOnTrl9sG3bti1HtVaqVCnLtn/88YdrvvR/3zAyXk2R1a7J7Lbpxx9/1Llz56yX01WqVEnffPONTp486fbtMmM9l6pq1aqSpKCgoAv2cXYy7sY2xmj79u05+pZaqVIlbdiwQU6n022vgm1bs9pl/ueff7oOvRw/flzLli1TbGys24m12e1q/+uvv9y+JW/fvl1Op/OS77J4ofdbv3799OKLL+rLL7/UokWLFBoaesHDB6GhofLz88tye3L6ei9ZsqQGDhyogQMH6tSpU2rZsqViYmJcQSEvxwmn06mdO3e6hfo///xTklz9mxfvq4xCQ0Pl7+9vfV97eHhk2uOG/MU5CkVAxku/PDw8XAN12mWLAQEBkjK/IfNDWjpPn8YTEhI0a9asTG0DAgKyrKlXr15as2aNlixZkmlefHy863yIm2++WSkpKW6XXqampuq1117LUa0333yzfvrpJ61Zs8Y17fTp03rjjTdUuXJl1alTR9L/fbCmnRuRtp433ngjy23Kajd3jx49dPToUU2ZMiXTvLS+uvnmm5WampqpzcsvvyyHw6FOnTrlaLsupFGjRqpataomTZqkU6dOZZqf00vD0q5ESDN//nwdOHAgR3XefPPNOnjwoNuZ5SkpKXrttdcUGBioVq1aubX//PPP3S4d/Omnn/Tjjz+61pXV605StnfJTLvkLk3a6+ZS+zntHhG291tkZKQiIyP15ptv6pNPPtEdd9xxwRsGeXp6qkOHDvr888+1d+9e1/StW7dm+T7JKOM4ERgYqGrVqrld2pzX40T617ExRlOmTJGXl5fatm0r6XwY9PT0dHtfSedvxJZRTmvz9PRU+/bt9cUXX7gd4jh06JDmzZun5s2bKygo6CK3CBeDPQoFYNGiRa5vWek1bdpUERERGjRokP7991+1adNG11xzjfbs2aPXXntNDRs2dB3vbdiwoTw9PfXcc88pISFBPj4+rvsc5LX27du79nDcd999OnXqlGbOnKkyZcrowIEDbm0bNWqk6dOna9y4capWrZrKlCmjNm3a6NFHH9WCBQt0yy23aMCAAWrUqJFOnz6tjRs3av78+dq9e7dKly6tLl26qFmzZho9erR2796tOnXq6NNPP83RCZOSNHr0aL3//vvq1KmThg8frpIlS+qdd97Rrl279Mknn7i+6datW1c33HCDnnjiCf37778qWbKkPvjgA7cTONNv04cffqiRI0fq+uuvV2BgoLp06aJ+/frp3Xff1ciRI/XTTz+pRYsWOn36tL755hsNGTJEXbt2VZcuXXTjjTfqqaee0u7du9WgQQN9/fXX+uKLLzRixAhXYLlUHh4eevPNN9WpUyfVrVtXAwcOVIUKFfTPP/9o+fLlCgoK0pdffnnB5ZQsWVLNmzfXwIEDdejQIU2ePFnVqlXTvffee8HHDh48WDNmzNCAAQP066+/qnLlypo/f75Wr16tyZMnZzpeX61aNTVv3lwPPPCAkpKSNHnyZJUqVcp1eCooKEgtW7bU888/r3PnzqlChQr6+uuvtWvXLmsNu3bt0q233qqOHTtqzZo1mjNnju688041aNDggvVnx8/PT3Xq1NGHH36oGjVqqGTJkqpXr57b+S79+vXTqFGjJCnHhx1iY2O1ePFitWjRQkOGDHEFq7p162rDhg3ZPrZOnTpq3bq1GjVqpJIlS+qX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iTp37qxbbrlFd911l2666SbdfffdrmUkJiZq/Pjxevfdd+Xt7a0hQ4bojjvu0OrVqyVJ33//vfr166dXX31VLVq00I4dO1zhIzo6Wk6nU506ddLJkyc1Z84cVa1aVVu2bJGnp6eaNm2qyZMnu+11SdvjcqHaf/zxR91zzz2aMGGCunXrpsWLFys6OjrbPuzTp4+ef/55TZw40fVcfvjhhypfvrxatGgh6fzliM8884xq1qypw4cPa+TIkRowYIDi4uJy9DxlZe7cuRozZoymTJmia6+9VuvWrdO9996rgIAA9e/f/6KXCwCXiwINCmfOparOmCUFuUpJ0paxHfLsd7zHjh2rm266Kcftk5KS9Oyzz+qbb75RVFSUJCkiIkKrVq3SjBkzsgwKe/fu1axZs7R3716VL19ekjRq1CgtXrxYs2bN0rPPPquGDRtq3LhxGjRokO644w7t2bNHCxcudFvOuXPnNGXKFDVp0kSS9M4776h27dr66aef1LhxY8XGxmr06NGuD7yIiAg988wzeuyxxxQdHa1vvvlGP/30k7Zu3aoaNWq42qRJv9clN7W/8sor6tixox577DFJUo0aNfTDDz9o8eLF1n7s1auXRowYoVWrVrmCwbx589S7d29XcEgfkiIiIvTqq6/q+uuv16lTp9wOG+VGdHS0XnzxRd12222SpCpVqmjLli2aMWMGQQHAVYED7Ll03XXX5ar99u3blZiYmClcJCcn69prr83yMRs3blRqaqrrwzlNUlKS210uH3nkEX3++eeaMmWKFi1alOkOmMWKFdP111/v+rtWrVoKCQnR1q1b1bhxY/3+++9avXq1xo8f72qTmpqqs2fPKjExUevXr9c111yTqY7s5KT2rVu3qnv37m7zo6Kisg0KoaGhat++vebOnasWLVpo165dWrNmjWbMmOFq8+uvvyomJka///67jh8/LqfTKel8eKlTp06OtyHN6dOntWPHDt1zzz269957XdNTUlIUHByc6+UBwOWoQIOCn5entoztUJCrdK03rwQEBLj97eHhIWOM27T0d+Q7deqUJOmrr75ShQoV3Nr5+PhkuY5Tp07J09NTv/76a6ZbAKf/Znz48GH9+eef8vT01F9//aWOHTvmaltOnTql2NhY17fl9Hx9fV23I87tMnNS+8Xo06ePhg8frtdee03z5s1T/fr1Vb9+fUnnP9Q7dOigDh06aO7cuQoNDdXevXvVoUMHJScnZ7m8nD53M2fOdO2VScOtmQFcLQo0KDgcjjw7BFBUhIaGatOmTW7T1q9fLy8vL0lSnTp15OPjo71791rPR8jo2muvVWpqqg4fPuzazZ6Vu+++W/Xr13d9423Xrp1q167tmp+SkqJffvlFjRs3liRt27ZN8fHxrjb/+c9/tG3bNlWrVi3L5UdGRurvv//Wn3/+meVeBW9vb6Wmup9zkpPaa9eurR9//NFt2tq1a63bmaZr164aPHiwFi9erHnz5qlfv36ueX/88YeOHTumiRMnKjw8XJL0yy+/ZLu80NBQHTx4UMYY1+GL9evXu+aHhYWpfPny2rlzp/r06XPB+gDgSnRlfWoXgjZt2uiFF17Qu+++q6ioKM2ZM0ebNm1yHVYoXry4Ro0apYcfflhOp1PNmzdXQkKCVq9eraCgoCyPc9eoUUN9+vRRv3799OKLL+raa6/VkSNHtGzZMkVGRqpz586aOnWq1qxZow0bNig8PFxfffWV+vTpo7Vr18rb21uS5OXlpQcffFCvvvqqihUrpmHDhumGG25wBYcxY8bolltuUcWKFdWzZ095eHjo999/16ZNmzRu3Di1atVKLVu2VI8ePfTSSy+pWrVq+uOPP+RwONSxY0dVrlxZp06d0rJly9SgQQP5+/vnqPbhw4erWbNmmjRpkrp27aolS5Zke9ghTUBAgLp166b//e9/2rp1q3r37u2aV7FiRXl7e+u1117T/fffr02bNumZZ57JdnmtW7fWkSNH9Pzzz6tnz55avHixFi1apKCgIFeb2NhYDR8+XMHBwerYsaOSkpL0yy+/6Pjx4xo5cuSFXyAAcLkzlyAhIcFIMgkJCZnmnTlzxmzZssWcOXPmUlZRaGbNmmWCg4Ndfy9fvtxIMsePH8/UdsyYMSYsLMwEBwebhx9+2AwbNsy0atXKNd/pdJrJkyebmjVrGi8vLxMaGmo6dOhgvvvuO+v6k5OTzZgxY0zlypWNl5eXKVeunOnevbvZsGGD2bp1q/Hz8zPz5s1ztT9+/LgJDw83jz32mFv9n3zyiYmIiDA+Pj6mXbt2Zs+ePW7rWbx4sWnatKnx8/MzQUFBpnHjxuaNN95wzT927JgZOHCgKVWqlPH19TX16tUzCxcudM2///77TalSpYwkEx0dfcHa07z11lvmmmuuMX5+fqZLly5m0qRJbv1tExcXZySZli1bZpo3b948U7lyZePj42OioqLMggULjCSzbt06Y0zWz+H06dNNeHi4CQgIMP369TPjx483lSpVclvu3LlzTcOGDY23t7cpUaKEadmypfn000+tNV7ur30ARcPppHOm0uMLTaXHF5rTSefydNnZfX5n5DAmw0HaXDhx4oSCg4OVkJDg9i1MOn+t/65du1SlShX5+vpefJLBRZk9e7ZGjBjB7YoLAa99AHkhMTnFdaVgXl69J2X/+Z0RN1wCAABWBAUAAGBFULhCDRgwgMMOAIBLRlAAAABW+R4ULuFcSeCyxGsewJUk34JC2g2HEhMT82sVQJGU9ppPew8AwOUs32645OnpqZCQENfP/Pr7++fZLzgCRZExRomJiTp8+LBCQkK4zTOAK0K+3pkx7VcF08ICcDUICQlx+0VNALic5WtQcDgcKleunMqUKeP2YzvAlcrLy4s9CQCuKAXyWw+enp4MngAAXIa4PBIAAFjx65HIN4cOHVJCQkJhl1FkBAcHKywsrLDLAIBcISggXxw6dEh39e2nc8lJhV1KkeHl7aM5771LWABwWSEoIF8kJCToXHKSzkS0ktM3uLDLyZbHmXj57VqpM1VayukXkj/rOJsg7fxOCQkJBAUAlxWCAvKV0zdYzoDShV1Gjjj9Qi6bWgGgoHAyIwAAsCIoAAAAK4ICAACwIigAAAArggIAALAiKAAAACuCAgAAsCIoAAAAK4ICAACwIigAAAArggIAALAiKAAAACuCAgAAsCIoAAAAK4ICAACwIigAAAArggIAALAiKAAAACuCAgAAsCIoAAAAK4ICAACwIigAAAArggIAALAiKAAAACuCAgAAsCIoAAAAK4ICAACwIigAAAArggIAALAiKAAAACuCAgAAsCIoAAAAK4ICAACwIigAAAArggIAALAiKAAAACuCAgAAsCIoAAAAK4ICAACwIigAAAArggIAALAiKAAAACuCAgAAsCIoAAAAK4ICAACwIigAAAArggIAALAiKAAAACuCAgAAsCIoAAAAK4ICAACwIigAAAArggIAALAiKAAAACuCAgAAsCIoAAAAK4ICAACwIigAAAArggIAALAiKAAAACuCAgAAsCIoAAAAK4ICAACwIigAAAArggIAALAiKAAAACuCAgAAsCIoAAAAK4ICAACwIigAAACrKzYonD17Vn/++afOnj1b2KUAyGe834H8c8UGhb1792rw4MHau3dvYZcCIJ/xfgfyzxUbFAAAwKUjKAAAACuCAgAAsCIoAAAAK4ICAACwIigAAAArggIAALAiKAAAACuCAgAAsCIoAAAAK4ICAACwIigAAAArggIAALAiKAAAACuCAgAAsCIoAAAAK4ICAACwIigAAAArggIAALAiKAAAACuCAgAAsCIoAAAAK4ICAACwIigAAAArggIAALAiKAAAACuCAgAAsCIoAAAAK4ICAACwIigAAAArggIAALAiKAAAACuCAgAAsCIoAAAAK4ICAACwIigAAAArggIAALAiKAAAACuCAgAAsCIoAAAAK4ICAACwIigAAAArggIAALAiKAAAACuCAgAAsCIoAAAAK4ICAACwIigAAAArggIAALAiKAAAACuCAgAAsCIoAAAAK4ICAACwIigAAAArggIAALAiKAAAACuCAgAAsCIoAAAAK4ICAACwIigAAAArggIAALAiKAAAACuCAgAAsCIoAAAAK4ICAACwIigAAAArggIAALAiKAAAAKtihV1AVlJTU7Vhwwb9+++/KlmypCIjI+Xp6VnYZQG4wmUce+rWrauNGzdq/fr1kqSGDRuqYcOGkuRqFxISIqfTqd9//12HDh1SWFiYrr32WjVs2NA1bqWmpmr9+vVav369jDEqXry4SpYsqdKlS1/y+MZ4ifxW5ILCypUrNW3aNB08eNA1rWzZshoyZIhatmxZiJUBuJJlNfZ4eHjI6XS6/n7vvfcUEBAgLy8vxcfHW5c1Z84chYSEaOTIkZKkl156ydr+UsY3xksUhCJ16GHlypWKjo5WRESEpk6dqri4OE2dOlURERGKjo7WypUrC7tEAFegjGPPU089JUmukDBgwAC9+OKLqlixok6fPq34+Hi1a9cu03Juvvlm1alTR5IUHx+vMWPGaMyYMYqPj1fFihUlSXXq1FHVqlVdjwkODr6o8Y3xEgWlyASF1NRUTZs2TVFRURo3bpzq1q0rf39/1a1bV+PGjVNUVJSmT5+u1NTUwi4VwBUk49hTq1Ytvfnmm/Lx8VFUVJSioqK0ZMkS1a9fX0lJSQoJCZGPj4++/fZbeXt7y9vbWzfccIOioqK0bt06vfLKK4qKipKPj49rHU2aNFFSUpKaNm2qKVOmaObMma42CQkJuuGGG3I1vjFeoiDl6tBDUlKSkpKSXH+fOHEizwrZsGGDDh48qP/973/y8HDPLx4eHurTp4+GDh2qDRs26Nprr83xcvfs2ZNnNSLn6Pes0S/541L6NePYs27dOh06dEiSdNddd0mShg4dqi+++EKHDh3SI488ohdffFGSlJycLEnq27evq92mTZt01113ac2aNa51XHPNNfrxxx81ZswY1/iW1ubgwYP673//qzVr1uR4fMuv8RLISq6CwoQJExQbG5svhfz777+SpCpVqmQ5P216WrucGj9+/KUVBuQhXo9FT8axJ/0Yk3482r9/vyQpKioq0zLSt/v3338ztUkLFOnbpf//tL0POR3f8mu8BLKSq6DwxBNPuE7Okc7vUQgPD8+TQkqWLClJ2rVrl+rWrZtp/q5du9za5dRTTz2lSpUqXXqByJU9e/bwoZgFXo/541JebxnHnvRjTNq4I0nly5eXJLc9BVm1K1mypNvfkuTt7e22joyPSdtTm9PxLb/GSyAruQoKPj4+bsfd8lJkZKTKli2ruXPnaty4cW6705xOp+bOnaty5copMjIyV8utVKmSatSokdflAheF12PRk3HsiYyMVFhYmOLj4zVnzhxJUrly5dS1a1fNnz9fb731lnx8fHTu3DkVK3Z+CH3vvffkcDhUrlw51atXT2PGjJGPj48rAPz9998KCwtzrUM6f2WEj4+PSpQooZ9++ilX41t+jZdAVorMyYyenp4aMmSI1qxZo6efflqbN29WYmKiNm/erKefflpr1qzRAw88wPXBAPJUxrHnjz/+0KBBg5SUlKQ1a9ZozZo1at++vTZu3CgfHx/Fx8crKSlJN954o5KTk5WcnKy1a9dqzZo1atiwoR566CGtWbPG7XyuH3/8UT4+Pvrhhx80bNgwDRo0yNUmODhYa9euzdX4xniJglSk7qPQsmVLxcbGatq0aRo6dKhrerly5RQbG8t1wQDyhW3sSbuPwjvvvOOalnYfhWXLlmVazqJFi1z/n/E+Cnv37pUkbdmyxe0xJ06cuKjxjfESBaVIBQXp/Iu/WbNm3GkMQIHKauzJqzszNmvWLF/uzMh4iYJQ5IKCdH63Gpf0AChoWY09jRo1UqNGjTK1zdju+uuvz3a5tuVcKsZL5Lcic44CAAAoeggKAADAiqAAAACsCAoAAMCKoAAAAKwICgAAwIqgAAAArAgKAADAiqAAAACsCAoAAMCKoAAAAKwICgAAwIqgAAAArAgKAADAiqAAAACsCAoAAMCKoAAAAKwICgAAwIqgAAAArAgKAADAiqAAAACsCAoAAMCKoAAAAKwICgAAwIqgAAAArAgKAADAiqAAAACsCAoAAMCKoAAAAKwICgAAwIqgAAAArAgKAADAiqAAAACsCAoAAMCKoAAAAKwICgAAwIqgAAAArAgKAADAiqAAAACsCAoAAMCKoAAAAKwICgAAwIqgAAAArAgKAADAiqAAAACsCAoAAMCKoAAAAKwICgAAwIqgAAAArAgKAADAiqAAAACsCAoAAMCKoAAAAKwICgAAwIqgAAAArAgKAADAiqAAAACsCAoAAMCKoAAAAKwICgAAwIqgAAAArAgKAADAiqAAAACsCAoAAMCKoAAAAKwICgAAwIqgAAAArAgKAADA6ooNChUrVtQbb7yhihUrFnYpAPIZ73cg/xQr7ALyi6+vr2rUqFHYZQAoALzfgfxzxe5RAAAAl46gAAAArAgKAADAiqAAAACsCAoAAMCKoAAAAKwICgAAwIqgAAAArAgKAADAiqAAAACsCAoAAMCKoAAAAKwICgAAwIqgAAAArAgKAADAiqAAAACsCAoAAMCKoAAAAKwICgAAwIqgAAAArAgKAADAiqAAAACsCAoAAMCKoAAAAKwICgAAwIqgAAAArAgKAADAiqAAAACsCAoAAMCKoAAAAKwICgAAwIqgAAAArAgKAADAiqAAAACsCAoAAMCKoAAAAKwICgAAwIqgAAAArAgKAADAiqAAAACsCAoAAMCKoAAAAKwICgAAwIqgAAAArAgKAADAiqAAAACsCAoAAMCKoAAAAKwICgAAwIqgAAAArAgKAADAiqAAAACsCAoAAMCKoAAAAKwICgAAwIqgAAAArAgKAADAiqAAAACsCAoAAMCKoAAAAKwICgAAwIqgAAAArAgKAADAiqAAAACsCAoAAMCKoAAAAKwICgAAwIqgAAAArAgKAADAiqAAAACsihV2AbiyeZxNKOwSLsjjTLzbf/NlHZdBPwBAVggKyBfBwcHy8vaRdn5X2KXkmN+ulfm6fC9vHwUHB+frOgAgrxEUkC/CwsI05713lZDAN+k0wcHBCgsLK+wyACBXCArIN2FhYXwwAsBljpMZAQCAFUEBAABYERQAAIAVQQEAAFgRFAAAgBVBAQAAWBEUAACAFUEBAABYERQAAIAVQQEAAFgRFAAAgBVBAQAAWBEUAACAFUEBAABYERQAAIAVQQEAAFgRFAAAgBVBAQAAWBEUAACAFUEBAABYERQAAIAVQQEAAFgRFAAAgBVBAQAAWBEUAACAFUEBAABYERQAAIAVQQEAAFgRFAAAgBVBAQAAWBEUAACAFUEBAABYERQAAIBVsUt5sDFGknTixIk8KQYAAJyXmJwiZ1KipPOfsynel/SR7Sbtczvtczw7DpOTVhZ///23wsPDL/bhAACgEO3bt0/XXHNNtm0uKSg4nU7t379fxYsXl8PhkHQ+pYSHh2vfvn0KCgq62EVfseif7NE/2aN/skf/ZI/+yd7V1D/GGJ08eVLly5eXh0f2ZyFc0n4MDw8PaxIJCgq64jv6UtA/2aN/skf/ZI/+yR79k72rpX+Cg4Nz1I6TGQEAgBVBAQAAWOV5UPDx8VF0dLR8fHzyetFXBPone/RP9uif7NE/2aN/skf/ZO2STmYEAABXNg49AAAAK4ICAACwIigAAAArggIAALDKVVCYPn26IiMjXTejiIqK0qJFi7J9THx8vIYOHapy5crJx8dHNWrUUFxc3CUVXVRdTP9MnjxZNWvWlJ+fn8LDw/Xwww/r7NmzBVRx4Zo4caIcDodGjBiRbbuPP/5YtWrVkq+vr+rXr3/Fvn4yykn/zJw5Uy1atFCJEiVUokQJtWvXTj/99FPBFVmIcvr6SfPBBx/I4XCoW7du+VpXUZHT/rmaxuj0cto/V/MYnSZXd2a85pprNHHiRFWvXl3GGL3zzjvq2rWr1q1bp7p162Zqn5ycrJtuukllypTR/PnzVaFCBe3Zs0chISF5VX+Rktv+mTdvnkaPHq23335bTZs21Z9//qkBAwbI4XDopZdeKoQtKDg///yzZsyYocjIyGzb/fDDD+rdu7cmTJigW265RfPmzVO3bt3022+/qV69egVUbcHLaf+sWLFCvXv3VtOmTeXr66vnnntO7du31+bNm1WhQoUCqrbg5bR/0uzevVujRo1SixYt8rmyoiGn/XO1jdFpcto/V/MY7cZcohIlSpg333wzy3nTp083ERERJjk5+VJXc9nKrn+GDh1q2rRp4zZt5MiRplmzZgVRWqE5efKkqV69ulm6dKlp1aqVeeihh6xte/XqZTp37uw2rUmTJua+++7L5yoLT276J6OUlBRTvHhx88477+RfgYUst/2TkpJimjZtat58803Tv39/07Vr1wKps7Dkpn+uxjE6N/1ztY7RGV30OQqpqan64IMPdPr0aUVFRWXZZsGCBYqKitLQoUMVFhamevXq6dlnn1VqaupFB5vLRU76p2nTpvr1119du4p37typuLg43XzzzQVZaoEbOnSoOnfurHbt2l2w7Zo1azK169Chg9asWZNf5RW63PRPRomJiTp37pxKliyZD5UVDbntn7Fjx6pMmTK655578rmyoiE3/XM1jtG56Z+rdYzOKNc/CrVx40ZFRUXp7NmzCgwM1GeffaY6depk2Xbnzp369ttv1adPH8XFxWn79u0aMmSIzp07p+jo6EsuvijKTf/ceeedOnr0qJo3by5jjFJSUnT//ffrySefLOCqC84HH3yg3377TT///HOO2h88eFBhYWFu08LCwnTw4MH8KK/Q5bZ/Mnr88cdVvnz5iwoZl4Pc9s+qVav01ltvaf369flbWBGR2/652sbo3PbP1ThGZym3uyCSkpLMX3/9ZX755RczevRoU7p0abN58+Ys21avXt2Eh4eblJQU17QXX3zRlC1b9mL3gBR5uemf5cuXm7CwMDNz5kyzYcMG8+mnn5rw8HAzduzYAq66YOzdu9eUKVPG/P77765pF9r15+XlZebNm+c2berUqaZMmTL5VWahuZj+SW/ChAmmRIkSbo+/kuS2f06cOGEqV65s4uLiXNOu5EMPF/P6uZrG6Ivpn6ttjLa55HMU2rZtawYPHpzlvJYtW5q2bdu6TYuLizOSTFJS0qWu+rKQXf80b97cjBo1ym3ae++9Z/z8/ExqampBlFegPvvsMyPJeHp6uv5JMg6Hw3h6eroNVmnCw8PNyy+/7DZtzJgxJjIysoCqLjgX0z9pXnjhBRMcHGx+/vnnAqy4YOW2f9atW5epvcPhcLXfvn17IW1J/riY18/VNEZfTP9cbWO0Ta4PPWTkdDqVlJSU5bxmzZpp3rx5cjqd8vA4fzrEn3/+qXLlysnb2/tSV31ZyK5/EhMTXf2SxtPTU5JkrsCf4Gjbtq02btzoNm3gwIGqVauWHn/8cde2pxcVFaVly5a5XcK0dOlS63kfl7OL6R9Jev755zV+/HgtWbJE1113XUGUWihy2z+1atXK1P7pp5/WyZMn9corryg8PDzfay5IF/P6uZrG6Ivpn6ttjLbKTaoYPXq0+e6778yuXbvMhg0bzOjRo43D4TBff/21McaYvn37mtGjR7va79271xQvXtwMGzbMbNu2zSxcuNCUKVPGjBs3Li/DTpGR2/6Jjo42xYsXN++//77ZuXOn+frrr03VqlVNr169CmsTClzGXX8Z+2j16tWmWLFiZtKkSWbr1q0mOjraeHl5mY0bNxZCtQXvQv0zceJE4+3tbebPn28OHDjg+nfy5MlCqLbgXah/MrqSDz1k5UL9c7WN0RldqH8Yo8/L1R6Fw4cPq1+/fjpw4ICCg4MVGRmpJUuW6KabbpIk7d271y19hYeHa8mSJXr44YcVGRmpChUq6KGHHtLjjz+et2mniMht/zz99NNyOBx6+umn9c8//yg0NFRdunTR+PHjC2sTCl3GPmratKnmzZunp59+Wk8++aSqV6+uzz///Iq+h0J2MvbP9OnTlZycrJ49e7q1i46OVkxMTAFXV/gy9g/cXe1j9IUwRmeNn5kGAABWRG8AAGBFUAAAAFYEBQAAYEVQAAAAVgQFAABgRVAAAABWBAUAAGBFUACucAMGDFC3bt0uaRm7d++Ww+HI9lcYV6xYIYfDofj4eEnS7NmzFRIS4pofExOjhg0bXlIdAAoeQQEoQgYMGCCHwyGHwyFvb29Vq1ZNY8eOVUpKSmGXdkFNmzZ13ZU0K6NGjdKyZctcf+dFgAGQ/y75R6EA5K2OHTtq1qxZSkpKUlxcnIYOHSovLy898cQTbu2Sk5OL1A/3eHt7q2zZstb5gYGBCgwMLMCKAOQF9igARYyPj4/Kli2rSpUq6YEHHlC7du20YMEC1zfw8ePHq3z58qpZs6YkaePGjWrTpo38/PxUqlQpDR48WKdOncq03NjYWIWGhiooKEj333+/kpOTXfMWL16s5s2bKyQkRKVKldItt9yiHTt2ZFrGH3/8oaZNm8rX11f16tXTd99955qX8dBDRukPPcTExOidd97RF1984dqDsmLFCrVp00bDhg1ze9yRI0fk7e3ttjcCQMEhKABFnJ+fn+tDfdmyZdq2bZuWLl2qhQsX6vTp0+rQoYNKlCihn3/+WR9//LG++eabTB+2y5Yt09atW7VixQq9//77+vTTTxUbG+uaf/r0aY0cOVK//PKLli1bJg8PD3Xv3l1Op9NtOY8++qgeeeQRrVu3TlFRUerSpYuOHTuW620aNWqUevXqpY4dO+rAgQM6cOCAmjZtqkGDBmnevHluP80+Z84cVahQQW3atMn1egBcOoICUEQZY/TNN99oyZIlrg/JgIAAvfnmm6pbt67q1q2refPm6ezZs3r33XdVr149tWnTRlOmTNF7772nQ4cOuZbl7e2tt99+W3Xr1lXnzp01duxYvfrqq64g0KNHD912222qVq2aGjZsqLffflsbN27Uli1b3GoaNmyYevToodq1a2v69OkKDg7WW2+9lettCwwMlJ+fn2vvSdmyZeXt7a3bbrtNkvTFF1+42s6ePdt17gaAgkdQAIqYhQsXKjAwUL6+vurUqZP++9//un4yun79+m7nJWzdulUNGjRQQECAa1qzZs3kdDq1bds217QGDRrI39/f9XdUVJROnTqlffv2SZL++usv9e7dWxEREQoKClLlypUlnf/Z3fSioqJc/1+sWDFdd9112rp1a55tu6+vr/r27au3335bkvTbb79p06ZNGjBgQJ6tA0DucDIjUMTceOONmj59ury9vVW+fHkVK/Z/b9P0gSAvdenSRZUqVdLMmTNVvnx5OZ1O1atXz+08hoIyaNAgNWzYUH///bdmzZqlNm3aqFKlSgVeB4Dz2KMAFDEBAQGqVq2aKlas6BYSslK7dm39/vvvOn36tGva6tWr5eHh4TrZUZJ+//13nTlzxvX32rVrFRgYqPDwcB07dkzbtm3T008/rbZt26p27do6fvx4lutbu3at6/9TUlL066+/qnbt2he1nd7e3kpNTc00vX79+rruuus0c+ZMzZs3T3ffffdFLR9A3iAoAJexPn36yNfXV/3799emTZu0fPlyPfjgg+rbt6/CwsJc7ZKTk3XPPfdoy5YtiouLU3R0tIYNGyYPDw+VKFFCpUqV0htvvKHt27fr22+/1ciRI7Nc39SpU/XZZ5/pjz/+0NChQ3X8+PGL/iCvXLmyNmzYoG3btuno0aM6d+6ca96gQYM0ceJEGWPUvXv3i1o+gLxBUAAuY/7+/lqyZIn+/fdfXX/99erZs6fatm2rKVOmuLVr27atqlevrpYtW+q///2vbr31Vtd5Dx4eHvrggw/066+/ql69enr44Yf1wgsvZLm+iRMnauLEiWrQoIFWrVqlBQsWqHTp0hdV+7333quaNWvquuuuU2hoqFavXu2a17t3bxUrVky9e/eWr6/vRS0fQN5wGGNMYRcBAOnt3r1bVatW1c8//6z//Oc/hV0OcFUjKAAoMs6dO6djx45p1KhR2rVrl9teBgCFg0MPAIqM1atXq1y5cvr555/1+uuvF3Y5AMQeBQAAkA32KAAAACuCAgAAsCIoAAAAK4ICAACwIigAAAArggIAALAiKAAAACuCAgAAsCIoAAAAq/8HtqFewJpVy+cAAAAASUVORK5CYII=", + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " 2024-04-25T09:14:01.833035\n", + " image/svg+xml\n", + " \n", + " \n", + " Matplotlib v3.8.0, https://matplotlib.org/\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n" + ], "text/plain": [ "
" ] @@ -1152,7 +4827,1474 @@ "outputs": [ { "data": { - "image/png": "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SYndf//9RE2LeNLGMcjmpGtwsDUy6QpSU3NqJnM79qoFNTxw8wru/ehpfOdDJ3HvR0/jgZtXpAVfShgtnh4gEk/SFI4TiSdZPD2QnuOjGDkq0qMoCqZp8v73v5/29nauueYaIpEIDz30ENdddx1PP/0073//+9PHxuNxLr74YtatW8fJJ5/Mxz/+cUzT5E9/+hNXXHEF99xzD5/97GfTxz/66KP8/Oc/533vex9r1qzBtm1eeeUV/ud//of169fz4osvZhwKd8011/DWW29x8cUXU1lZybHHHjvq+3Q4+v6KtbW1cc4557B9+3bOOussPvnJTxIKhXjiiSd43/vex+9//3uuvPLK9PFvvfUWZ599Nl1dXVx99dUsXLiQ1157jdWrV3PSSScNet3f//73/OUvf+Gyyy7j05/+NKGQ3FxzeS2FEFx00UW8+uqrnHXWWVx88cXous6BAwf4wx/+wEc/+lHmzJkDwE033cTvfvc7li1bxs0334zb7ebgwYO88MILbNmyZci1AmzYsIGLLrqIRCLBtddey9y5c9m0aRM/+MEP+OMf/8grr7wyICWWy3so38ydO5c77riDO++8kzlz5vAP//AP6a+dfPLJWLZACNAGeazUAFNMroLU/nNqUqLRoxvUles0huL8ZP1eVs6bMuEjGbqusfSYwSOHqxbUsHLelEmXAhwThEIIIUQwGBSACAaDQx4XjUbFO++8I6LR6BitrLR47733BCAuuuiiYY994YUXBCDuuOOOPp+fM2eOAMQVV1wh4vF4+vPPPfdcxnN/+ctfFoD493//d2HbdvrzoVBInHbaacLlcomGhob05w8dOtTnvCnuvPNOAYhf//rXfT5/7rnnCkCcfPLJorW1ddj76n9/t9xyy4Cv3XLLLQIQn/nMZ/p8/oYbbhCA+L//+78+nz969KiYNWuWqK2t7fPeWr16tQDEb37zmz7H//u//7sABCDee++99Ofvu+8+AQhd18Wzzz47YF25vJZvv/22AMSVV1454DyxWEx0dnYKIYTo6OgQmqaJU089VSSTyT7HJZNJ0d7ePuA16/2esCxLzJ8/XwDi6aef7vP9t912mwDExz72sT6fz/U9NBip9Zx66qnijjvuGPBvx44dQoie1/W+++7r8/2AOPfccwectytuincOB8XOIyGxq7Hvvx0HW8QLr7wurvz+8+Ltgx1ZrXMi8PbBDnHmN58TF9y9Tlz2vy8N+Hf+3evEmd98blK9Jor8kO3+LYQQKtKTb047DRobi72Koamrg9deK/Yq+N73vofL1dOFcP755zNnzhy2bNmS/pxt2/zkJz9h/vz53HnnnX0K+wKBAP/xH//BBz/4QR599NF0hGLmzJkZr/fZz36WO+64g+eee46PfOQjA75+5513Ul1dnfN9vPbaa+l0TSgUYsOGDWzZsoXjjjuOr371q+njWlpaePjhhznvvPP4xCc+0eccU6dO5bbbbuNzn/sczz33HJdddhkHDhxgw4YNnHTSSdxwww19jv/Sl77ED3/4Q9rb2zOu6YorruCCCy7o87mRvJYgjTL743a7cbvdgOxgEkLg8XjQ9b6hDcMwhu2Aevnll9m7dy+XXHIJF110UZ+v/cd//Ac///nP+e1vf8tPfvKTPu8XyO49lA1/+9vfMqYiTz755BHVIHmdBm6HTsy0+9T0pLAFzJrim1QFqdnMqQmqdmxFgVGiJ980NkJDQ7FXUfIMlj465phj2LRpU/rjnTt30t7ezowZM7jzzjsHHN/c3AzAu+++m/6cEIL77ruP+++/n23bthEMBrHtnhbQw4cPZ1zTihUrRnQvmTbMRYsWsWHDhj4pmS1btmBZFvF4PGNNS6rF/d133+Wyyy5L18KcddZZA471+/2cfPLJvPDCC1nfS66v5eLFi1m2bBkPPvgghw4d4sorr2TNmjWcfPLJfcRNeXk5l156KX/+859Zvnw5H/rQh1izZg2nn356Vt5Sb7zxBkDG1u+ysjJOO+00/vKXv7Bz506WLl2a/lq276FsuOWWW/jpT3+a0/cMhaZpTA24aeiIYloCQ9fQNSl2krZAA64/ffakSlf0nlPj0Y0BX1ft2IqxQImefFNXV+wVDE8JrHGwThiHw9FHoLS1tQGwfft2tm/fPuj5urq60v//uc99jh/+8IfMmjWLD37wg0yfPj0dlbjzzjuJx+MZzzFt2rSc7wN6NkwhBEeOHOF73/se3/nOd/jQhz7Ec889h2EYfe7l5Zdf5uWXXx72XlJ1OFOnTs15vZm+lutr6XA4eP755/na177G2rVr+Zd/+RcAamtr+exnP8tXvvKV9L39/ve/55vf/Ca//e1v+cpXvgJIMXTzzTfzzW9+E5/PN+j1Uvc52P2k2sRTx6XI9j1ULMo8TmZWQlNnnHjSxhKylsft0KjyOTl+TlWxlzimpObUqHZsRTFRoifflEDaaCJRXi7/AF5zzTVZdeU0NTXxox/9iGXLlrFp06Y+m21jY2PGCEeK0RpBaprGjBkz+Pa3v01jYyO//vWvueeee/jnf/7nPvfyL//yL3znO98Z9nyp45uamjJ+/ejRo0OuZbDzZftaAkyZMoV77rmH//3f/+Xdd9/l+eef55577uGOO+7A6XRy++23A7IV/Rvf+Abf+MY3eO+993jhhRf46U9/yg9+8AOi0Sj33nvvsPc52P00dqeLU8eNJ8o8TvxuB1HTwrJlxEezTPYHB0Y6JjrZzKlR7diKQqNa1hUlzeLFiykvL+e1117DNM1hj9+3bx9CCC644IIB0YWXXnqpUMscwLe+9S28Xi/f+MY36OzsBOD0009H07SsUy+pjqeNGzcO+FokEunTCp4Nub6WvdE0jcWLF/OZz3yGZ599FiBjizvAsccey8c+9jHWr19PWVnZoMelOOWUUwDZBt6frq4uXnvtNbxeb0kOedR1Hcsaerqypmn4XA4CHic+l2NSu6yrdmxFsVGiR1HSOBwOPvWpT3HgwAG++MUvZtyst23blo6GpFqoN27c2CfFcejQoXRUYiyYPn06n/zkJ2ltbeX73/8+AHV1dVx33XVs3LiRb3/72xk9mF599VUikQgg7+Wss87izTff5OGHH+5z3Le//e10uipbcn0t9+/f32cGUIpURCY1rbi5uZlt27YNOK69vZ14PJ4+bjDOOuss5s+fz1NPPcVzzz3X52vf+MY3aG1t5frrrx9QxFwKVFdXc+jQoWIvY1wx3JwahaKQqPSWYkRs3bq1z2yS3hx//PH827/9W96udeedd/L666/zv//7v/zpT3/inHPOYerUqTQ0NLB161beeustNm3axNSpU5k+fTrXXHMNa9eu5bTTTuP888/n6NGj/PGPf+T8889n7969eVvXcHzpS1/i3nvv5bvf/S7/9E//RGVlJT/+8Y/ZuXMn//qv/8qvfvUrzjzzTCorKzl48CCvvfYau3fv5siRI+ko1T333MM555zDRz7yEdauXcuCBQt4/fXXeeWVVzjnnHN48cUXB3RMDUUur+Wbb77J1VdfzYoVKzjhhBOoq6ujoaGBxx9/HF3X+cIXvgBAQ0MDp5xyCieddBLLli1j5syZtLa2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", + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " 2024-04-25T09:14:02.097172\n", + " image/svg+xml\n", + " \n", + " \n", + " Matplotlib v3.8.0, https://matplotlib.org/\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n" + ], "text/plain": [ "
" ] @@ -1190,7 +6332,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.6" + "version": "3.11.9" } }, "nbformat": 4, diff --git a/notebooks/motivating_example.ipynb b/notebooks/motivating_example.ipynb index 5e7c2af..dfa2d42 100644 --- a/notebooks/motivating_example.ipynb +++ b/notebooks/motivating_example.ipynb @@ -10,7 +10,7 @@ } }, "source": [ - "# Motivating example: Figure 4" + "# Motivating Example: Figure 4" ] }, { @@ -27,7 +27,7 @@ } }, "source": [ - "Figure below is the motivating example in this paper: *Eliater: an open source software for causal query estimation from observational measurements of biomolecular networks*. This graph contains one mediator $M_1$ that connects the exposure $X$ to the outcome $Y$." + "Figure below is the motivating example in this paper: *Eliater: an open source software for causal query estimation from observational measurements of biomolecular networks*. This graph contains one mediator $M_1$ that connects the treatment $X$ to the outcome $Y$." ] }, { @@ -74,17 +74,17 @@ " \n", " 0\n", " eliater\n", - " 0.0.1-dev-261a89cc\n", + " 0.0.3-dev-96cf1bf2\n", " \n", " \n", " 1\n", " y0\n", - " 0.2.7-UNHASHED\n", + " 0.2.10-dev-d2e4498e\n", " \n", " \n", " 2\n", " Run at\n", - " 2024-01-26 08:50:35\n", + " 2024-04-25 08:42:10\n", " \n", " \n", "\n", @@ -92,9 +92,9 @@ ], "text/plain": [ " key value\n", - "0 eliater 0.0.1-dev-261a89cc\n", - "1 y0 0.2.7-UNHASHED\n", - "2 Run at 2024-01-26 08:50:35" + "0 eliater 0.0.3-dev-96cf1bf2\n", + "1 y0 0.2.10-dev-d2e4498e\n", + "2 Run at 2024-04-25 08:42:10" ] }, "execution_count": 1, @@ -103,26 +103,15 @@ } ], "source": [ - "import matplotlib.pyplot as plt\n", - "import numpy as np\n", - "import pandas as pd\n", - "import seaborn as sns\n", - "from tqdm.auto import tqdm, trange\n", + "from IPython.display import set_matplotlib_formats\n", "\n", - "from eliater import add_ci_undirected_edges, remove_nuisance_variables, version_df, workflow\n", - "from eliater.discover_latent_nodes import find_nuisance_variables, mark_nuisance_variables_as_latent\n", + "import eliater\n", "from eliater.frontdoor_backdoor import single_mediator_confounders_nuisance_vars_example as example\n", - "from eliater.network_validation import print_graph_falsifications\n", + "from y0.dsl import X, Y\n", "\n", - "# from eliater.examples.frontdoor_backdoor_discrete import (\n", - "# single_mediator_with_multiple_confounders_nuisances_discrete_example as example,\n", - "# )\n", - "from eliater.regression import estimate_query\n", - "from y0.algorithm.estimation import estimate_ace\n", - "from y0.algorithm.identify import identify_outcomes\n", - "from y0.dsl import P, Variable, X, Y\n", + "set_matplotlib_formats(\"svg\")\n", "\n", - "version_df()" + "eliater.version_df()" ] }, { @@ -141,7 +130,9 @@ }, "outputs": [], "source": [ - "SEED = 500" + "SEED = 500\n", + "treatment = X\n", + "outcome = Y" ] }, { @@ -161,7 +152,420 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAgMAAAGFCAYAAABg2vAPAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAABeMklEQVR4nO3de1yUZf4//tcADiMbCJirpYLr2GklT3jazbI8AZqdPEAJKuOJtIOa9mvTEs9uWdi2qQFiKrRq2UFYILOyrc+WBxQPWCqQg7oZJjMtBcMAc/3+4Mu9M3Ka84F5PR+PeTjAfd/X+8aLa973dV/XdcuEEAJERETktXxcHQARERG5FpMBIiIiL8dkgIiIyMsxGSAiIvJyTAaIiIi8HJMBIiIiL8dkgIiIyMsxGSAiIvJyTAaIiIi8HJMBIiIiL8dkgIiIyMsxGSAiIvJyTAaIiIi8HJMBIiIiL8dkgIiIyMsxGSAiIvJyTAaIiIi8HJMBIiIiL8dkgIiIyMsxGSAiIvJyTAaIiIi8HJMBIiIiL8dkgIiIyMsxGSAiIvJyTAaIiIi8HJMBIiIiL8dkgIiIyMsxGSAiIvJyTAaIiIi8HJMBIiIiL8dkgIiIyMsxGSAiIvJyTAaIiIi8HJMBIiIiL8dkgIiIyMsxGSAiIvJyTAaIiIi8HJMBIiIiL8dkgIiIyMsxGSAiIvJyTAaIiIi8HJMBIiIiL8dkgIiIyMsxGSAiIvJyTAaIiIi8HJMBIiIiL8dkgIiIyMsxGSAiIvJyTAaIiIi8HJMBIiIiL8dkgIiIyMsxGSAiIvJyTAaIiIi8HJMBIiIiL8dkgIiIyMsxGSAiIvJyTAaIiIi8HJMBIiIiL8dkgIiIyMsxGSAiIvJyfq4OgIjIETQaDY4fP46CggIUFhbi+vXr0Ol00Ov1kMvlUCgU6Ny5MwYMGIDIyEgMGjQIISEhrg6byCVkQgjh6iCIiGxVX1+PvLw8ZGVl4ciRIygtLbX4GL1798bQoUMxbdo0xMTEwNfX1wGRErkfJgNE5NGuXbuGbdu2YevWrVCr1XY7bnh4OJKSkjBr1ix06dLFbsclckdMBojII5WVlWHZsmXYu3cv9Hq9yc8UCoXU/T948GBERkYiLCwMCoUCcrkcer0eOp0OarUaBQUF0quwsBA6nc7kWHK5HLGxsVizZg3CwsKceYpETsNkgIg8ihAC6enpeO6551BZWSl9XyaTITo6GvPnz0d0dDT8/CwfElVXV4f8/Hxs3rwZ+fn5MG4eAwMD8frrr2PWrFmQyWR2ORcid8FkgIg8RllZGebMmYMDBw5I3wsNDcWsWbOQlJSE3r17262skpISvP3229i2bRsqKiqk748bNw5paWnsJaB2hckAEXmErKwsPPnkkya9ASqVCq+//jo6derksHK1Wi2ee+45ZGRkSN8LDAzE1q1b8cQTTzisXCJnYjJARG4vJSUFixcvlr7u0aMH0tLSEB0d7bQY8vLyMGfOHFy5csUkroULFzotBiJH4aJDROTWVq9ebZIIzJgxA2fOnHFqIgAAMTExOHPmDKZPny59b9GiRVizZo1T4yByBCYDROS2UlJS8PLLL0tfr1y5Etu3b3fobYHWBAcH45133kFycrL0vZdeegmbNm1ySTxE9sLbBETklrKyshAfHy99vXHjRjz33HMujMjUa6+9hiVLlkhfZ2VlcQwBeSwmA0TkdsrKyhARESENFkxOTsaKFStcHFVTycnJWLlyJYCGQYVnzpzhLAPySEwGiMitCCEQFRWFTz/9FEDDGIHt27e75dx+IQRmzpyJnTt3AgCioqKQl5fnlrEStYbJABG5lbS0NMydOxdAw6yBM2fOuGyMgDm0Wi0iIiKkWQZpaWmYPXu2i6MisgyTASJyGzfeHsjNzUVMTIyLo2pbXl4exo8fD4C3C8gzcTYBEbmN5cuXS4mASqXyiEQAaJh2mJiYCACorKzE8uXLXRwRkWXYM0BEbqG8vBw9e/aEXq9HaGgoSktLzbo9sH79erz44otWl/u3v/0NTz/9tNX7N9JqtVAqlaioqIBcLsfly5f5tEPyGOwZICK3kJGRIT19cNasWWaPEzh+/LhN5fbr18+m/RsFBwdDpVIBAPR6vcnyxUTujj0DRORy9fX1UCqVUKvVkMlkuHDhApRKpVn7lpaWoqqqyqxtKysrERsbi0uXLgEAhg8fji+++AIKhcLq2I2VlJSgT58+AIBevXqhuLgYvr6+djk2kSNZ/oxPIiI7y8vLg1qtBgBER0ebnQgAMPtJhTqdDjExMVIi0K9fP+Tm5totEQAApVKJ6Oho5Ofn4+LFi8jPz8eECRPsdnwiR+FtAiJyuaysLOn9/Pnz7X782tpaTJo0CYcOHQIA3HbbbThw4ABCQkLsXpZx/JmZmXY/PpEj8DYBEbmcUqlEaWkpFAoFKisr4ednv05Lg8GAJ554Anv27AEAhIWF4auvvnLY1L+6ujoEBgZCp9NBqVSiuLjYIeUQ2RN7BojIpTQaDUpLSwEAAwYMsGsiAADz5s2TEoGuXbvi4MGDDl0DwM/PD/379wfQMIZAq9U6rCwie2EyQEQuZTwbIDIy0q7HXrx4MdLT0wEAISEhOHDgAG677Ta7ltEc4/OwdbYDkTMwGSAilyooKJDeDx482G7HXblyJVJSUgAAN910E3Jzc+02jbAtxudhfH5E7orJABG5VGFhofTeXj0DmzZtQnJyMgDA398fH3/8MYYPH26XY5vD+DxOnDjhtHKJrMVkgIhc6vr169J7e9zL37ZtGxYvXgyg4f793r17MWrUKJuPawnj86ioqHBq2UTWYDJARC6l0+mk97bO+d+7dy/mzp0LIQR8fHywY8cOPPTQQ2btm5mZiXnz5mHw4MHw9/eHTCbDO++8Y1UcxudhfH5E7oqLDhGRSzUuQQwAcrnc6uPk5uYiPj4eBoMBALB582Y88cQTZu+/fPlyqNVq3HzzzbjlllukRZCs4e/vL72vqamx+jhEzsKeASJyKeMEwDgxsMSXX36JyZMno7a2FgDwyiuvYN68eRYdIz09HRcvXsS1a9eQlJRkVRyNjBMA48SAyF2xZ4CIXOrGLnVLPzyPHTuGiRMnorq6GgCwbNkyLF261OI4xowZY/E+LbHnrQ8iZ2DPABG5VOfOnaX3ZWVlFu1bVFSE6OhoVFZWAgCefvpprFmzxq7xWcP4PEJDQ10YCZF5mAwQkUsNGDBAem/JnPySkhKMHTtWmo0wY8YMvPHGG/YOzyrG5zFw4EAXRkJkHiYDRORSxnPyjx07ZtY+V65cwZgxY/Djjz8CACZNmoRt27ZBJpM5JEZLGZ+HvVdVJHIEjhkgIpcaNGiQ9N6cngGNRoMxY8bg4sWLAIC+ffvixRdfxHfffWd2mWFhYQgKCrI4VnMZn4fx+RG5KyYDRORSISEh6N27N0pLS1FYWIi6urpWH1b0ySef4Pvvv5e+Lioqsvjq+8iRIxgyZIjVMbemrq4OJ0+eBNDwNMbg4GCHlENkT7xNQEQuN3ToUAANo/Dz8/Nb3fb06dM2ldWhQweHPqMgLy9Pmk3gqISDyN6YDBCRy02bNk16v3nz5la3Xbt2LYQQVr/0er1D5/4bxx8fH++wcojsickAEbnU1atX8cEHH0hT8PLz81FSUuLiqKxTUlIi9Wz06tUL0dHRLo6IyDwcM0BELjVz5kx88skn0tdCCLz99tt45ZVXnBpHeno6vv76awD/uxWRnp6OQ4cOAQBGjBiB2bNnt3qMrVu3Su+TkpLg6+vrmGCJ7EwmhBCuDoKIvNNnn33W7Mp/oaGhKC0tRadOnZwWy8yZM7Fjx44Wfz5jxoxWH1yk1WqhVCpRUVEBuVyOy5cvo0uXLg6IlMj+mAwQkUsYDAYMHTq0xemEKpUK27Ztc3JU1lOpVNi+fTsAICEhATt37nRxRETmYzJA5CU0Gg2OHz+OgoICFBYW4vr169DpdNDr9ZDL5VAoFOjcuTMGDBiAyMhIDBo0CCEhIQ6LZ/fu3Xj88cdb3SY3NxcxMTEOi8FecnNzMWHCBABAYGAgioqK0LNnTxdHRWQ+JgNE7VR9fT3y8vKQlZWFI0eOoLS01OJj9O7dG0OHDsW0adMQExNjt3vger0ed911V5sxde/eHUVFRU69XWAprVaLiIgIXLlyBQCQlpbW5tgCInfDZIConbl27Rq2bduGrVu3Qq1W2+244eHhSEpKwqxZs2y+F/7mm2/imWeeMWvbGTNmYPv27W6z1LAxIQRmzpwp3RKIiopCXl6eW8ZK1BomA0TtRFlZGZYtW4a9e/dCr9eb/EyhUEjd/4MHD0ZkZCTCwsKgUCggl8uh1+uh0+mgVqtRUFAgvQoLC00exwsAcrkcsbGxWLNmDcLCwiyO87///S+USiV+/vlns/dJTk7GihUrLC7L0ZKTk7Fy5UoAvD1AHk4QkUczGAwiNTVVBAYGCgDSSyaTiZiYGJGdnS1qa2utOnZtba3Izs4WMTExQiaTmRw/MDBQpKWlCYPBYNExX3rpJZPjmPvauHGjVefgKBs3bjSJLysry9UhEVmNyQCRB1Or1WLcuHEmH0qhoaFi6dKloqSkxK5lFRcXi6VLl4rQ0FCT8saNGyfUarVZx/jxxx9FQECAVckAAJGcnGxx8mFvBoNBrFixwiSuTZs2uTQmIlsxGSDyUJmZmU16A1QqldBqtQ4tV6PRCJVK1aSXwJwr4zlz5lidCDS+pk+fLjQajUPPsSUajUZMnz7dJJ7Vq1e7JBYie2IyQOSBXn/9dZMPpB49eoi8vDynxpCbmyu6d+9uEkdKSkqL2x85csSqD/+OHTuKp556yuR73bt3F7m5uc47WdHy+aalpYmwsDCxcuVKl/daEFmLyQCRh1m1apXJB9KMGTMc3hvQEkuulCdNmtTqh76vr6/o06ePGD9+vFi4cKHYvHmzOHjwoLh27ZoQouWeEEf3Emg0GpGYmGhSblBQkNQT8qc//Un6/pIlS5gQkEdiMkDkQW7sEXCHq1GDwSCSk5Pb7CH49NNPhb+/v5DL5WLw4MFizpw54tVXXxUff/yx+O6770RNTU2bZbU0RmLJkiWiuLjYrudVXFwslixZ0mSMRFRUlCgrK5O227t3r8ngyr/85S8u/z8hshSTASIPkZmZydH1oiH5SEtLa3b2RHR0tNi/f79Nsyf2798voqOjm/RcBAUFifT09GY/6FNTU5sMdCTyJFxngMgDlJWVISIiApWVlQA8Z979mTNnrFqLwBxlZWVYvnw59uzZ0+y6Cv379292XQV/f3/U1NRAp9OhrKwMBQUFOHbsGAoKCnDy5MkW11VYu3Ztq2sIbN68GQsWLJC+Xrt2LV588UX7njSRo7g6GyGi1hkMBjF27FiTMQLu2g1tMBhMxhBERUU5PNby8nKxYcMGER4ebvNMBeNXr169xIYNG0R5ebnZsWzatMnkGK+++qoDz5zIftgzQOTm0tLSMHfuXABAjx49cObMGa7V34z6+nrk5+cjMzMTR48eRUlJicXHUCqVGDJkCOLj4xEdHW3Vsxg2btyIpUuXSl9v2rQJzz77rMXHIXImJgNEbuzG2wOe8hS/vLw8jB8/HoDjbxe0RKvVSk9pPHHiBCoqKqDT6VBTUwN/f38oFAqEhoZi4MCB0lMag4OD7VL2unXrsGzZMunrt956C/Pnz7fLsYkcgckAkRubPn06du3aBQBQqVTYtm2biyMyn0qlwvbt2wEACQkJ0sN8vIXx+AkASE1NxZw5c1wYEVHLmAwQuany8nL07NkTer0eoaGhKC0tten2QHV1NcLCwvDzzz9j4MCBOH78eKvbf//99xg+fDh++eUXdOrUCd9++y3uvPNOs8vTarVQKpWoqKiAXC7H5cuXbX7aoScRQmDZsmVYv349AEAmkyEjIwMzZ850bWBEzfBxdQBE1LyMjAxplPysWbNsHifQsWNHabT7iRMn8Nlnn7W4bUVFBSZOnIhffvkFvr6+2L17t0WJAAAEBwdDpVIBAPR6PTIyMqwP3gPJZDKsXbsWS5YsAdCQHKhUKmRlZbk4MqKm2DNA5Ibq6+uhVCqhVqshk8lw4cIFKJVKm4/7888/IywsDNXV1YiKikJ+fn6Tberq6hAVFYXPP/8cgG0D4EpKStCnTx8AQK9evVBcXGzVoDxPJoTAwoUL8be//Q0A4OPjg927d2PKlCkujozof9gzQOSG8vLyoFarAQDR0dF2SQQA4Oabb0ZiYiIA4JNPPsGpU6eabPPss89KicCcOXNsGgmvVCoRHR0NALh48WKzyUd7J5PJsGnTJjz55JMAAIPBgMcffxwffvihiyMj+h8mA0RuyLgr2d6j0BcvXixdnW/cuNHkZ1u3bsXmzZsBACNHjsRbb71lc3nG8WdmZtp8PE8kk8nw97//HbNmzQLQ0PMTGxuL7OxsF0dG1IC3CYjckFKpRGlpKRQKBSorK+Hn52fX40+dOhXvvfceOnTogJKSEvTs2RNffPEFxo0bh7q6OvTu3RtHjhxB586dbS6rrq4OgYGB0Ol0UCqVKC4utsMZeCaDwYDExERpZoVcLsfHH38s9Z4QuQp7BojcjEajQWlpKQBgwIABdk8EAEiL4tTW1mLTpk0oKSnBlClTUFdXh6CgIGRnZ9slEQAAPz8/9O/fH0DDGAKtVmuX43oiHx8fZGRk4IknngDQMLDykUcewcGDB10cGXk7JgNEbsZ4yl9kZKRDyhgyZAjuv/9+AA0rBE6cOBHXr1+XZg788Y9/tGt5xufR1pTG9s7X1xc7duzA5MmTAQA1NTV46KGHcOjQIdcGRl6NyQCRmykoKJDeDx482GHlNPYOVFZW4rvvvgMAvPrqqw5Z4dD4PIzPz1v5+fnh3XffxcMPPwygYQ2IBx98EF9//bWLIyNvxWSAyM0UFhZK7x3VMwAA48ePN1kieNasWVi0aJFDyjI+jxMnTjikDE/ToUMH7NmzBxMmTAAA/Pbbbxg/fjy+/fZbF0dG3ojJAJGbuX79uvTekev5p6amoqysTPr6z3/+s8PKMj6PiooKh5Xjafz9/fH+++8jKioKQEMvTVRUFI4dO+biyMjbMBkgcjM6nU56r1AoHFLG559/Lq1G2Gjjxo1w1OQi4/MwPj9q+N18+OGHGDVqFADgv//9L8aOHcseFHIqJgNEbqZxCWKgYeqZvV24cAGTJ09GXV0dgoODpYfnfPfdd8jJybF7eUDDFXCjmpoah5ThyTp27Ij9+/fjvvvuA9DwXIexY8fi9OnTLo6MvAWTASI3Y5wAGCcG9qDVajFx4kRoNBr4+fnhvffew6uvvorAwEAAwCuvvGLX8hoZJwDGiQH9z+9+9zvk5ORIt2uuX7+O0aNH4+zZsy6OjLwBkwEiN+OoLvW6ujpMmTIF586dA9DwzIExY8agU6dOmDt3LgDg66+/dsgANmfc+mgPAgMDkZeXh6FDhwIArl27htGjR+P8+fMujozaOyYDRG7GeLEf4wF+tnr22WelxW3mz59vMmZg0aJF6NChA4CG6YX2ZnweoaGhdj9+exIUFIRPPvkEgwYNAgBcvXoVo0aNQklJiYsjo/aMyQCRmxkwYID03l5z8v/+979LzxwYM2YM3njjDZOfd+/eXVoV76OPPsKFCxfsUm4j4/MYOHCgXY/dHgUHB+PTTz+VVm68cuUKRo0ahYsXLza7fVFREfbs2YPa2lonRkntCZMBIjdjPCffHlPMDhw4gIULFwIAbr/9duzdu7fZJY6XLl0KmUwGg8GA1157zeZyjRmfhyPXTmhPQkND8emnn6Jv374AGnpXRo0ahUuXLplst2/fPgwYMABxcXFYt26dK0KldoDJAJGbaeweBmzvGfj+++8xdepU1NfXIyQkBNnZ2QgJCWl22759+2L8+PEAgB07dqC8vNymso0Zn4fx+VHrunTpgs8++wx33nknAOCHH37AAw88gCtXrgAAdu/ejdjYWNTV1QEA3nnnHYdND6X2jckAkZsJCQlB7969ATSsRtjY0FuqoqICEydOxC+//AI/Pz/s3bsXt99+e6v7PP/88wAaBvy9+eabVpV7o7q6Opw8eRJAw9MYg4OD7XJcb9G1a1d8/vnnuO222wA0POxp9OjRePPNNzFt2jTU19dL2168eNFkBUsiczEZIHJDjaPJdTod8vPzLd6/trYWkyZNkh4X/MYbb2DMmDFt7nffffdh+PDhAIDNmzfjt99+s7jsG+Xl5UmzCYYMGWLz8bzRLbfcgs8//1xKEs+dO4dnnnkGBoOhybYffPCBs8OjdkAm2KdE5HZycnIwceJEAEBMTAxyc3NdHJH1YmJipIQmJydHWoufLKdWqzFo0KBWl3S+6667uDYBWYzJAJEbqq+vh1KphFqthkwmw4ULF6BUKl0dlsVKSkrQp08fAECvXr1QXFwMX19fF0fluf7+97/j6aefbnO7s2fP4q677nJCRNRe8DYBkRvy9fVFUlISAEAIgbffftvFEVln69at0vukpCQmAjZISUkxKxEAgA8//NDB0VB7w54BIjd17do19OjRA3q9HqGhoSgtLUWnTp1cHZbZtFotlEolKioqIJfLcfnyZXTp0sXVYXmklJQULF682OztIyMj+eRDsgh7BojcVJcuXRAbGwugYWaAJR8G7mDx4sXSve3Y2FgmAlaqqanBX/7yF4v2KSgogFqtdlBE1B6xZ4DIjZWVlaFv37749ddfAQAjR46Ev78/dDod9Ho95HI5FAoFOnfujAEDBiAyMhKDBg1qcS0BZ8nNzZUGCgYGBqKoqAg9e/Z0aUyeLDo6Gp988olF+6SkpEiLTdlCo9Hg+PHjKCgoQGFhIa5fv+729Y8sx2SAyM3U19cjLy8PWVlZOHLkCEpLSy0+Ru/evTF06FBMmzYNMTExTr1Xr9VqERERIS2Mk5aWhtmzZzut/Paovr4eX331FXbv3o33338f169fb3Ofe+65B19//bVVZXly/SPrMBkgchPXrl3Dtm3bsHXrVrt28YaHhyMpKQmzZs1yeFe9EAIzZ87Ezp07AQBRUVHIy8uDTCZzaLnepLa2FgcPHsQ//vEPfPjhh1KvUXMuX76M7t27m3Xc9lD/yHpMBohcrKysDMuWLcPevXuh1+tNfqZQKKTu18GDByMyMhJhYWFQKBSQy+XQ6/XQ6XRQq9UoKCiQXoWFhU0efyyXyxEbG4s1a9YgLCzMIeeSnJyMlStXAuDtAWeorq5Gbm4u/vGPfyAnJwc1NTUmP1+2bBnWrFnT6jHaU/0jGwgicgmDwSBSU1NFYGCgACC9ZDKZiImJEdnZ2aK2ttaqY9fW1ors7GwRExMjZDKZyfEDAwNFWlqaMBgMdj2fjRs3mpSTlZVl1+NT63755Rexc+dOMXz4cKkeffbZZy1u397qH9mGyQCRC6jVajFu3DiTRjI0NFQsXbpUlJSU2LWs4uJisXTpUhEaGmpS3rhx44Rarbb5+AaDQaxYscLk2Js2bbJD5GStn3/+WVy/fr3Fn7en+kf2wWSAyMkyMzObXI2pVCqh1WodWq5GoxEqlarJVZotV/AajUZMnz7d5JirV6+2Y9Rkb+2p/pH9MBkgcqLXX3/dpDHs0aOHyMvLc2oMubm5onv37iZxpKSkuOw45Dztqf6RfTEZIHKSVatWmTSAM2bMcPjVWEtsuaLXaDQiMTHRZN+goCBe4bm59lL/yDGYDBA5wY1XZCtXrnT5ACqDwSCSk5PNvkIrLi4WS5YsaXLvNyoqSpSVlTkvcLJYe6h/5FhMBogcLDMz06TB27hxo6tDMtHaLIDa2lqxf/9+ER0dbbJNY29Aenq6yz9UqHWeXP/IeZgMEDmQWq02GayVnJzs6pCaZTwbQKFQiISEBDFs2DChUCiaJAFyuVwkJCSwN8ADeGL9CwwM5CwDF2AyQOQgBoNBjB071uQerbteRRsMhib3cG989erVS2zYsEGUl5e7OlwygyfXv6ioKLeNtb3iCoREDpKWloa5c+cCAHr06IEzZ8649SOIb3ymAAAolUoMGTIE8fHxiI6O5hrzHsTT6x+faeFcTAaIHKCsrAwRERGorKwE0PAUv5iYGBdH1ba8vDyMHz8eQMNywmfOnOHSsR6I9Y8s5ePqAIjao+XLl0sNsUql8oiGGABiYmKQmJgIAKisrMTy5ctdHBFZg/WPLObauxRE7c9PP/0k5HK5tMSrOXO5t2zZYnJ/PiwszKyycnJymtzbv3z5sk3xazQaafqgXC7nGAEPY039E0KIdevWtTpmpK3X3/72N7vEz/rnGuwZILKzjIwM6elvs2bNMus+bWFhocnXly5davXRtEDDc+eff/55k+916dLF7EfWtiQ4OBgqlQoAoNfrkZGRYdPxyLmsqX8AcPz4cZvK7devn037N2L9cw2OGSCyo/r6eiiVSqjVashkMly4cAFKpbLN/YYPH47Dhw8jICAAVVVVAIDDhw9j6NChLe6TmpqKefPmSY+SBYAxY8bg008/tfk8SkpK0KdPHwBAr169UFxczMGDHsDa+gcApaWlUt1rS2VlJWJjY3Hp0iUADfX3iy++gEKhsDp2Y6x/LuDqrgmi9iQ7O1vqNo2JiTFrn/r6ehEQECAAiEceeUR6n5GR0eI+lZWVolu3bgKAmDx5slTmkiVL7HUqJgsN5eTk2O245DjW1D9LVVdXi/vvv18qp1+/fqKiosLu5bD+ORdvExDZUVZWlvR+/vz5Zu1z/vx56Yps4MCB6Nu3LwDg7NmzLe7z6quv4urVqwgNDcWECROk7w8YMMCKqJtnHH9mZqbdjkuOY039s0RtbS0mTZqEQ4cOAQBuu+02HDhwACEhIXYvi/XPuZgMENnRkSNHAAAKhQLR0dFm7WM8XmDAgAG4++67AQBFRUXNbv+f//wHr732GgDgpZdewsWLF6WfDRw40IqomxcTEyN1+x49etRuxyXHsab+mctgMCAhIQG5ubkAgLCwMBw8eBBdu3a1azmNWP+ci8kAkZ1oNBqUlpYCaPhQ9/PzM2u/G5OBxoFYLSUDL7/8Mn777TcolUosWLBA2r9jx4644447rD+BG/j5+aF///4AGu7harVaux2b7M/a+meuefPmYc+ePQCArl274uDBgw5dA4D1z7mYDBDZifFo7MjISLP3a/wwDwkJQVhYmJQMNDej4MyZM3jnnXcAABs2bECHDh2k/SMiIuw+yMr4PGwdbU6OZW39M8fixYuRnp4OoKGeHjhwALfddptdy2gO65/zMBkgspOCggLp/eDBg83er/HDvPEqqDEZEEI0GTewZMkS1NfX409/+hMmT54MrVYLtVoNwL7jBRoZn4fx+ZH7sbb+tWXlypVISUkBANx0003Izc212zTCtrD+OQ+TASI7Me7uN/fK7OrVq/jpp58A/O/DvHPnzrjlllsAmN4q+PTTT/HJJ58AADZu3NikTEckA8bnceLECbsfn+zHmvrXlk2bNiE5ORkA4O/vj48//hjDhw+3y7HNwfrnPEwGiOzk+vXr0ntz76UaN+CNPQPA/3oHGnsGDAYDli5dCgCYNGkS/vznPzfZ356DBxsZn0dFRYXdj0/2Y039a822bduwePFiAA337/fu3YtRo0bZfFxLsP45D5MBIjvR6XTSe3MXX2npyv7GQYQ7d+7EyZMn0aFDB2zYsKHJ/j4+Pk26bjMzMzFv3jwMHjwY/v7+kMlk0ngDcxmfh/H5kfuxpv61ZO/evZg7dy6EEPDx8cGOHTvw0EMPtbnflStXsGnTJowbNw5hYWGQy+Xo1q0bJk2ahMOHD1scB+uf89h3uCmRF2tcBRAA5HK5Wfs0fph36NABf/zjH6XvG08vrK6ulh7YMn/+fGllNuP9+/Tpg9/97ncmx16+fDnUajVuvvlm3HLLLdLYAkv4+/tL72tqaizen5zHmvrXnNzcXMTHx8NgMAAANm/ejCeeeMKsfd9880389a9/hVKpxLhx49ClSxdcuHABH330ET766CO8++67iI2NNTsW1j/nYc8AkZ0YN8DGDXNrGj/M77rrLpP9jWcUrFy5EleuXEFwcDBeeuklkzIabyM0N14gPT0dFy9exLVr15CUlGTp6QAwbYCNG2ZyP9bUvxt9+eWXmDx5MmprawEAr7zyCubNm2f2/kOHDsWhQ4dQXFyM9PR0rF+/Hu+//z6++OIL+Pr64sknn7ToQ531z3mYDBDZiaVdmlVVVbhw4QKAph/md911Fzp06AAhBF599VUAwIsvvojOnTtL25w9e1ZqtJtLBsaMGYPw8HBLT8OEPbueybFs7VI/duwYJk6ciOrqagDAsmXLpHEq5nrssccwcuTIJt+/99578cADD0Cj0eD06dNmH4/1z3mYDBDZifEHdVlZWZvbnzp1SuqKvfHDXC6XSwsIGQwGhIeH45lnnjHZxtGDBwHT8wgNDXVIGWQfltY/Y0VFRYiOjkZlZSUA4Omnn8aaNWvsGl+HDh0AwKLFkFj/nIfJAJGdGH+gmzMnuqWZBI0GDRoEf39/+Pv7Y/369U26SR09rRAwPQ9HJRxkH5bWv0YlJSUYO3asNBthxowZeOONN+waW1lZGQ4ePIhbbrlFGg9jDtY/52EyQGQnxnOijx071ub2bX2Y79ixAzqdDjqdDo8//niL+3ft2hXdunWzOF5zGJ+HvVe1I/uytP4BDaP/x4wZgx9//BFAw7TVbdu2QSaT2S2u2tpaJCQkoKamBn/9618tWiWT9c95OJuAyE4GDRokvbekZ6Bnz55WdYGePHkSgON6BQDT8zA+P3I/ltY/jUaDMWPGSA+66tu3L1588UV89913ZpcZFhaGoKCgFn9uMBgwc+ZM/Otf/8KcOXOQkJBg9rEB1j9nYjJAZCchISHo3bs3SktLUVhYiLq6uhbvjxoMBmkgVXO3CNpy8eJF6cEtjkoG6urqpIRDqVQiODjYIeWQfVhS/wDgk08+wffffy99XVRUZPHV95EjRzBkyJBmf2YwGKBSqfDuu+8iPj4eW7dutejYrH/OxdsERDYSQkjvhw4dCqBhFHR+fn6L+5w/fx5VVVUArPswd8Z4gby8PGk0d0sNPrkXc+sfAItG9TenQ4cOLT6jwGAwIDExETt27MDjjz+Od955Bz4+ln3csP45F5MBIitoNBps27YNY8eOhVwux9ixY1FXV4dp06ZJ22zevLnF/e+8804IISCEwOrVqy0u/5FHHpH2j4uLs+oc2mIcf3x8vEPKIPsyt/4BwNq1a6U6ZM1Lr9c3O/e/MRHYuXMnYmNjsWvXLquepsn652SCiMxSWVkpsrKyxMSJE0WHDh0EAJPXr7/+Kurq6kR4eLgAIGQymSguLnZ12EIIIdavXy8AiO3bt5u1fXFxsXRevXr1EnV1dY4NkOzC1fWvvr5ezJgxQwAQU6ZMEbW1tVYdh/XP+ThmgKgV1dXVyMvLw+7du5GTkyMtyGLsD3/4A5KTk6XlgJOSkvCXv/wFQgi8/fbbeOWVV5wdNoCGFQi//vprAP/rEk5PT8ehQ4cAACNGjMDs2bOb3df4/m5SUpJVV3bkfL6+vi6tf6tWrcKOHTtw00034fbbb292rYJHHnmkzVtbrH8u4OpshMjd6PV68c9//lMkJCSIwMDAJj0AAMStt94qFi1aJA4fPiwMBoPJ/uXl5UIulwsAIjQ0VGi1WpecR+MVWkuvGTNmNLufRqMRoaGhAoCQy+WivLzcuYGTTVxZ/9qqczCjd4r1zzWYDBCJhu7Vzz77TMyZM0dqiG583XzzzSIpKUkcOnRI1NfXt3q8hIQEaT+VSuWks7CPxMREKfaEhARXh0NWYP0jS8mEMBoKTR5Fo9Hg+PHjKCgoQGFhIa5fvw6dTge9Xg+5XA6FQoHOnTtjwIABiIyMxKBBgxASEuLqsN2GEALffvstdu/ejb179+Lq1atNtgkKCsJjjz2GuLg4jBo1SlpStS1lZWWIiIiQlnfNzc1FTEyMXeN3hNzcXEyYMAEAEBgYiKKiIvTs2bPZbVn/3Jc31D+yMxcnI2SBuro6kZ2dLeLi4kTv3r3b7I5r7tW7d28RFxcnsrOzvXJQjsFgEMePHxfPP/+8NNDqxldAQICIi4sTH330kaiurra6rNTUVOmY3bt3d9ntAnNpNBrRvXt3Kea0tDSTn7P+eZb2Vv/IsZgMeIDy8nKxfv36Fj+8rH2Fh4eL9evXe8U9ubNnz4qXX35Z3H777c3+LuRyuXjkkUfE7t27xa+//mqXMg0Ggxg3bpzJPfobxxe4C4PBIKZPny7FGhUVJcXK+ueZ2kv9I+dgMuDG1Gq1iI+PlwYDGb8UCoUYPny4WLBggdi+fbs4deqU0Gq1QqfTCYPBIHQ6ndBqteLkyZMiIyNDLFiwQAwfPlwoFIpmPwgTEhKEWq129SnbVUlJiVi3bp3o169fsx9Gvr6+IioqSmzfvl1oNBqHxKBWq00GISYnJzukHFutWLFCijEwMFCUlZWx/rUDnlz/yLmYDLghg8EgUlNTm4xkl8lkIiYmRmRnZ1s9f7e2tlZkZ2eLmJgYIZPJTI4fGBgo0tLSPDojv3z5skhJSRHDhg1rNgGQyWRi5MiRYsuWLU67Is3MzDSJYePGjU4p11wbN240iS8zM5P1rx3xtPqXlZXl6pC8EpMBN6NWq0269oCG6UFLly4VJSUldi2ruLhYLF26tMno+XHjxnnUVVp5ebnYsmWLGDlyZJMPmMbXsGHDREpKirh8+bJLYkxJSTGJJzk52eUfegaDweSKDIBYsWIF61875Cn1b9OmTS6NyZsxGXAjmZmZTa7GVCqVwwf+aDQaoVKpmlylOSpD/+2338R///tfm46h1WrF9u3bRVRUlPD19W02Aejfv79Yv3693T/ErLV69WqT+KZPn+6w2xNt0Wg0JvdoAYjJkyd7Rf3zVu5e/1avXu2SWKgBkwE38frrr5v8YfTo0UPk5eU5NYbc3FyT0bwAREpKil3L+Pbbb0WXLl2EXC4Xhw8ftmjfX3/9VezevVs88sgjzd7HBiBuv/128fLLL4uzZ8/aNW57ufH/uXv37iI3N9epMTT3//zwww97Rf3zdu5a//j/7HpMBtzAqlWrTP4wZsyY4bJpQI7M2I8ePSo6deokHXfq1Klt7qPT6cRHH30k4uLiREBAQLMJQFhYmHj++edFQUGBy7s+zdFSD5Cjr9I0Go3Jgi4ARFBQkJg8ebJX1D9q4G71jz1A7oHJgIvdmKmvXLnS5R9oBoNBJCcn2zVzP378uAgJCTE5ZseOHUVlZWWTbfV6vcjPzxczZ840SR6MX926dRPPPPOM+Pe//+3y35c1WhobsmTJErs/XKa4uFgsWbKkyb35qKgo8fLLL3tF/SNT7lL/OGvAfTAZcCFvGeV76tQp0blz52Y/1N99910hRMPTzr788kuRlJQkbr755ma3DQ0NFXPmzBGfffZZu1iwxmAwiLS0tGZH7UdHR4v9+/fbNGp///79Ijo6usnvMSgoSKSnp4tdu3Z5Rf2j5rm6/rk66SRTTAZcxFPn/1o6yruoqEh06dKl2Q93AOLee+8VixYtErfeemuzPw8MDBQJCQnin//8p6ipqXHQWbqWWq0WCQkJLc7nHzZsmJg/f77IyMgQJ0+eFBqNRlRXVwuDwSCqq6uFRqOR5vPPnz9fDBs2rNX5/I1rCHhD/aO2uaL+kfthMuACBoNBjB071uQerbtmybasDPbdd9+Jrl27tpgItPRSKBRiypQpYt++faKqqsrBZ+g+ysvLxYYNG+y+0l+vXr3Ehg0bpHUVvKX+kWWcVf/IPTEZcAHjNcN79OjRLtcMP3/+vLjlllvMbjA6dOggJk6cKLKysmyedujp6urqRE5OjoiLixNKpdKqBlipVIq4uDiRk5PT5JaKN9Q/sp6j6x+5Jz610Mk89WlieXl5GD9+PICGp4mdOXMGYWFhzW5bUlKCkSNH4sqVK2Ydu2/fvvjXv/6F0NBQu8Xbnmi1WunpgCdOnEBFRQV0Oh1qamrg7+8PhUKB0NBQDBw4UHo6YHBwcLPH8ob6R/Zlz/pHbszV2Yi3ae/PGT9z5kyTWQNtvXx9fcVPP/3k5LPxTu29/pHjGAwGUVpayts07RSTASf66aefpEE6oaGhFnXPbtmypcUP04CAAHHHHXeIpKQk8f333zssfo1GI00Pksvlzd4DbGkqYFuvt956y2FxUwNb6l+jiooKcdNNN0m3GMwZbV5bWyuNUZDJZGLPnj3WhG9W/SPHiY+PFwDE0qVLXR0KOYCPQ7obqFkZGRnQ6/UAgFmzZqFTp05m71tYWNjiz6qqqnDu3Dls3boV/fv3x759+2wNtVnBwcFQqVQAAL1ej4yMjCbb6HQ6q469e/dum2KjttlS/xqFhIRg9uzZAIDLly/j/fffb3OfhQsX4tNPPwUArFixAlOnTrW4XMC8+keOIYTAe++9BwDS/yW1M67ORrxFXV2dNEpXJpNZvLBH41P4OnXqJE6fPi29CgoKxJ49e8Sf/vQnk56CH3/80SHnUVxcbDJK+MbBQf/+97/Fo48+Kh566CExYsSIFqcMNveydk4ztc3W+mdMrVYLPz8/ATQ8AKo1mzdvlv5/Y2NjrS6zUVv1jxyjsrJS+r0/8MADrg6HHIDJgJNkZ2dLf0wxMTEW7VtfXy8txTtixIgWtxk8eLBUhiNXbDNeSCQnJ6fN7X/77TdRVFQksrOzxRtvvCGeffZZMXHiRNG3b1/RsWNHAUCMHTuW9yIdyJb615zGLmMA4ptvvml2m4MHD0pJw5AhQ+w2TdTS+ke2++GHH6TfuTnLiJPnYTLgJHFxcdIfU3Z2tkX7fvfdd9K+8+fPb3G79PR0abvZs2fbGnKL9u/fL5UTFxdn07EMBoPbT21rD2ypf805depUq1f8586dkwaSdu/eXfznP/+xucxG9qx/ZJ4jR46Y1QaR5+KYASc5cuQIAEChUCA6OtqifY3HC9x9990tbhceHi69r6ursyxAC8TExEChUAAAjh49atOxZDKZVfeuyTK21L/m3H333dKUxH379uHy5cvSz7RaLSZOnAiNRoOAgADs378ft9xyi81lNrJn/SPz/Pzzz9L7m2++2YWRkKMwGXACjUaD0tJSAMCAAQPg5+dn0f7GyUC/fv1a3O7atWvS+969e1sWpAX8/PzQv39/AA1rCmi1WoeVRbaztf615PnnnwfQkHj+/e9/l95PmTIF58+fh0wmw86dOzFo0CC7lNeI9c/5jJOBLl26uDASchQmA05w/Phx6X1kZKTF+zcmAzKZDBERES1u9+GHH0rvH374YYvLsYTxeRifH7kfW+tfS+6//34MHToUAJCWloaqqio8++yzOHjwIABg1apVmDRpkt3KM8b65zjbtm1DVFQUpkyZgieffBIvvfQSPvjgA+nnlZWVuHTpEqqrq10YJdmbfS4RqFUFBQXS+8GDB1u8f2MyEB4ejqCgoGa32bdvnzTNa9q0aa32INiD8XkUFBRg1KhRDi2PrGdr/WvN0qVLMWXKFFRUVGDixIn4/PPPAQCPP/44li9fbteyjLH+OUZtbS3mzJkD0crCtC+++CJefPFFAMDvfvc7/OEPf8Cbb76J+++/30lRkiOwZ8AJjLv5Lb0yu3r1Kn766ScATccL1NTU4PTp01i4cCGmTp0KIQRGjRqF1NRUm2Nui/F5nDhxwuHlkfVsqX9teeyxx9CnTx8AkBKBYcOGOXwNANY/x/Dz84NSqTR7+99++w1nzpzBW2+95cCoyBmYDDjB9evXpfeWrqdu3JBnZ2dDJpNJL4VCgX79+uGNN97AkCFDkJaWhgMHDiAgIMBeobfI+DwqKiocXh5Zz5b61xYfHx8sWbJE+rpHjx746KOPpAF+jsL65xgymQzz5s2zeL/G50aQ52Iy4ATGq/JZ2ki2tvKgMa1Wi9GjR8PX17fFbTIzMzFv3jwMHjwY/v7+kMlkeOeddyyKp5HxeVi76iA5hy31zxzGV5JJSUno1q2b3cu4Eeuf48ycORNyudzs7YcNG4YZM2Y4MCJyBiYDTtC4BCwAi/7IANNk4KuvvsLp06dx+vRpHD58GLt27cLAgQMBAOfOnUNiYmKrx1q+fDlSU1OhVqttnurl7+8vva+pqbHpWORYttQ/cxjX0QEDBtj9+M1h/XOcm2++GZMnTzZrWx8fH2zevBk+Pvwo8XT8H3QC4wbYuGE2R2ND27VrV4wYMQIRERGIiIjA0KFDER8fj//7v//DXXfdBQD48ssvW+1JSE9Px8WLF3Ht2jUkJSVZfB7GjBtg44aZ3I8t9c8cJ0+elN47Kxlg/XMsc9uHJ5980u5TR8k1mAw4gbVdmlVVVbhw4QKAlhvZjh07YtmyZdLXWVlZLR5vzJgxJgsT2cLRXc9kP47uUm9MQLt06YLu3bvb/fjNYf1zrBEjRkgXGS3p0qULVq9e7aSIyNGYDDhB586dpfdlZWVm73fq1CkYDAYArV9xPfroo+jYsSMAmMwHdiTj8wgNDXVKmWQda+ufOWpqavD9998DgLQQkDOw/jmWTCZrs3fglVdeQUhIiJMiIkdjMuAExh/kxnO+22LuvdiAgACMHj0aAFBaWoqzZ89aGqLFjM+jcdwCuSdr6585ioqKpKWvnXWLAGD9c4aEhATpIuNG99xzD6ZPn+7kiMiRmAw4gfGc6GPHjpm9nyUDsyZMmCC9z87ONrsMaxmfh73nrpN9WVv/zOGKwYMA658zhISEIDY2tsn3fXx88NZbb3HQYDvD/00nMB5gY03PQEBAAG6//fZWtzVOBnJyciwL0ArG58EBRO7N2vpnDlcMHgRY/5yluVsFTz31lFNvCZFzMBlwgpCQEOnBQYWFhWY9UdBgMOD06dMAGlYebCsL79mzp7QE8TfffGOy0Iy91dXVSR8CSqUSwcHBDiuLbGdN/TNXY8KqUChw55132u24rWH9c56hQ4eiR48e0tdBQUFYtWqVCyMiR2Ey4CSND3TR6XTIz89vc/vz58+jqqoKgPlXXI29A/X19cjNzbUuUDPk5eVJo7mHDBnisHLIfiytf+Y6deoUACAiIqLVBa/sifXPeWQymcmaA0uXLuUjx9spPqjISaZNm4bdu3cDADZv3owHH3yw1e3vvPPOVh8W0px169Zh3bp1Vsdors2bN0vv4+PjHV4e2c7S+mcujUZjl+NYwtL6V1VVhUuXLqGsrMzk38b3vr6+ePvttzFixAhHhu2xXn31VdTW1qJTp04OffgUuZZMWPqJQ1apr6+HUqmEWq2GTCbDhQsXLHogiL1t2LABf/nLX7B9+3bMnDnT7P1KSkqkB9P06tULxcXFTrsiJOu5W/2zVmv1z2Aw4IUXXsCJEyfg5+eHq1evoqyszKxnFyQmJjr84UpE7oy3CZzE19dXGowjhMDbb7/t9BjS09Mxc+ZMzJw5E++9916T76Wnp7d5jK1bt0rvk5KSmAh4CHeof/bQWv3buHEjXn31VRw8eBD5+fkoLCw0+yFGjbdRiLwVewac6Nq1a+jRowf0ej1CQ0NRWlrq1PtvM2fOxI4dO1r8+YwZM1p9cJFWq4VSqURFRQXkcjkuX76MLl26OCBScgRX1z9btVX/9u7d2+xUuLbI5XL8+OOPXLyIvBp7BpyoS5cuUmNVUVGBxYsXO7X8d955B0KIFl9tPcFw8eLF0pVWbGwsEwEP4+r6Z6u26t/UqVPx4osvWnzcBx98kIkAeT32DDhZWVkZIiIiUFlZCQDIzc1FTEyMS2PSaDQ4fvw4CgoKUFhYiOvXr0On00Gv10Mul0OhUKCmpgZffvklAOCmm27C2bNn0bNnT5fGTZZzx/pnjtzcXGm2TGBgIIqKilqsf+vXr7coKdi1a5fXD4Q1pw3o3LkzBgwYgMjISAwaNIhLEbc3gpwuNTVVABAARPfu3YVWq3Vq+XV1dSI7O1vExcWJ3r17S7FY8urdu7eIi4sT2dnZoq6uzqnxk21cXf8spdFoRPfu3aWY09LS2tznhRdeMLsud+jQQUyePFl8/PHHoqamxgln5HpsA+hGTAZcwGAwiHHjxkl/VDNmzBAGg8Hh5ZaXl4v169eL8PBwq/74W3qFh4eL9evXi/LycoefA9nOVfXPGgaDQUyfPl2KNSoqyqxYDQaDWLBggcV1uXPnzmLBggXi22+/ddvfiS3YBlBLmAy4iFqtFoGBgdIfU3JyskPLio+PF3K5vMkfsUKhEMOHDxcLFiwQ27dvF6dOnRJarVbodDphMBiETqcTWq1WnDx5UmRkZIgFCxaI4cOHC4VC0eRYcrlcJCQkCLVa7bBzIftwZv2zxYoVK6QYAwMDRVlZmdn71tfXmyQSzb2mTp0qfv/73zf7s9tvv12sXr1a/PDDD447QSdhG0BtYTLgQpmZmSZ/SBs3brTr8Q0Gg0hNTTVp9AEImUwmYmJiRHZ2tqitrbXq2LW1tSI7O1vExMQImUxmcvzAwECRlpbWLq+s2hNH1z9bbdy40SS+rKwsi49RW1srHnvssWY/7G+77TZhMBiEXq8X//znP0VcXFyzH3AAxL333itSU1OFRqOx/4k6ENsAMheTARdLSUkx+SNKTk62yx+QWq026QoGIEJDQ8XSpUtFSUmJHSL/n+LiYrF06VIRGhpqUt64ceN4heDmHFX/bGEwGEx6BACITZs2WX08nU4noqOjm3zAr1y5ssm2Wq1WbNu2Tdx///3NJgX+/v5i8uTJYv/+/UKv19tymg7HNoAswWTADaxevdrkD2j69Ok2XYFkZmY2uRJQqVQOHyim0WiESqVqcoVgzRUdOY+9658tNBpNk6791atX23zc3377Tdx7770mx23rA1GtVot169aJu+66q9nE4OabbxZPPfWUOHz4sMsTqBuxDSBLMRlwE6+//rrJH1D37t1Fbm6uzcfp0aOHyMvLc0DELcvNzTUZ/Q1ApKSkODUGatm1a9fEhAkTxB//+Efx/fffCyHsV/9s4eh688svv4hhw4YJAOKxxx4zez+DwSCOHj0qnnnmGdGlS5dmE4M77rhDrFmzxi3GF7ANIGswGXAjLWXz5l6lrVq1ymTfGTNmuGzamKOu8Mg2169fFwMGDGi2gba1/llLo9GIxMREk3KDgoIccjVZW1srjhw5Iqqrq63aX6/Xi5ycHBEbG9vi+IL77rtPpKWlueRvj20AWYvJgJtp6T7fkiVLRHFxcYv73Xg1sHLlSpd3XRoMBpGcnMyrAzeh0WhEZGSk9H9x6623iv/85z8m21hb/6xRXFwslixZ0uQ+c1RUlEWzBlzFnPEFU6dOFdnZ2U4ZX8A2gGzBZMANGQwGkZaW1uwI4OjoaLF//36TEcDeMCqcbGPcRQ5AdOvWTbpFcCNL658lamtrxf79+5sd0BcUFCTS09Nd/gFmjYsXL4q1a9eKO++8s9nEoEuXLuLpp58WR44cccj5sQ0gWzEZcGNqtVokJCS0ODd42LBhIiEhwaS70lPmi3OEsfNUVlaKe+65x+SDqaioqM39zKl/8+fPFxkZGeLkyZNCo9GI6upqYTAYRHV1tdBoNNLc9Pnz54thw4a1OjfdE3oD2tI4vuDpp58WN998c6vjCy5evGiXMj11zQi2Ae6FyYAHKC8vFxs2bGhz1bD2uJIc2ebXX38VI0eOlH7vnTt3FqdOnbLoGObWP0tfvXr1Ehs2bGi3q9bp9XqRnZ0tpk6dKvz9/Zv9HYwcOVKkp6dbfV/fYDCIsWPHsg0gmzEZ8CB1dXUiJydHxMXFCaVSadKo9OjRo12uMU/Wq6qqEqNHj5Z+3yEhIeLEiRNWH6+1+mfuS6lUiri4OJGTk+NV69lrtVqRnp4u7rvvvmZ/LwqFQkydOlXk5ORYNL7A+DkTbAPIFnxqoYfy1KfP5eXlYfz48QAanj535swZhIWFuTiq9ken0+GRRx7BJ598AgAICgrCZ599hsGDB9utDK1WKz3p7sSJE6ioqIBOp0NNTQ38/f2hUCgQGhqKgQMHSk+6Cw4Otlv5nurixYvIysrCrl27cO7cuSY/79KlCx5//HEkJCQgMjISMpms2eOwDSC7cnU2QtZJSEiQsmuVSuXqcCxiPI0sISHB1eG0OzU1NWLChAnS7/imm24S33zzjavDohsYDAZx5MgR8dRTT7U4vuDOO+8U69ata/b+OtsAsicmAx7op59+kgZ1hYaGWtQ1uGXLlha7cAMCAsQdd9whkpKSWhxpbg8ajUaaTiaXy9vtPWNX0Ov14pFHHpH+T3/3u9+Jr776ytVhURv0er3Yv3+/mDJlSovjCx5++GHxyy+/CCGsbwPWrVtn0ziPv/3tb3Y5X7YB7sfHAZ0N5GAZGRnQ6/UAgFmzZqFTp05m71tYWNjiz6qqqnDu3Dls3boV/fv3x759+2wNtVnBwcFQqVQAAL1ej4yMDIeU423q6uowbdo0fPTRRwCAjh07IicnByNGjHBtYNSmDh06YOLEidi7dy+uXr2K1NRU3HvvvSbbfPzxx8jJyQFgfRtw/Phxm+Ls16+fTfs3YhvgfjhmwMPU19dDqVRCrVZDJpPhwoULUCqVZu8/fPhwHD58GJ06dcLXX38tfV+v16O4uBibNm3CN998AwAICAhASUkJunXrZvfzKCkpQZ8+fQAAvXr1QnFxMXx9fe1ejreor6/H9OnT8e677wIA/P39kZOTgzFjxrg4MrLFDz/8gKysLLz33nvo2LEjPvzwQ/z+97+3ug0oLS1FVVWVWdtWVlYiNjYWly5dAtDQdnzxxRdQKBRWn48xtgFuxtVdE2SZ7OxsqcsuJibGon3r6+tFQECAACBGjBjR4jaDBw+WynDkamHGC8/k5OQ4rJz2rr6+XsyYMUP6XcrlcqevRU/OY0sbYK7q6mqTlRX79esnKioq7F4O2wD3wdsEHiYrK0t6P3/+fIv2PX/+vHRV0FJ3n4+PD5KSkqSvi4qKrIjSPMbxZ2ZmOqyc9sxgMGDevHnYsWMHAMDPzw/vv/8+oqOjXRwZOYotbYA5amtrMWnSJBw6dAgAcNttt+HAgQMICQmxe1lsA9wHkwEPc+TIEQCAQqGwuME3Hi9w9913t7hdeHi49L6urs6yAC0QExMjdTkePXrUYeW0V0IIPPXUU0hPTwcA+Pr6Ys+ePZg4caKLIyNHsqUNaIvBYEBCQgJyc3MBAGFhYTh48CC6du1q13IasQ1wH0wGPIhGo0FpaSkAYMCAAfDz87Nof+NkoLWBQNeuXZPe9+7d27IgLeDn54f+/fsDaLh/qNVqHVZWeyOEwKJFi7BlyxYADT067777Lh577DEXR0aOZGsb0JZ58+Zhz549AICuXbvi4MGDDl0DgG2A+2Ay4EGMRwJHRkZavH9jMiCTyRAREdHidh9++KH0/uGHH7a4HEsYn4etI529hRACzz//PN544w0ADf+fO3fuxNSpU10cGTmarW1AaxYvXiz1MoWEhODAgQO47bbb7FpGc9gGuAcmAx6koKBAem/NSnKNyUB4eDiCgoKa3Wbfvn14//33AQDTpk2z21Silhifh/H5UfOEEFi2bBk2btwofS8jIwPTpk1zYVTkLLa2AS1ZuXIlUlJSAAA33XQTcnNzHf6334htgHtgMuBBjLv5Lb0quHr1Kn766ScATccL1NTU4PTp01i4cCGmTp0KIQRGjRqF1NRUm2Nui/F5nDhxwuHlebpVq1Zh/fr10tepqamYOXOm6wIip7KlDWjJpk2bkJycDKBhSurHH3+M4cOH2+XY5mAb4B7se8OJHOr69evSe0vv4xk3ItnZ2S2udz5s2DDMnj0biYmJTpnza3weFRUVDi/Pk61bt05qtAHgrbfewpw5c1wXEDmdLW1Ac7Zt24bFixcDaLh/v3fvXowaNcrm41qCbYB7YM+AB9HpdNJ7Sxf+aG3lQWNarRajR49uMRG4cuUKNm3ahHHjxiEsLAxyuRzdunXDpEmTcPjwYYtiAkzPw/j8yNSrr76KZcuWSV+npKQ4ZFoZuTdb2oAb7d27F3PnzoUQAj4+PtixYwceeughs2JYvHgx7rvvPtx6661QKBTo1q0b7rnnHmzfvh21tbUWxcE2wD0wGfAgjcuPAoBcLrdoX+Nk4KuvvsLp06dx+vRpHD58GLt27cLAgQMBAOfOnUNiYmKLx3nzzTexaNEilJaWYty4cXjuuecwYsQIfPzxx/jzn/8sjUQ2l7+/v/S+pqbGon29xRtvvIHnn39e+vqvf/0rFi5c6LqAyGVsaQOM5ebmIj4+HgaDAQCwefNmPPHEE2bt++uvv2LLli2QyWSYMGECFi9ejEcffRRXrlyBSqXCgw8+KB3XHGwD3IQrVzwiyxg/C12n01m07x133CEAiK5duzb786qqKnHXXXdJx2/puff79u0Thw4davL9f/3rX6JDhw4iJCTEotiqq6ulMkeOHGn2ft7irbfeMnlQzJo1a1wdErmQLW1Ao0OHDomOHTtKx3nllVcs2r++vl7U1NQ0+X5tba20aqElqwmyDXAP7BnwINZ2p1VVVeHChQsAGuYmN6djx44m3dDGq5wZe+yxxzBy5Mgm37/33nvxwAMPQKPR4PTp02bHZs9uz/YmPT0dCxYskL5++eWXTf6PyPvY2qV+7NgxTJw4EdXV1QCAZcuWYenSpRYdw8fHp9leCT8/Pzz66KMAgOLiYrOPxzbAPTAZ8CCdO3eW3peVlZm936lTp6Ruu5aSAQB49NFH0bFjRwDABx98YHF8HTp0AACLFkIxPo/Q0FCLy2yvduzYgblz50pf/+UvfzEZPEjeydo2AGhYWjw6OhqVlZUAgKeffhpr1qyxW2wGgwH5+fkA0Oo6JjdiG+AemAx4EOMPckvm4xqPF2gtGQgICMDo0aMBNDzd7OzZs2aXUVZWhoMHD+KWW25pdanjGxmfR+O4hfbu8uXLyMzMbHG1taysLCQmJkL8vweKPvfcc1i7dm2LM0DIe1jbBpSUlGDs2LHSbIQZM2ZIi1ZZS6/XIzk5GStWrMBTTz2Fvn37Ii8vD4mJiVI7Yg5vbAPckqvvU5D5Dh48KN1bW7Bggdn7zZs3T9rvu+++a3XbLVu2SNtu2LDBrOPr9XrpXubOnTvNjksIIebPny+V99lnn1m0ryeqr68Xffv2FQBEnz59RFlZmcnP9+7dK3x8fKTfydNPPy0MBoOLoiV3Y00bcPnyZdGrVy9pv0mTJom6ujqbY6msrDQZzyKTycSSJUtEbW2tRcfxtjbAXTEZ8CAVFRXSH83w4cPN3m/YsGECgAgICBD19fWtbltWViaV0dJjjo3V19eLJ554QgAQc+bMMTumG2MDIDQajcX7e5rDhw+bNKB/+MMfxA8//CCEEOKDDz4Qvr6+0s+SkpKYCJAJS9uAiooKceedd0r79O3bVxQUFIjTp0+b/frll19aLaO+vl5cunRJbN68WQQHB4t77rmnzX2MeVsb4K6YDHiY3r17CwBCoVCYlYHX19eLgIAAAUAMGzbMrDL69esnAAhfX1/x888/t3rsGTNmCAAiPj6+zUTjRrW1tUKhUAgAQqlUWrSvp/r//r//zyQZACDCwsJEWlqa6NChg/S9WbNmWfz7JO9gSRvwj3/8o0l9s/R15MgRs2Pbu3evACCef/55s7b3xjbAXXHMgIcZOnQogIYRuI2DdVpz/vx5VFVVAWh9vICxCRMmAADq6+ulR5neyGAwIDExETt27MDjjz+Od955Bz4+llWnvLw8aSTxkCFDLNrXEwkhsG/fvibfLysrw5w5c6TFWqZPn47U1FSLf5/kHSxpAyyZ2dOcDh06WPSMgnHjxgEADh06ZNb23tYGuDVXZyNkmezsbCljj4mJcUkM9fX1Yvr06QKAiI2Ntfr+Y3R0tHQulsxL9lSnTp1q8yps/PjxdrmfS+2XO7QBLTl79qwAIO655x6ztve2NsCdMRnwMHV1dSI8PFwasFNcXOzU8o1vDUyZMsXiwUKNiouLpUYgJCTE6uN4kuTk5DaTgd///vfi9OnTrg6V3Jir24CioiLx22+/Nfn+b7/9Jn24r127ts3jGLcBvXr1YhLsYuyH9DC+vr5ISkoC0NDt/Pbbbzu1/FWrVmHHjh246aabcPvtt2PNmjVITk42eZnzHIStW7dK7zUaDd59910HRu0ezFm7oby8HPfff7/Zz5Ig7+PqNmDv3r3o1q0bxo8fj/nz5+OFF15AQkICwsLCkJ+fj3vvvReLFi1q8zjGbUBSUpJTHoxGrXB1NkKWKy8vF3K5XAAQoaGhQqvVOq3sxl6B1l7bt29v9RgajUaEhoY2GURXXV3tnJNwgQsXLlg0aCskJEScPHnS1WGTm3JlG3D06FExZ84c0bdvXxEcHCz8/PxE586dxQMPPCDefvtts3r5jNsAuVwuysvLnRA5tYbJgIdKSEiQPjhUKpWrw7FIYmJisx+Ar732mqtDc5hXXnnF4lHcU6dOdXXY5MbaSxuQkJDg6nBICCET4v8tc0YepaysDBEREdLSorm5uYiJiXFxVG3Lzc2VZivcKDQ0FCUlJQgODnZoDBqNBsePH0dBQQEKCwtx/fp16HQ66PV6yOVyKBQKdO7cGQMGDEBkZCQGDRqEkJAQm8r805/+hG+//dbs7WUyGdLS0jBr1iybyqX2qz20AYGBgSgqKkLPnj1dHBWxZ8CDpaamStl19+7dndpVaA2NRiO6d+/e6tXwCy+8YPdy6+rqRHZ2toiLi5PmaFv66t27t4iLixPZ2dkWD3S6fPmy2eVERESItWvXOn1QGHkmT28D0tLSXB0S/T9MBjyYwWAQ48aNk/6wZsyY4bYr1hkMBmk6YmsvhUIhLl26ZJcyy8vLxfr166WR1/Z6hYeHi/Xr15t9n/Pll19uM9FYtmwZZxGQxTy5DYiKinLbWL0RkwEPp1arRWBgoPQHlpyc7OqQmrVixQqzP2xnzZplU1lqtVrEx8dLA6xuTDaGDx8uFixYILZv3y5OnToltFqt0Ol0wmAwCJ1OJ7RarTh58qTIyMgQCxYsEMOHD5dWSTN+yeVykZCQINRqdavxGK8L3/i69dZbxaJFi8SRI0fYIJJNPLENCAwMbPJcDnItJgPtQGZmpskHzcaNG10dkomNGzdadOXt4+MjioqKLC7HYDCI1NRUk4YRaJiLHRMTI7Kzs61ez6C2tlZkZ2eLmJgYIZPJTI4fGBgo0tLSWvxQj42NFQCEn5+fmDlzpjh06BDnVJNdeVobkJWV5eqQ6AZMBtqJlJQUkz+25ORkl19xGgwGi3oEjF8PPfSQRWWp1WqT7lKgYcrV0qVLRUlJiV3Pq7i4WCxdurTJ9Mhx48a12Etw8eJFUVNTY9c4iIx5ShuwadMml8ZEzWMy0I6sXr3a5I9u+vTpLnsKmEajMWuMQGuvr776yqyyMjMzm/QGqFQqhw+m0mg0QqVSNekl4FUPuYq7twGrV692SSzUNiYD7czrr79u8sfXvXt3kZub69QYcnNz25w1YM7r1ltvbfPK5sbz7dGjh8jLy3PSmTZo7nxTUlKcGgNRI3dtA/g34d6YDLRDLV0pO/oKQaPRNFlQKCgoSGRlZYnvv/9efPDBB2LDhg1CpVKJESNGiN///vdtJgTnz59vsbxVq1aZbDtjxgyXTa3iVRC5E3dsA8i9MRlop1q6h75kyRK7z2EvLi4WS5YsaXIPPSoqqs0RwxqNRhw5ckRkZmaKl19+WcTFxYmwsDDh6+srwsPDWxxod+PVz8qVK93i/uiNDyPi1RC5iqe0AeQemAy0YwaDQaSlpTU7uj46Olrs37/fptH1+/fvN3kEqfGVQHp6usM+nDlymsg87bUNIPvjcsReoKysDMuXL8eePXug1+tNfqZQKNC/f39ERkZi8ODBiIyMRFhYGBQKBfz9/VFTUwOdToeysjIUFBTg2LFjKCgowMmTJ6HT6UyOJZfLERsbi7Vr1zpsedEbl2BNTk7GihUrHFKWLZKTk7Fy5UoADUuunjlzBmFhYS6OirxVe2oDyEFcnY2Q85SXl4sNGzbYfUW+Xr16iQ0bNjj8yWMGg0GMHTvWZIyAu155cLU1ckee3gaQ47BnwAvV19cjPz8fmZmZOHr0KEpKSiw+hlKpxJAhQxAfH4/o6GinPIs8LS0Nc+fOBQD06NEDZ86cQadOnRxerrW0Wi0iIiJw5coVAA3xz54928VREXluG0COw2SAoNVqpaf4nThxAhUVFdDpdKipqYG/vz8UCgVCQ0MxcOBA6Sl+jn6y4I089QlteXl5GD9+PADeLiD35QltADkWkwHyCNOnT8euXbsAACqVCtu2bXNxROZTqVTYvn07ACAhIQE7d+50cURERKaYDJDbKy8vR8+ePaHX6xEaGorS0lKzbw9s3boVTz75ZLM/CwgIQM+ePfHAAw9g4cKFuOOOO+wZtkSr1UKpVKKiogJyuRyXL19Gly5dHFIWEZE1fFwdAFFbMjIypBHQs2bNsmicQGFhYYs/q6qqwrlz57B161b0798f+/btszXUZgUHB0OlUgEA9Ho9MjIyHFIOEZG12DNAbq2+vh5KpRJqtRoymQwXLlyAUqk0e//hw4fj8OHD6NSpE77++mvp+3q9HsXFxdi0aRO++eYbAA09BSUlJejWrZvdz6OkpAR9+vQBAPTq1QvFxcUccEVEboM9A+TW8vLyoFarAQDR0dEWJQIGgwGnT58GANx9992IiIiQXoMGDcLUqVPx9ddfY/DgwQAaegp2795t/5NAw8jr6OhoAMDFixeRn5/vkHKIiKzBZIDcWlZWlvR+/vz5Fu17/vx5VFVVAQD69evX7DY+Pj5ISkqSvi4qKrIiSvMYx5+ZmemwcoiILMVkgNzakSNHADSsktZ4ZW0u4/ECd999d4vbhYeHS+/r6uosC9ACMTExUCgUAICjR486rBwiIksxGSC3pdFoUFpaCgAYMGAA/Pz8LNrfOBloqWcAAK5duya97927t2VBWsDPzw/9+/cH0DCGQKvVOqwsIiJLMBkgt3X8+HHpfWRkpMX7NyYDMpkMERERLW734YcfSu8ffvhhi8uxhPF5GJ8fEZErMRkgt1VQUCC9bxzkZ4nGZCA8PBxBQUHNbrNv3z68//77AIBp06a12oNgD8bnYXx+RESuxGSA3JZxN7+lPQNXr17FTz/9BKDpeIGamhqcPn0aCxcuxNSpUyGEwKhRo5CammpzzG0xPo8TJ044vDwiInNYdhOWyImuX78uvbd0PX/jRCI7OxsymazZ7YYNG4bZs2cjMTHRKfP+jc+joqLC4eUREZmDPQPktoyfld44Ct9cra08aEyr1WL06NEtJgI6nQ6LFy/Gfffdh1tvvRUKhQLdunXDPffcg+3bt6O2ttaiuIzP48ZnwRMRuQqTAXJbjUsQA4BcLrdoX+Nk4KuvvsLp06dx+vRpHD58GLt27cLAgQMBAOfOnUNiYmKLx/n111+xZcsWyGQyTJgwAYsXL8ajjz6KK1euQKVS4cEHH4TBYDA7Ln9/f+l9TU2NRedEROQovE1Abss4AdDr9SYfpG1pTAa6du2KESNGmPxs6NChmDRpEiIjI/Hdd9/hyy+/RGFhIQYMGNDkOKGhofjll1+aJCN1dXUYO3YsDhw4gLy8PEyYMMGsuIwTAEvOh4jIkdgzQG7L2i71qqoqXLhwAQCa/YAHgI4dO2LZsmXS18YrHRrz8fFptlfCz88Pjz76KACguLjY7NhsufVBROQoTAbIbXXu3Fl6X1ZWZvZ+p06dkrruW0oGAODRRx9Fx44dAQAffPCBRbEZDAbp+QKtrWFwI+PzCA0NtahMIiJHYTJAbsv4g9ySOfnG4wVaSwYCAgIwevRoAEBpaSnOnj3b4rZ6vR7JyclYsWIFnnrqKfTt2xd5eXlITEyUjmEO4/NoHLdARORqHDNAbst4Tv6xY8cwc+ZMs/YzNxkAgAkTJiAnJwdAwxTEP/7xj81up9frsXLlSulrmUyGJUuWYP369WbF1OjYsWPSe2tWVSQicgT2DJDbGjRokPTemp6BgIAA3H777a1uazzwrzEpaM5NN90EIQTq6+tx6dIlvPXWW0hPT8f999+P//73v2bHZnwexudHRORKTAbIbYWEhEgPDiosLDTriYIGgwGnT58G0LDyoI9P61W8Z8+e0hLE33zzjclCR83x8fFBjx498OSTTyI1NRX/93//h7Vr15pzOqirq8PJkycBAEqlEsHBwWbtR0TkaEwGyK0NHToUQMMo/MYBe605f/48qqqqALR9i6BRY+9AfX09cnNzzY5t3LhxAIBDhw6ZtX1eXp40m2DIkCFml0NE5GhMBsitTZs2TXq/efPmNre/8847IYSAEAJbt241q4x169ZJ+yQkJJgd23/+8x8AQIcOHcza3jj++Ph4s8shInI0JgPk1mJiYhAeHg4AyM/PR0lJiVPLP3v2rNTTYKyqqgqLFy8GAIwfP77N45SUlEg9G7169UJ0dLR9AyUisgGTAXJrvr6+SEpKAgAIIfD22287tfy9e/eiW7duGD9+PObPn48XXngBCQkJCAsLQ35+Pu69914sWrSozeMY91IkJSU55aFIRETmkgkhhKuDIGrNtWvX0KNHD+j1eoSGhqK0tBSdOnVyStnHjh1Damoq/v3vf+PKlSv49ddf0alTJ/Tr1w9xcXFQqVTw82t9hq5Wq4VSqURFRQXkcjkuX76MLl26OCV+IiJzMBkgjzB9+nTs2rULAKBSqbBt2zYXR2Q+lUqF7du3AwASEhKwc+dOF0dERGSKyQB5hLKyMkRERKCyshIAkJubi5iYGBdH1bbc3FxptkJgYCCKiorQs2dPF0dFRGSKYwbII4SFheG1116Tvp4zZw5++eUXF0bUNq1Wi7lz50pfv/7660wEiMgtMRkgjzF79mxpbv+VK1fw7LPPwl07toQQePbZZ3HlyhUAQFRUFGbNmuXiqIiImsdkgDyGTCZDWloaAgMDAQA7duzAqlWrXBxV81auXCmNDQgMDERaWhpkMpmLoyIiah6TAfIoYWFh2LJli/R1cnKyye0Dd/Daa6+ZPNRo69atvD1ARG6NyQB5nGnTpiElJUX6esmSJVi5cqXLbxkIIZCcnIwlS5ZI39u0aROeeOIJF0ZFRNQ2ziYgj7VmzRq89NJL0tfTp0/HG2+84ZIHAGm1Wjz77LMm0wZXr16N5cuXOz0WIiJLMRkgj5aSkiItCwwA3bt3R1pamlOnHebl5WHOnDnSYMHGuBYuXOi0GIiIbMHbBOTRFi1ahMzMTGlQ4ZUrVzB+/HjMmjULWq3WoWVrtVqoVCqMHz9eSgSCgoKQlZXFRICIPAp7BqhdKCsrw5w5c3DgwAHpe6GhoVCpVEhKSoJSqbRbWSUlJdi6dSsyMjJQUVEhfT8qKgppaWkcLEhEHofJALUbQghs27YNixcvllYqBBqmJEZFRWH+/PmIiYlp81kCzamrq0NeXh42b94sPX2wUVBQEF5//XWoVCpOHyQij8RkgNqdsrIyLF++HHv27IFerzf5mUKhQP/+/REZGYnBgwcjMjISYWFhUCgU8Pf3R01NDXQ6HcrKylBQUIBjx46hoKAAJ0+ehE6nMzmWXC5HbGws1q5dy94AIvJoTAao3bp27RoyMjKwZcsWqNVqux23V69eSEpKgkql4tMHiahdYDJA7V59fT3y8/ORmZmJo0ePoqSkxOJjKJVKDBkyBPHx8YiOjoavr68DIiUicg0mA+R1tFotjh8/joKCApw4cQIVFRXQ6XSoqamBv78/FAoFQkNDMXDgQERGRmLQoEEuWbuAiMhZmAwQERF5Oa4zQERE5OWYDBAREXk5JgNERERejskAERGRl2MyQERE5OWYDBAREXk5JgNERERejskAERGRl2MyQERE5OWYDBAREXk5JgNERERejskAERGRl2MyQERE5OWYDBAREXk5JgNERERejskAERGRl2MyQERE5OWYDBAREXk5JgNERERejskAERGRl2MyQERE5OWYDBAREXk5JgNERERejskAERGRl2MyQERE5OWYDBAREXk5JgNERERejskAERGRl2MyQERE5OWYDBAREXk5JgNERERejskAERGRl2MyQERE5OWYDBAREXk5JgNERERejskAERGRl2MyQERE5OWYDBAREXk5JgNERERejskAERGRl2MyQERE5OWYDBAREXk5JgNERERejskAERGRl2MyQERE5OWYDBAREXk5JgNERERejskAERGRl2MyQERE5OWYDBAREXk5JgNERERejskAERGRl2MyQERE5OWYDBAREXk5JgNERERejskAERGRl2MyQERE5OWYDBAREXk5JgNERERejskAERGRl/v/AWfsYBiPXEwsAAAAAElFTkSuQmCC", + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " 2024-04-25T08:42:10.909718\n", + " image/svg+xml\n", + " \n", + " \n", + " Matplotlib v3.8.0, https://matplotlib.org/\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n" + ], "text/plain": [ "
" ] @@ -330,96 +734,1355 @@ "outputs": [ { "data": { + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " 2024-04-25T08:42:11.069756\n", + " image/svg+xml\n", + " \n", + " \n", + " Matplotlib v3.8.0, https://matplotlib.org/\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n" + ], "text/plain": [ - "0.862" + "
" ] }, - "execution_count": 5, "metadata": {}, - "output_type": "execute_result" + "output_type": "display_data" } ], "source": [ - "data[\"X\"].mean()" - ] - }, - { - "cell_type": "markdown", - "id": "7f8b8c77d0b42c3e", - "metadata": { - "ExecuteTime": { - "end_time": "2024-01-24T14:19:55.437699Z", - "start_time": "2024-01-24T14:19:55.392013Z" - }, - "collapsed": false, - "jupyter": { - "outputs_hidden": false - } - }, - "source": [ - "## Step 1: Verify correctness of the network structure" + "eliater.plot_treatment_and_outcome(data, treatment, outcome)" ] }, { "cell_type": "code", "execution_count": 6, - "id": "6f30a2b1053ff61", - "metadata": { - "ExecuteTime": { - "end_time": "2024-01-25T14:36:21.009690Z", - "start_time": "2024-01-25T14:36:20.783432Z" + "id": "7eb952ca-26ba-40c3-ae2e-b588ac2d7b48", + "metadata": {}, + "outputs": [ + { + "data": { + "text/markdown": [ + "## Step 1: Checking the ADMG Structure" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" }, - "collapsed": false, - "jupyter": { - "outputs_hidden": false + { + "data": { + "text/markdown": [ + "Of the 26 d-separations implied by the ADMG's structure, 8 (30.77%) rejected the null hypothesis with the pearson test at p<0.01.\n", + "\n", + "Since this is more than 30%, Eliater considers this a major inconsistency and therefore suggests adding appropriate bidirected edges using the eliater.add_ci_undirected_edges() function. Finished in 0.25 seconds.\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| left | right | given | stats | p | dof | p_adj | p_adj_significant |\n", + "|:-------|:--------|:--------|----------:|------------:|:------|------------:|:--------------------|\n", + "| R3 | Z3 | R1;Y | -0.329142 | 1.07681e-26 | | 2.7997e-25 | True |\n", + "| Z1 | Z3 | Z2 | 0.188419 | 1.91629e-09 | | 4.79073e-08 | True |\n", + "| R1 | X | M1 | -0.184472 | 4.18476e-09 | | 1.00434e-07 | True |\n", + "| R3 | Z1 | X;Z3 | -0.148285 | 2.48476e-06 | | 5.71496e-05 | True |\n", + "| R3 | X | M1;Z3 | -0.141695 | 6.86241e-06 | | 0.000150973 | True |\n", + "| M1 | R3 | R1;Y | -0.135914 | 1.6133e-05 | | 0.000338792 | True |\n", + "| X | Z3 | Z2 | 0.12073 | 0.000129695 | | 0.0025939 | True |\n", + "| R1 | Z1 | X | -0.112316 | 0.000372903 | | 0.00708516 | True |" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" } - }, - "outputs": [], + ], "source": [ - "from sklearn.preprocessing import KBinsDiscretizer\n", - "\n", - "# discretization transform the raw data\n", - "kbins = KBinsDiscretizer(n_bins=2, encode=\"ordinal\", strategy=\"uniform\")\n", - "data_trans = kbins.fit_transform(data)\n", - "data_trans = pd.DataFrame(data_trans, columns=data.columns)" + "eliater.step_1_notebook(graph=graph, data=data)" ] }, { "cell_type": "code", "execution_count": 7, - "id": "75ef03bcc109b95a", - "metadata": { - "ExecuteTime": { - "end_time": "2024-01-25T14:36:21.094360Z", - "start_time": "2024-01-25T14:36:20.829501Z" - }, - "collapsed": false, - "jupyter": { - "outputs_hidden": false - } - }, + "id": "307d5d6b-160f-47a2-9d9b-2922dc11aed3", + "metadata": {}, "outputs": [ + { + "data": { + "text/markdown": [ + "## Step 1: Checking the ADMG Structure" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "On this try, we're going to discretize the data using K-Bins discretization with K as 2. Here are the first few rows of the transformed dataframe after doing that:" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, { "data": { "text/html": [ - "
\n", - "\n", "\n", " \n", " \n", - " \n", " \n", " \n", " \n", @@ -433,7 +2096,6 @@ " \n", " \n", " \n", - " \n", " \n", " \n", " \n", @@ -445,7 +2107,6 @@ " \n", " \n", " \n", - " \n", " \n", " \n", " \n", @@ -457,7 +2118,6 @@ " \n", " \n", " \n", - " \n", " \n", " \n", " \n", @@ -469,1206 +2129,257 @@ " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", " \n", " \n", - " \n", - " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", " \n", - " \n", - " \n", " \n", " \n", " \n", - "
XM1Z1
01.01.01.00.0
11.01.00.00.0
21.00.00.00.0
31.01.01.00.00.01.01.01.01.0
41.00.01.01.00.00.00.01.01.0
..............................
9951.01.00.00.00.00.00.00.00.0
9961.01.01.00.00.01.00.01.01.0
9971.01.01.00.01.00.00.01.01.0
9981.01.01.01.00.00.00.00.00.0
9991.01.00.01.01.01.00.00.01.0
\n", - "

1000 rows × 9 columns

\n", - "
" + "" ], "text/plain": [ - " X M1 Z1 Z2 Z3 R1 R2 R3 Y\n", - "0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.0\n", - "1 1.0 1.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0\n", - "2 1.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0\n", - "3 1.0 1.0 1.0 0.0 0.0 1.0 1.0 1.0 1.0\n", - "4 1.0 0.0 1.0 1.0 0.0 0.0 0.0 1.0 1.0\n", - ".. ... ... ... ... ... ... ... ... ...\n", - "995 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n", - "996 1.0 1.0 1.0 0.0 0.0 1.0 0.0 1.0 1.0\n", - "997 1.0 1.0 1.0 0.0 1.0 0.0 0.0 1.0 1.0\n", - "998 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0\n", - "999 1.0 1.0 0.0 1.0 1.0 1.0 0.0 0.0 1.0\n", + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "Of the 26 d-separations implied by the ADMG's structure, only 1 (3.85%) rejected the null hypothesis for the cressie_read test at p<0.01.\n", "\n", - "[1000 rows x 9 columns]" + "Since this is less than 30%, Eliater considers this minor and leaves the ADMG unmodified. Finished in 0.23 seconds.\n" + ], + "text/plain": [ + "" ] }, - "execution_count": 7, "metadata": {}, - "output_type": "execute_result" + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| left | right | given | stats | p | dof | p_adj | p_adj_significant |\n", + "|:-------|:--------|:--------|--------:|------------:|------:|------------:|:--------------------|\n", + "| R1 | R3 | R2;Y | 30.9659 | 3.11086e-06 | 4 | 8.08823e-05 | True |" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" } ], "source": [ - "data_trans" + "eliater.step_1_notebook(graph=graph, data=data, binarize=True)" ] }, { "cell_type": "code", "execution_count": 8, - "id": "4e3220a2c48cb9b4", + "id": "6a1d0da707ca1d2f", "metadata": { "ExecuteTime": { - "end_time": "2024-01-25T14:36:23.142139Z", - "start_time": "2024-01-25T14:36:20.906764Z" + "end_time": "2024-01-25T14:36:23.240315Z", + "start_time": "2024-01-25T14:36:23.157745Z" }, "collapsed": false, "jupyter": { "outputs_hidden": false } }, + "outputs": [ + { + "data": { + "text/markdown": [ + "\n", + "## Step 2: Check Query Identifiability\n", + "\n", + "The causal query of interest is the average treatment effect of $X$ on $Y$, defined as: \n", + "$\\mathbb{E}[Y \\mid do(X=1)] - \\mathbb{E}[Y \\mid do(X=0)]$.\n", + "\n", + "\n", + "Running the ID algorithm defined by [Identification of joint interventional distributions in recursive\n", + "semi-Markovian causal models](https://dl.acm.org/doi/10.5555/1597348.1597382) (Shpitser and Pearl, 2006)\n", + "and implemented in the $Y_0$ Causal Reasoning Engine gives the following estimand:\n", + "\n", + "$\\sum\\limits_{M_1, Z_1, Z_2, Z_3} P(M_1 | X, Z_1) P(Y | M_1, X, Z_1, Z_2, Z_3) P(Z_2 | Z_1) P(Z_3 | Z_1, Z_2) \\sum\\limits_{M_1, X, Y, Z_2, Z_3} \\sum\\limits_{R_1, R_2, R_3} P(M_1, R_1, R_2, R_3, X, Y, Z_1, Z_2, Z_3)$\n", + "\n", + "Because the query is identifiable, we can proceed to Step 3.\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "eliater.step_2_notebook(graph=graph, treatment=treatment, outcome=outcome)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "b52a7618-d06f-42f5-827c-ed5df6ed3264", + "metadata": {}, + "outputs": [ + { + "data": { + "text/markdown": [ + "## Step 3/4: Identify Nuisance Variables and Simplify the ADMG" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "The following 3 variables were identified as _nuisance_ variables,\n", + "meaning that they appear as descendants of nodes appearing in paths between\n", + "the treatment and outcome, but are not themselves ancestors of the outcome variable:\n", + "\n", + "$R_1$, $R_2$, $R_3$\n", + "\n", + "These variables are marked as \"latent\", then\n", + "the algorithm proposed in [Graphs for margins of Bayesian\n", + "networks](https://arxiv.org/abs/1408.1809) (Evans, 2016) and implemented in\n", + "the $Y_0$ Causal Reasoning Engine is applied to the ADMG to\n", + "simplify the graph. This minimally removes the latent variables and makes\n", + "further simplifications if the latent variables are connected by bidirected\n", + "edges to other nodes.\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "The simplification did not modify the graph." + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "reduced_graph = eliater.step_3_notebook(graph=graph, treatment=treatment, outcome=outcome)" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "ee2d9eec-56d4-49b4-91c6-ba7af815a73d", + "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Of the 26 d-separations implied by the network's structure, only 1(3.85%) rejected the null hypothesis at p<0.01.\n", - "\n", - "Since this is less than 30%, Eliater considers this minor and leaves the network unmodified.]\n", - "\n", - "Finished in 0.31 seconds.\n", - "\n" + "Graph was not reduced, no need to re-check identifiability\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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
leftrightgivenstatspdofp_adjp_adj_significant
0R1R3R2|Y30.9153980.00000340.000083True
1Z1Z3Z29.6465060.00804120.201015False
2R3XR2|Y2.4300300.65720741.000000False
3XZ2Z10.7719820.67977721.000000False
4R2Z1X2.9949240.22369721.000000False
5R3Z2R2|Y2.6779770.61307441.000000False
6R3Z1R2|Y5.6411390.22759941.000000False
7M1Z2Z10.0870050.95743021.000000False
8M1Z1X5.7659850.05596721.000000False
9R1Z3Z20.3455760.84131621.000000False
10YZ1X|Z24.0062010.40516741.000000False
11R1Z2Z12.3262650.31250621.000000False
12XYM1|Z29.1700470.05698741.000000False
13R3Z3R2|Y4.4814560.34475241.000000False
14R1YM12.0013990.36762221.000000False
15R2YR11.0838020.58164221.000000False
16R2XR11.2045750.54755821.000000False
17R1Z1X4.2073890.12200521.000000False
18R2Z3Z20.5342830.76556521.000000False
19YZ2Z1|Z31.0929940.89538241.000000False
20R2Z2Z10.6300840.72975821.000000False
21XZ3Z20.4112710.81413021.000000False
22M1R3R2|Y9.7646650.04458441.000000False
23M1R2R14.1381840.12630021.000000False
24M1Z3Z20.5324460.76626821.000000False
25R1XM11.2805390.52715021.000000False
\n", - "
" - ], - "text/plain": [ - " left right given stats p dof p_adj p_adj_significant\n", - "0 R1 R3 R2|Y 30.915398 0.000003 4 0.000083 True\n", - "1 Z1 Z3 Z2 9.646506 0.008041 2 0.201015 False\n", - "2 R3 X R2|Y 2.430030 0.657207 4 1.000000 False\n", - "3 X Z2 Z1 0.771982 0.679777 2 1.000000 False\n", - "4 R2 Z1 X 2.994924 0.223697 2 1.000000 False\n", - "5 R3 Z2 R2|Y 2.677977 0.613074 4 1.000000 False\n", - "6 R3 Z1 R2|Y 5.641139 0.227599 4 1.000000 False\n", - "7 M1 Z2 Z1 0.087005 0.957430 2 1.000000 False\n", - "8 M1 Z1 X 5.765985 0.055967 2 1.000000 False\n", - "9 R1 Z3 Z2 0.345576 0.841316 2 1.000000 False\n", - "10 Y Z1 X|Z2 4.006201 0.405167 4 1.000000 False\n", - "11 R1 Z2 Z1 2.326265 0.312506 2 1.000000 False\n", - "12 X Y M1|Z2 9.170047 0.056987 4 1.000000 False\n", - "13 R3 Z3 R2|Y 4.481456 0.344752 4 1.000000 False\n", - "14 R1 Y M1 2.001399 0.367622 2 1.000000 False\n", - "15 R2 Y R1 1.083802 0.581642 2 1.000000 False\n", - "16 R2 X R1 1.204575 0.547558 2 1.000000 False\n", - "17 R1 Z1 X 4.207389 0.122005 2 1.000000 False\n", - "18 R2 Z3 Z2 0.534283 0.765565 2 1.000000 False\n", - "19 Y Z2 Z1|Z3 1.092994 0.895382 4 1.000000 False\n", - "20 R2 Z2 Z1 0.630084 0.729758 2 1.000000 False\n", - "21 X Z3 Z2 0.411271 0.814130 2 1.000000 False\n", - "22 M1 R3 R2|Y 9.764665 0.044584 4 1.000000 False\n", - "23 M1 R2 R1 4.138184 0.126300 2 1.000000 False\n", - "24 M1 Z3 Z2 0.532446 0.766268 2 1.000000 False\n", - "25 R1 X M1 1.280539 0.527150 2 1.000000 False" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# print_graph_falsifications(graph, data, method=\"chi-square\", verbose=True, significance_level=0.01)\n", - "print_graph_falsifications(\n", - " graph, data_trans, method=\"chi-square\", verbose=True, significance_level=0.01\n", - ")" - ] - }, - { - "cell_type": "markdown", - "id": "8b40df88c10664e3", - "metadata": { - "collapsed": false, - "jupyter": { - "outputs_hidden": false - } - }, - "source": [ - "All the d-separations implied by the network are validated by the data. No test failed. Hence, we can proceed to step 2." - ] - }, - { - "cell_type": "markdown", - "id": "4435aa5f3a8f55b9", - "metadata": { - "collapsed": false, - "jupyter": { - "outputs_hidden": false - } - }, - "source": [ - "## Step 2: Check query identifiability\n", - "\n", - "The causal query of interest is the average treatment effect of $X$ on $Y$, defined as:\n", - "$E[Y|do(X=1)] - E[Y|do(X=0)]$." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "id": "6a1d0da707ca1d2f", - "metadata": { - "ExecuteTime": { - "end_time": "2024-01-25T14:36:23.240315Z", - "start_time": "2024-01-25T14:36:23.157745Z" - }, - "collapsed": false, - "jupyter": { - "outputs_hidden": false - } - }, - "outputs": [ - { - "data": { - "text/latex": [ - "$\\sum\\limits_{M_1, Z_1, Z_2, Z_3} P(M_1 | X, Z_1) P(Y | M_1, X, Z_1, Z_2, Z_3) P(Z_2 | Z_1) P(Z_3 | Z_1, Z_2) \\sum\\limits_{M_1, X, Y, Z_2, Z_3} \\sum\\limits_{R_1, R_2, R_3} P(M_1, R_1, R_2, R_3, X, Y, Z_1, Z_2, Z_3)$" - ], - "text/plain": [ - "Sum[M1, Z1, Z2, Z3](P(M1 | X, Z1) * P(Y | M1, X, Z1, Z2, Z3) * P(Z2 | Z1) * P(Z3 | Z1, Z2) * Sum[M1, X, Y, Z2, Z3](Sum[R1, R2, R3](P(M1, R1, R2, R3, X, Y, Z1, Z2, Z3))))" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "identify_outcomes(graph=graph, treatments=X, outcomes=Y)" - ] - }, - { - "cell_type": "markdown", - "id": "5e27342ad3164b42", - "metadata": { - "collapsed": false, - "jupyter": { - "outputs_hidden": false - } - }, - "source": [ - "The query is identifiable. Hence we can proceed to step 3." - ] - }, - { - "cell_type": "markdown", - "id": "2ed3073afbc7030a", - "metadata": { - "collapsed": false, - "jupyter": { - "outputs_hidden": false - } - }, - "source": [ - "## Step 3: Find nuisance variables and mark them as latent" - ] - }, - { - "cell_type": "markdown", - "id": "b7661cedf357ad01", - "metadata": { - "collapsed": false, - "jupyter": { - "outputs_hidden": false - } - }, - "source": [ - "This function finds the nuisance variables for the input graph." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "id": "c094ba6186dfecf6", - "metadata": { - "ExecuteTime": { - "end_time": "2024-01-25T14:36:23.241863Z", - "start_time": "2024-01-25T14:36:23.174588Z" - }, - "collapsed": false, - "jupyter": { - "outputs_hidden": false - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "{R1, R2, R3}" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "find_nuisance_variables(graph, treatments=X, outcomes=Y)" - ] - }, - { - "cell_type": "markdown", - "id": "79a36765bb1640f6", - "metadata": { - "collapsed": false, - "jupyter": { - "outputs_hidden": false - } - }, - "source": [ - "The nuisance variables are $R_1$, $R_2$, and $R_3$." - ] - }, - { - "cell_type": "markdown", - "id": "b86a9300fa3d3881", - "metadata": { - "collapsed": false, - "jupyter": { - "outputs_hidden": false - } - }, - "source": [ - "## Step 4: Simplify the network" - ] - }, - { - "cell_type": "markdown", - "id": "92e386966d986cec", - "metadata": { - "collapsed": false, - "jupyter": { - "outputs_hidden": false - } - }, - "source": [ - "The following function finds the nuisance variable (step 3), marks them as latent and then applies Evan's simplification rules to remove the nuisance variables. As a result, running the 'find_nuisance_variables' and 'mark_nuisance_variables_as_latent' functions in step 3 is not necessary to get the value of step 4. However, we called them to illustrate the results. The new graph obtained in step 4 does not contain the nuisance variables. " - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "id": "e1d0f93c0d993112", - "metadata": { - "ExecuteTime": { - "end_time": "2024-01-25T14:36:23.712654Z", - "start_time": "2024-01-25T14:36:23.192581Z" - }, - "collapsed": false, - "jupyter": { - "outputs_hidden": false - } - }, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "new_graph = remove_nuisance_variables(graph, treatments=X, outcomes=Y)\n", - "new_graph.draw()" - ] - }, - { - "cell_type": "markdown", - "id": "f1b8adaf922f3096", - "metadata": { - "collapsed": false, - "jupyter": { - "outputs_hidden": false - } - }, - "source": [ - "## Step 5: Estimate the query" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "id": "55a147fe3a3ee98d", - "metadata": { - "ExecuteTime": { - "end_time": "2024-01-25T14:36:23.977103Z", - "start_time": "2024-01-25T14:36:23.690832Z" - }, - "collapsed": false, - "jupyter": { - "outputs_hidden": false - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "1.1927594503118613" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "ATE_value = estimate_ace(graph=new_graph, treatments=X, outcomes=Y, data=data)\n", - "ATE_value" - ] - }, - { - "cell_type": "markdown", - "id": "8b1fbdecffb16328", - "metadata": { - "collapsed": false, - "jupyter": { - "outputs_hidden": false - } - }, - "source": [ - "The ATE amounts to 0.21 meaning that the average effect that $X$ has on $Y$ is negative." - ] - }, - { - "cell_type": "markdown", - "id": "e362c47381bc281f", - "metadata": { - "collapsed": false, - "jupyter": { - "outputs_hidden": false - } - }, - "source": [ - "# Evaluation Criterion\n", - "\n", - "As we used synthetic data set, we were able to generate two interventional data sets where in\n", - "one X was set to 1, and the other one X is set to 0. The ATE was calculated by subtracting the average value of Y obtained from each interventional data,\n", - "resulting in the ground truth ATE=0.01. The ATE indicates that increase in X can increase Y levels." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "id": "7aa1b23565adae07", - "metadata": { - "ExecuteTime": { - "end_time": "2024-01-25T14:36:24.001406Z", - "start_time": "2024-01-25T14:36:23.981263Z" - }, - "collapsed": false, - "jupyter": { - "outputs_hidden": false - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The true ATE is 0.49\n" - ] - } - ], - "source": [ - "def get_background_ace(seed=None) -> float:\n", - " data_1 = example.generate_data(1000, {X: 1.0}, seed=seed)\n", - " data_0 = example.generate_data(1000, {X: 0.0}, seed=seed)\n", - " return data_1.mean()[Y.name] - data_0.mean()[Y.name]\n", - "\n", - "\n", - "true_ate = get_background_ace(seed=SEED)\n", - "print(f\"The true ATE is {true_ate:.04}\")" - ] - }, - { - "cell_type": "markdown", - "id": "1de8f8091cc1f8c9", - "metadata": { - "collapsed": false, - "jupyter": { - "outputs_hidden": false - } - }, - "source": [ - "### Random Sampling Evaluation" - ] - }, - { - "cell_type": "markdown", - "id": "6949dceb5dff8017", - "metadata": { - "collapsed": false, - "jupyter": { - "outputs_hidden": false - } - }, - "source": [ - "Instead of relying on a single point estimate of ATE, such as what we did in the previous section, in this part, we sample from the observational data (D) several times. For each sub-sampled data, we calculate the ATE for the new graph and original graph to examine the effect of removing the nuisance variables from the graph." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "id": "8290a6c96fb3b26a", - "metadata": { - "ExecuteTime": { - "end_time": "2024-01-25T14:36:24.064421Z", - "start_time": "2024-01-25T14:36:23.993866Z" - }, - "collapsed": false, - "jupyter": { - "outputs_hidden": false - } - }, - "outputs": [], - "source": [ - "# Population => Generate D = 10000 data points\n", - "D = example.generate_data(10000, seed=SEED)" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "id": "7335a9ba0f7818cd", - "metadata": { - "ExecuteTime": { - "end_time": "2024-01-25T14:36:24.587225Z", - "start_time": "2024-01-25T14:36:24.016244Z" - }, - "collapsed": false, - "jupyter": { - "outputs_hidden": false - } - }, - "outputs": [], - "source": [ - "# Samples => Generate 1000 datasets with 1000 points each (d) using random sampling\n", - "\n", - "d_count = 1000\n", - "d_size = 1000\n", - "d = [D.sample(d_size) for _ in range(d_count)]" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "id": "f7e71ed8912c89bb", - "metadata": { - "ExecuteTime": { - "end_time": "2024-01-25T14:40:55.102266Z", - "start_time": "2024-01-25T14:36:24.597029Z" - }, - "collapsed": false, - "jupyter": { - "outputs_hidden": false - } - }, - "outputs": [], - "source": [ - "# Estimate the query in the form of ATE for the new graph\n", - "ate_new_graph = [estimate_ace(new_graph, treatments=X, outcomes=Y, data=data) for data in d]" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "id": "a9bf7f5040ce2225", - "metadata": { - "ExecuteTime": { - "end_time": "2024-01-25T14:41:11.077521Z", - "start_time": "2024-01-25T14:40:55.124037Z" - }, - "collapsed": false, - "jupyter": { - "outputs_hidden": false - } - }, - "outputs": [], - "source": [ - "# Estimate the query in the form of expected value (E[Y|do(X=0)]\n", - "expected_value_new_graph = [\n", - " estimate_query(\n", - " new_graph, data, treatments=X, outcome=Y, interventions={X: 0}, query_type=\"expected_value\"\n", - " )\n", - " for data in d\n", - "]" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "id": "2bf7dde37179a515", - "metadata": { - "ExecuteTime": { - "end_time": "2024-01-25T14:41:11.109398Z", - "start_time": "2024-01-25T14:41:11.080185Z" - }, - "collapsed": false, - "jupyter": { - "outputs_hidden": false - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "1.138909517506263" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "np.var(ate_new_graph)" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "id": "2193cf2bfe7deb09", - "metadata": { - "ExecuteTime": { - "end_time": "2024-01-25T14:41:11.188745Z", - "start_time": "2024-01-25T14:41:11.094143Z" - }, - "collapsed": false, - "jupyter": { - "outputs_hidden": false - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "0.774284708230741" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "np.var(expected_value_new_graph)" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "id": "337f8cacfd6cd318", - "metadata": { - "ExecuteTime": { - "end_time": "2024-01-25T14:48:32.685840Z", - "start_time": "2024-01-25T14:41:11.131360Z" - }, - "collapsed": false, - "jupyter": { - "outputs_hidden": false - } - }, - "outputs": [], - "source": [ - "# Estimate the query in the form of ATE for the original graph\n", - "ate_graph = [estimate_ace(graph, treatments=X, outcomes=Y, data=data) for data in d]" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "id": "90e8e51eacfcd61d", - "metadata": { - "ExecuteTime": { - "end_time": "2024-01-25T14:48:46.693915Z", - "start_time": "2024-01-25T14:48:32.693355Z" - }, - "collapsed": false, - "jupyter": { - "outputs_hidden": false - } - }, - "outputs": [], - "source": [ - "# Estimate the query in the form of expected value (E[Y|do(X=0)]\n", - "expected_value_graph = [\n", - " estimate_query(\n", - " graph, data, treatments=X, outcome=Y, interventions={X: 0}, query_type=\"expected_value\"\n", - " )\n", - " for data in d\n", - "]" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "id": "afcf227ffe06440", - "metadata": { - "ExecuteTime": { - "end_time": "2024-01-25T14:48:46.719692Z", - "start_time": "2024-01-25T14:48:46.695854Z" - }, - "collapsed": false, - "jupyter": { - "outputs_hidden": false - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "1.1389095175062627" - ] - }, - "execution_count": 22, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "np.var(ate_graph)" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "id": "c244aaf67982988", - "metadata": { - "ExecuteTime": { - "end_time": "2024-01-25T14:48:46.720306Z", - "start_time": "2024-01-25T14:48:46.708205Z" - }, - "collapsed": false, - "jupyter": { - "outputs_hidden": false - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "0.774284708230741" - ] - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "np.var(expected_value_graph)" - ] - }, - { - "cell_type": "markdown", - "id": "4f8902e34011dba9", - "metadata": { - "collapsed": false, - "jupyter": { - "outputs_hidden": false - } - }, - "source": [ - "We can see that the variance of the estimated ATEs from the new graph where the nuisance variables are removed is smaller than the original graph. However, the difference between the two is extremly small. This can be shown in the box plots below, where the difference is not visible by eye. Despite the marginal improvement in precision favoring the simplified graph, the process of detecting and removing nuisance variables can result in more interpretable and less complex networks." - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "id": "d3a6d3c4e69adfbb", - "metadata": { - "ExecuteTime": { - "end_time": "2024-01-25T14:20:46.692063Z", - "start_time": "2024-01-25T14:20:46.184537Z" - }, - "collapsed": false, - "jupyter": { - "outputs_hidden": false - } - }, - "outputs": [ + } + ], + "source": [ + "if reduced_graph is None:\n", + " print(\"Graph was not reduced, no need to re-check identifiability\")\n", + "else:\n", + " eliater.step_2_notebook(graph=reduced_graph, treatment=treatment, outcome=outcome)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "5830ffa8-a794-4e05-b450-26c5e621d889", + "metadata": {}, + "outputs": [ { "data": { + "text/markdown": [ + "## Step 5: Estimate the Query\n", + "\n", + "### Calculating the True Average Treatment Effect (ATE)\n", + "\n", + "We first generated synthetic observational data. Now, we generate two interventional datasets:\n", + "one where we set $X$ to $0.0$ and one where we set $X$ to $1.0$.\n", + "We can then calculate the \"true\" average treatment effect (ATE) as the difference of the means\n", + "for the outcome variable $Y$ in each. The ATE is formulated as:\n", + "\n", + "$ATE = \\mathbb{E}[Y \\mid do(X = 1)] - \\mathbb{E}[Y \\mid do(X = 0)]$\n", + "\n", + "After generating 10,000 samples for each distribution, we took 500 subsamples of size\n", + "of size 1,000 and calculated the\n", + "ATE for each. The variance comes to 1.7e-30, which shows that the ATE is very stable with respect\n", + "to random generation. We therefore calculate the _true_ ATE as the average value from these samplings,\n", + "which comes to 4.9e-01.\n", + "\n", + "The ATE can be interpreted in the following way:\n", + "\n", + "1. If the ATE is positive, it suggests that the treatment $X$ has a negative effect on the outcome $Y$\n", + "2. If the ATE is negative, it suggests that the treatment $X$ has a positive effect on the outcome $Y$\n", + "\n", + "### Estimating the Average Treatment Effect (ATE)\n", + "\n", + "In practice, we are often unable to get the appropriate interventional data, and therefore want to estimate\n", + "the average treatment effect (ATE) from observational data. Because we're using synthetic data, we generate\n", + "10,000 samples, then took 500 subsamples of size 1,000 through which we calculated\n", + "the following:\n", + "\n", + "1. The ATE, using the y0/ananke implementation\n", + "2. The ATE, using the Eliater linear regression implementation\n" + ], "text/plain": [ - "" + "" ] }, - "execution_count": 24, "metadata": {}, - "output_type": "execute_result" + "output_type": "display_data" }, { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjUAAAGdCAYAAADqsoKGAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAz0klEQVR4nO3de1yUdd7/8feAAiIwiiKHDQ94PixuaXljZVp5q7WueXfbCTdxt3po2kGz0kcUYppWdl5TK80Tq50sa/Nwm2VUa2aWh3ItLUw2wQMoCCTYzPX7ox+zjiDO4IzXzMXr+Xhcj7iu6zvX9QH7Dm+u6zvfy2YYhiEAAIAgF2J2AQAAAL5AqAEAAJZAqAEAAJZAqAEAAJZAqAEAAJZAqAEAAJZAqAEAAJZAqAEAAJbQyOwCzien06kDBw4oOjpaNpvN7HIAAIAHDMPQ8ePHlZSUpJCQM1+PaVCh5sCBA0pOTja7DAAAUA/5+fm64IILzri/QYWa6OhoSb/9UGJiYkyuBgAAeKK0tFTJycmu3+Nn0qBCTfUtp5iYGEINAABB5mxDRxgoDAAALIFQAwAALIFQAwAALKFBjakBADQchmHo119/lcPhMLsUnEVoaKgaNWp0ztOtEGoAAJZTVVWlgoICVVRUmF0KPBQZGanExESFhYXV+xiEGgCApTidTuXl5Sk0NFRJSUkKCwtjwtUAZhiGqqqqdPjwYeXl5aljx451TrBXF0INAMBSqqqq5HQ6lZycrMjISLPLgQeaNGmixo0b66efflJVVZUiIiLqdZygGSg8depU2Ww2t6VLly5mlwUACFD1/Wsf5vDFv1dQXanp3r27PvjgA9d6o0ZBVT7OI4fDoR07dqi4uFixsbFKTU1VaGio2WUB8AH6N84kqFJBo0aNlJCQYHYZCHC5ubl68cUXVVhY6NqWkJCgO++8U/369TOxMgDniv6NugTVtbk9e/YoKSlJKSkpSk9P1/79++tsX1lZqdLSUrcF1pabm6usrCylpKRozpw5Wr16tebMmaOUlBRlZWUpNzfX7BIB1BP9G2cTNKGmT58+WrRokdauXau5c+cqLy9Pl19+uY4fP37G18ycOVN2u9218IRua3M4HHrxxReVlpam6dOnq3v37oqMjFT37t01ffp0paWlae7cucxZAQShhtC/Tx83evoyderU817T8uXLFRoaqnHjxrm29e/fv846+/fvL0lq27ZtrftnzZrlt3qDJtQMGTJEI0aMUGpqqgYNGqTVq1fr2LFjev3118/4milTpqikpMS15Ofnn8eKcb7t2LFDhYWFSk9PrzHgLCQkROnp6SooKNCOHTtMqhBAfTWE/l1QUOBann32WcXExLhtmzRpkqtt9cSC/rZgwQI98MADWr58uU6cOCFJWrlypaumL774QpL0wQcfuLatXLnS9fpp06a5fQ8FBQW66667/FZv0ISa0zVr1kydOnXS3r17z9gmPDzc9URunsxtfcXFxZKkdu3a1bq/ent1OwDB45z7t2FI5eXmLIbh0feYkJDgWux2u2w2m2t99+7dio6O1po1a9SrVy+Fh4fr008/VUZGhq677jq349x7772uqyXSb/P2zJw5U+3atVOTJk3Us2dPvfnmm2etJy8vT//85z81efJkderUyRVWYmNjXXXFxcVJklq0aOHaFhsb6zpGdHS02/eVkJCgpk2bevTzqI+gGih8qrKyMv3www/685//bHYpCBDVHSkvL0/du3evsT8vL8+tHYDgcc79u6JCioryW311KiuTfPSLfPLkyZo9e7ZSUlLUvHlzj14zc+ZMLVu2TPPmzVPHjh2Vm5urkSNHKi4uTldcccUZX/fqq6/q2muvld1u18iRI7VgwQLdcsstPvk+/CVortRMmjRJH3/8sfbt26d//vOfGj58uEJDQ3XzzTebXRoCRGpqqhISEpSTkyOn0+m2z+l0KicnR4mJiUpNTTWpQgD1Rf/+zbRp0zRw4EC1b9/eoz/QKisr9dhjj2nhwoUaNGiQUlJSlJGRoZEjR2r+/PlnfJ3T6dSiRYs0cuRISdJNN92kTz/91BUePfXggw8qKirKbfnkk0+8OoY3guZKzb///W/dfPPNKioqUlxcnC677DJ9/vnnrktfQGhoqO68805lZWUpMzNT6enpateunfLy8pSTk6NNmzYpOzub+SyAIORN/z558mTNA0RG/nbFxAw+nNW4d+/eXrXfu3evKioqNHDgQLftVVVVuvDCC8/4uvXr16u8vFzXXHONJKlly5YaOHCgFi5cqEcffdTj899///3KyMhw2/a73/3O82/AS0ETalasWGF2CQgC/fr1U3Z2tl588UW30fqJiYnKzs5mHgsgiJ1T/7bZfHYLyEynj0cJCQmRcdqYnVNDXdn/D3Lvv/9+jTARHh5+xvMsWLBAxcXFatKkiWub0+nUjh07lJ2d7fHsvy1btlSHDh08ausLQRNqAE/169dPl156KTOOAhZE/3YXFxenb775xm3btm3b1LhxY0lSt27dFB4erv3799c5fuZURUVFWrVqlVasWOE2fsnhcOiyyy7T//3f/2nw4MG++yZ8iFADSwoNDa3z0iqA4EX//o8rr7xSTz75pJYsWaK0tDQtW7ZM33zzjevnEx0drUmTJmnChAlyOp267LLLVFJSos8++0wxMTEaNWpUjWMuXbpULVq00A033FDj6ebXXHONFixY4HGoOX78uNvsz5IUGRnpt08jB81AYQAA4G7QoEF6+OGH9cADD+jiiy/W8ePHdeutt7q1efTRR/Xwww9r5syZ6tq1qwYPHqz333//jB+PX7hwoYYPH14j0EjS9ddfr3fffVdHjhzxqL5HHnlEiYmJbssDDzzg/TfqIZtx+s04CystLZXdbldJSQlz1gCARZ04cUJ5eXlq166dIiIizC4HHqrr383T399cqQEAAJZAqAEAAJZAqAEAAJZAqAEAAJZAqAEAWFID+hyMJfji34tQAwCwlOqJ5yoqKkyuBN6o/veq/verDybfAwBYSmhoqJo1a6ZDhw5J+m2yt9rmXEFgMAxDFRUVOnTokJo1a3ZOs0MTagAAlpOQkCBJrmCDwNesWTPXv1t9EWoAAJZjs9mUmJioVq1a1f7UbgSUxo0b++T5XYQaAIBlhYaGNtiHXTZEDBQGAACWQKgBAACWQKgBAACWQKgBAACWQKgBAACWQKgBAACWQKgBAACWQKgBAACWQKgBAACWQKgBAACWQKgBAACWQKgBAACWQKgBAACWQKgBAACWQKgBAACWQKgBAACWQKgBAACWQKgBAACWQKgBAACWQKgBAACWELShZtasWbLZbLr33nvNLgUAAASAoAw1W7Zs0fz585Wammp2KQAAIEAEXagpKytTenq6Xn75ZTVv3tzscgAAQIAIulAzbtw4XXvttbr66qvP2rayslKlpaVuCwAAsKZGZhfgjRUrVuirr77Sli1bPGo/c+ZMZWdn+7kqAAAQCILmSk1+fr7uuece5eTkKCIiwqPXTJkyRSUlJa4lPz/fz1UCAACz2AzDMMwuwhPvvPOOhg8frtDQUNc2h8Mhm82mkJAQVVZWuu2rTWlpqex2u0pKShQTE+PvkgEAgA94+vs7aG4/XXXVVdq5c6fbttGjR6tLly568MEHzxpoAACAtQVNqImOjlaPHj3ctjVt2lQtWrSosR0AADQ8QTOmBgAAoC5Bc6WmNhs3bjS7BAAAECC4UgMAACyBUAMAACyBUAMAACyBUAMAACwhqAcKwz9OnDih/fv3m10GTtG6dWuPZ9IG6kL/Djz0b98h1KCG/fv364477jC7DJzipZdeUqdOncwuAxZA/w489G/fCZrHJPgCj0nwjFX+kvvpp580Y8YMPfTQQ2rTpo3Z5ZwT/pKDr9C/Aw/9++ws95gEnD8RERGW+quhTZs2lvp+gHNB/4aVMVAYAABYAqEGAABYAqEGAABYAqEGAABYAqEGAABYAqEGAABYAqEGAABYAqEGAABYAqEGAABYAqEGAABYAqEGAABYAqEGAABYAqEGAABYAqEGAABYAqEGAABYAqEGAABYAqEGAABYAqEGAABYAqEGAABYAqEGAABYAqEGAABYAqEGAABYAqEGAABYAqEGAABYAqEGAABYAqEGAABYQtCEmrlz5yo1NVUxMTGKiYlRWlqa1qxZY3ZZAAAgQARNqLngggs0a9Ysbd26VV9++aWuvPJKDRs2TN9++63ZpQEAgADQyOwCPDV06FC39RkzZmju3Ln6/PPP1b17d5OqAgAAgSJoQs2pHA6H3njjDZWXlystLe2M7SorK1VZWelaLy0tPR/lAQAAEwTN7SdJ2rlzp6KiohQeHq4xY8bo7bffVrdu3c7YfubMmbLb7a4lOTn5PFYLAADOp6AKNZ07d9a2bdu0efNmjR07VqNGjdKuXbvO2H7KlCkqKSlxLfn5+eexWgAAcD4F1e2nsLAwdejQQZLUq1cvbdmyRc8995zmz59fa/vw8HCFh4efzxIBAIBJgupKzemcTqfbmBkAANBwBc2VmilTpmjIkCFq3bq1jh8/rr///e/auHGj1q1bZ3ZpAAAgAARNqDl06JBuvfVWFRQUyG63KzU1VevWrdPAgQPNLg0AAASAoAk1CxYsMLsEAAAQwIJ6TA0AAEA1Qg0AALAEQg0AALAEQg0AALAEQg0AALAEQg0AALAEQg0AALAEQg0AALAEQg0AALAEQg0AALAEQg0AALAEQg0AALAEQg0AALAEQg0AALAEQg0AALAEQg0AALAEQg0AALAEQg0AALAEQg0AALAEQg0AALAEQg0AALAEQg0AALAEQg0AALAEQg0AALAEQg0AALAEj0PNF198IYfDccb9lZWVev31131SFAAAgLc8DjVpaWkqKipyrcfExOjHH390rR87dkw333yzb6sDAADwkMehxjCMOtfPtA0AAOB88OmYGpvN5svDAQAAeIyBwgAAwBIaedN4165dKiwslPTbrabdu3errKxMknTkyBHfVwcAAOAhr0LNVVdd5TZu5o9//KOk3247GYbB7ScAAGAaj0NNXl6eP+sAAAA4Jx6HmsWLF2vSpEmKjIz0Zz0AAAD14vFA4ezsbNf4GTPMnDlTF198saKjo9WqVStdd911+u6770yrBwAABJZ6z1Nzvn388ccaN26cPv/8c61fv14nT57Uf//3f6u8vNzUugAAQGDwaqCwmQOB165d67a+aNEitWrVSlu3blW/fv1MqgoAAAQKr0JNp06dzhpsiouLz6kgT5WUlEiSYmNjz9imsrJSlZWVrvXS0lK/1wUAAMzhVajJzs6W3W73Vy0eczqduvfee3XppZeqR48eZ2w3c+ZMZWdnn8fKAACAWbwKNTfddJNatWrlr1o8Nm7cOH3zzTf69NNP62w3ZcoUTZw40bVeWlqq5ORkf5cHAABM4HGoCZSJ9caPH69//OMfys3N1QUXXFBn2/DwcIWHh5+nygAAgJl88umn0tJSzZ07V7179/ZJUWc6//jx4/X222/rww8/VLt27fx2LgAAEHw8vlLjdDprbPvoo4+0cOFCrVy5Una7XcOHD/dpcacaN26c/v73v2vVqlWKjo52PYPKbrerSZMmfjsvAAAIDl6NqZGkn3/+WYsWLdKrr76qY8eO6ejRo/r73/+uG264wa+3qObOnStJ6t+/v9v2V199VRkZGX47LwAACA4e33566623dM0116hz587atm2bnnrqKR04cEAhISH6/e9/7/cxN4Zh1LoQaAAAgOTFlZobb7xRDz74oF577TVFR0f7syYAAACveXyl5q9//avmzJmjwYMHa968eTp69Kg/6wIAAPCKx6Fm/vz5Kigo0B133KHly5crMTFRw4YNk2EYtQ4iBgAAOJ88DjWS1KRJE40aNUoff/yxdu7cqe7duys+Pl6XXnqpbrnlFq1cudJfdQIAANTJq1Bzqo4dO+qxxx5Tfn6+li1bpoqKCt18882+rA0A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zNBDDz2kNm3amF1Og2e32xUfH292GeckPj5eS5Yuo38HAPp3YAmU/u3V7aeMjAzXR7hPnDihMWPGqOn/fyLnqeNtGrr4+PiA+MfFb9q0aaNOnTqZXQYsgv4dWOjfOJXHoeb0j2yPHDmyRptbb7313CsCAACoB49DzauvvurPOjw2Z84cPfnkkyosLFTPnj31wgsv6JJLLjG7LAAAYDKvn/1kptdee00TJ05UVlaWvvrqK/Xs2VODBg3SoUOHzC4NAACYLKhCzdNPP63bb79do0ePVrdu3TRv3jxFRkZq4cKFZpcGAABMFjShpqqqSlu3bnU9QFOSQkJCdPXVV2vTpk21vqayslKlpaVuCwAAsKagCTVHjhyRw+Go8amD+Ph4FRYW1vqamTNnym63u5bk5OTzUSoAADBB0ISa+pgyZYpKSkpcS35+vtklAQAAPwmaGYVbtmyp0NBQHTx40G37wYMHlZCQUOtrwsPDXfPqAAAAawuaKzVhYWHq1auXNmzY4NrmdDq1YcMGpaWlmVgZAAAIBEFzpUaSJk6cqFGjRql379665JJL9Oyzz6q8vFyjR482uzQAAGCyoAo1N954ow4fPqxHHnlEhYWF+sMf/qC1a9cyZTkAAAiuUCNJ48eP1/jx480uAwAABJigGVMDAABQF0INAACwBEINAACwBEINAACwBEINAACwBEINAACwBEINAACwBEINAACwBEINAACwBEINAACwBEINAACwBEINAACwBEINAACwBEINAACwBEINAACwBEINAACwBEINAACwBEINAACwBEINAACwBEINAACwBEINAACwBEINAACwBEINAACwBEINAACwBEINAACwBEINAACwBEINAACwBEINAACwBEINAACwBEINAACwBEINAACwBEINAACwBEINAACwBEINAACwhKAJNTNmzFDfvn0VGRmpZs2amV0OAAAIMEETaqqqqjRixAiNHTvW7FIAAEAAamR2AZ7Kzs6WJC1atMjcQgAAQEAKmlBTH5WVlaqsrHStl5aWmlgNAADwp6C5/VQfM2fOlN1udy3JyclmlwQAAPzE1FAzefJk2Wy2Opfdu3fX+/hTpkxRSUmJa8nPz/dh9QAAIJCYevvpvvvuU0ZGRp1tUlJS6n388PBwhYeH1/v1AAAgeJgaauLi4hQXF2dmCQAAwCKCZqDw/v37VVxcrP3798vhcGjbtm2SpA4dOigqKsrc4gAAgOmCJtQ88sgjWrx4sWv9wgsvlCR99NFH6t+/v0lVAQCAQBE0n35atGiRDMOosRBoAACAFEShBgAAoC6EGgAAYAmEGgAAYAmEGgAAYAmEGgAAYAmEGgAAYAmEGgAAYAmEGgAAYAmEGgAAYAmEGgAAYAmEGgAAYAmEGgAAYAmEGgAAYAmEGgAAYAmEGgAAYAmEGgAAYAmEGgAAYAmEGgAAYAmEGgAAYAmEGgAAYAmEGgAAYAmEGgAAYAmEGgAAYAmEGgAAYAmEGgAAYAmEGgAAYAmEGgAAYAmEGgAAYAmEGgAAYAmEGgAAYAmEGgAAYAmEGgAAYAmEGgAAYAmEGgAAYAmNzC7AE/v27dOjjz6qDz/8UIWFhUpKStLIkSP10EMPKSwszOzyLOfEiRPav3+/2WWcs59++sntv8GsdevWioiIMLsMWAD9O/DQv30nKELN7t275XQ6NX/+fHXo0EHffPONbr/9dpWXl2v27Nlml2c5+/fv1x133GF2GT4zY8YMs0s4Zy+99JI6depkdhmwAPp34KF/+47NMAzD7CLq48knn9TcuXP1448/evya0tJS2e12lZSUKCYmxo/VBbdg/0vuq6++0htvvKGioiLXthYtWmjEiBG66KKLTKys/vhLDr5C/w489O+z8/T3d1BcqalNSUmJYmNj62xTWVmpyspK13ppaam/y7KEiIiIoP2rITc3V/Pnz1daWprS09PVrl075eXlKScnR/Pnz1d2drb69etndpmAaejfsLKgvFKzd+9e9erVS7Nnz9btt99+xnZTp05VdnZ2je1cqbEmh8Oh9PR0paSkaPr06QoJ+c84eKfTqczMTOXl5WnZsmUKDQ01sVIA3qJ/N2yeXqkx9dNPkydPls1mq3PZvXu322t+/vlnDR48WCNGjKgz0EjSlClTVFJS4lry8/P9+e3AZDt27FBhYaHS09Pd3vAkKSQkROnp6SooKNCOHTtMqhBAfdG/4QlTbz/dd999ysjIqLNNSkqK6+sDBw5owIAB6tu3r1566aWzHj88PFzh4eHnWiaCRHFxsSSpXbt2te6v3l7dDkDwoH/DE6aGmri4OMXFxXnU9ueff9aAAQPUq1cvvfrqqzWSOlA9xiovL0/du3evsT8vL8+tHYDgQf+GJ4IiGfz888/q37+/WrdurdmzZ+vw4cMqLCxUYWGh2aUhgKSmpiohIUE5OTlyOp1u+5xOp3JycpSYmKjU1FSTKgRQX/RveCIoQs369eu1d+9ebdiwQRdccIESExNdC1AtNDRUd955pzZt2qTMzEx9++23qqio0LfffqvMzExt2rRJY8eOZRAhEITo3/BEUH76qb6Yp6ZhyM3N1Zw5c3Tw4EHXtoSEBN1555183BMIcvTvhikoPv0E+MOuXbt0+PBht22HDh3Srl27TKoIgK/Qv1GXoJ18D6jNvHnztGLFCjVv3lwDBw5UUlKSDhw4oPXr12vFihWSpDFjxphcJYD6oH/jbLj9BMuoqqrSkCFDFBERoaioKLfL0/Hx8SorK9OJEye0Zs0aHoQKBBn6d8PG7Sc0OKtWrZLD4VB5ebnat2+vOXPmaPXq1ZozZ47at2+v8vJyORwOrVq1yuxSAXiJ/g1PEGpgGT///LMkqXfv3po+fbq6d++uyMhIde/eXdOnT1fv3r3d2gEIHvRveIJQA8vp1KlTrdOod+zY0aSKAPgK/Rt1IdTAMrp27SpJWr16tX799Ve3fb/++qvWrFnj1g5A8KB/wxOEGlhGq1atJEnHjh3TiBEj9N577+nIkSN67733NGLECB07dsytHYDgQf+GJ/hINyyjehr1kJAQFRYW6qmnnnLtCw0NVVJSkgzDYBp1IAjRv+EJQg0so3oa9aysLPXp00e/+93vVFlZqfDwcP3888/avHmzsrOzmUYdCEL0b3iCeWpgObm5uXrxxRfdHniamJiosWPHMo06EOTo3w2Tp7+/CTWwpKqqKq1atUoHDhxQUlKShg0bxoRcgEXQvxseQk0tCDUNQ21/yfHAO8Aa6N8NEzMKo0HKzc1VVlaWUlJS3GYcTUlJUVZWlnJzc80uEUA90b9xNlypgWU4HA6lp6crJSVF06dPd5ugy+l0KjMzU3l5eVq2bBmDCYEgQ/9u2LhSgwZnx44dKiwsVHp6eq0zjqanp6ugoEA7duwwqUIA9UX/hicINbCM4uJiSVK7du1q3V+9vbodgOBB/4YnCDWwjNjYWElSXl5erfurt1e3AxA86N/wBKEGllE942hOTo6cTqfbPqfTqZycHCUmJjLjKBCE6N/wBKEGllE94+imTZuUmZmpb7/9VhUVFfr222+VmZmpTZs2aezYsQwiBIIQ/Rue4NNPsBxmHAWsi/7dMDH5Xi0INQ2Hw+HQjh07VFxcrNjYWKWmpvIXHGAR9O+Gx9Pf3zzQEpYUGhqqCy+80OwyAPgB/RtnwpgaAABgCYQaAABgCYQaAABgCYQaAABgCYQaAABgCYQaAABgCYQaAABgCYQaAABgCYQaAABgCQ1qRuHqJ0KUlpaaXAkAAPBU9e/tsz3ZqUGFmuPHj0uSkpOTTa4EAAB46/jx47Lb7Wfc36AeaOl0OnXgwAFFR0fLZrOZXQ78rLS0VMnJycrPz+cBpoDF0L8bFsMwdPz4cSUlJSkk5MwjZxrUlZqQkBBdcMEFZpeB8ywmJoY3PcCi6N8NR11XaKoxUBgAAFgCoQYAAFgCoQaWFR4erqysLIWHh5tdCgAfo3+jNg1qoDAAALAurtQAAABLINQAAABLINQAAABLINQAfrRo0SI1a9bM7DKAM7LZbHrnnXf8fp7+/fvr3nvvda23bdtWzz77rGu9sLBQAwcOVNOmTV19xhe1ZWRk6LrrrjunY/jTxo0bZbPZdOzYMbNLsQRCDc6JWW8YhAXg7A4fPqyxY8eqdevWCg8PV0JCggYNGqTPPvvM1aagoEBDhgw577Vt2bJFd9xxh2v9mWeeUUFBgbZt26bvv//e1NoQvBrUjMKAJ6qqqhQWFmZ2GcA5u/7661VVVaXFixcrJSVFBw8e1IYNG1RUVORqk5CQYEptcXFxbus//PCDevXqpY4dO7q2mVXb2fAeEbi4UgOf6t+/v+6++2498MADio2NVUJCgqZOnerWxmazae7cuRoyZIiaNGmilJQUvfnmm679tV2O3bZtm2w2m/bt26eNGzdq9OjRKikpkc1mk81mq3GOU02fPl2tWrVSdHS0brvtNk2ePFl/+MMfXPurrzbNmDFDSUlJ6ty5syRp6dKl6t27t6Kjo5WQkKBbbrlFhw4dqlHn+++/r9TUVEVEROi//uu/9M0339SoYd26deratauioqI0ePBgFRQUePeDBbx07NgxffLJJ3r88cc1YMAAtWnTRpdccommTJmiP/3pT652p97i2bdvn2w2m15//XVdfvnlatKkiS6++GJ9//332rJli3r37q2oqCgNGTJEhw8fdh2jug9lZ2crLi5OMTExGjNmjKqqqs5Y36m3n9q2bau33npLS5Yskc1mU0ZGRo3aJCk/P1833HCDmjVrptjYWA0bNkz79u1z7Xc4HJo4caKaNWumFi1a6IEHHjjrU50l6eWXX1ZycrIiIyM1fPhwPf30025XgqdOnao//OEPeuWVV9SuXTtFRERIktauXavLLrvMdb4//vGP+uGHH1yvq/55rlixQn379lVERIR69Oihjz/+uEYNW7duVe/evRUZGam+ffvqu+++O2vdqIlQA59bvHixmjZtqs2bN+uJJ57QtGnTtH79erc2Dz/8sK6//npt375d6enpuummm/Svf/3Lo+P37dtXzz77rGJiYlRQUKCCggJNmjSp1rY5OTmaMWOGHn/8cW3dulWtW7fW3Llza7TbsGGDvvvuO61fv17/+Mc/JEknT57Uo48+qu3bt+udd97Rvn37XG+2p7r//vv11FNPacuWLYqLi9PQoUN18uRJ1/6KigrNnj1bS5cuVW5urvbv33/GegFfiYqKUlRUlN555x1VVlZ69dqsrCxlZmbqq6++UqNGjXTLLbfogQce0HPPPadPPvlEe/fu1SOPPOL2mg0bNuhf//qXNm7cqOXLl2vlypXKzs726HxbtmzR4MGDdcMNN6igoEDPPfdcjTYnT57UoEGDFB0drU8++USfffaZ64+E6vD01FNPadGiRVq4cKE+/fRTFRcX6+23367z3J999pnGjBmje+65R9u2bdPAgQM1Y8aMGu327t2rt956SytXrtS2bdskSeXl5Zo4caK+/PJLbdiwQSEhIRo+fLicTqfba++//37dd999+vrrr5WWlqahQ4e6XS2TpIceekhPPfWUvvzySzVq1Eh/+ctfPPrZ4TQGcA5GjRplDBs2zLV+xRVXGJdddplbm4svvth48MEHXeuSjDFjxri16dOnjzF27FjDMAzjo48+MiQZR48ede3/+uuvDUlGXl6eYRiG8eqrrxp2u/2s9fXp08cYN26c27ZLL73U6Nmzp9v3EB8fb1RWVtZ5rC1bthiSjOPHj7vVuWLFCleboqIio0mTJsZrr73mqlOSsXfvXlebOXPmGPHx8WetHThXb775ptG8eXMjIiLC6Nu3rzFlyhRj+/btbm0kGW+//bZhGIaRl5dnSDJeeeUV1/7ly5cbkowNGza4ts2cOdPo3Lmza33UqFFGbGysUV5e7to2d+5cIyoqynA4HIZh/PbecM8997j2t2nTxnjmmWdc68OGDTNGjRp1xtqWLl1qdO7c2XA6na79lZWVRpMmTYx169YZhmEYiYmJxhNPPOHaf/LkSeOCCy5we4863Y033mhce+21btvS09Pd3l+ysrKMxo0bG4cOHTrjcQzDMA4fPmxIMnbu3GkYxn9+nrNmzapR0+OPP24Yxn/eRz744ANXm/fff9+QZPzyyy91ng81caUGPpeamuq2npiY6HbbRpLS0tJqrHt6pcYb3333nS655BK3baevS9Lvf//7GvfIt27dqqFDh6p169aKjo7WFVdcIUnav3+/W7tTv5fY2Fh17tzZ7XuJjIxU+/btXeu1/TwAf7j++ut14MABvfvuuxo8eLA2btyoiy66SIsWLarzdaf24fj4eEm/9ZFTt53+/3DPnj0VGRnpWk9LS1NZWZny8/N98J1I27dv1969exUdHe26ChUbG6sTJ07ohx9+UElJiQoKCtSnTx/Xaxo1aqTevXvXeVxP3yPatGlTYxzQnj17dPPNNyslJUUxMTFq27atpLrfI6prOv397tSfeWJioiTxPlEPDBSGzzVu3Nht3Waz1bgcW5eQkN+ytnHKvfBTb+f4Q9OmTd3Wy8vLNWjQIA0aNEg5OTmKi4vT/v37NWjQoDrHCdSmtp+HwdNJcJ5ERERo4MCBGjhwoB5++GHddtttysrKqvVWarVT/5+12Wy1bvOmT/tCWVmZevXqpZycnBr7Tg8b/nD6e4QkDR06VG3atNHLL7+spKQkOZ1O9ejRw+v3CKn2n/n5/hlbAVdqYIrPP/+8xnrXrl0l/ecN6tTBtNX3sKuFhYXJ4XCc9TydO3fWli1b3Ladvl6b3bt3q6ioSLNmzdLll1+uLl26nPGvplO/l6NHj+r77793fS9AoOnWrZvKy8t9ftzt27frl19+ca1//vnnioqKUnJysk+Of9FFF2nPnj1q1aqVOnTo4LbY7XbZ7XYlJiZq8+bNrtf8+uuv2rp1a53Hre97RFFRkb777jtlZmbqqquuUteuXXX06NFa2576HlFdE+8R/kGogSneeOMNLVy4UN9//72ysrL0xRdfaPz48ZKkDh06KDk5WVOnTtWePXv0/vvv66mnnnJ7fdu2bVVWVqYNGzboyJEjqqioqPU8d911lxYsWKDFixdrz549mj59unbs2OH6S+hMWrdurbCwML3wwgv68ccf9e677+rRRx+tte20adO0YcMGffPNN8rIyFDLli0DerIvNAxFRUW68sortWzZMu3YsUN5eXl644039MQTT2jYsGE+P19VVZX++te/ateuXVq9erWysrI0fvx415XXc5Wenq6WLVtq2LBh+uSTT5SXl6eNGzfq7rvv1r///W9J0j333KNZs2bpnXfe0e7du3XnnXeedVK7u+66S6tXr9bTTz+tPXv2aP78+VqzZs1Z3yOaN2+uFi1a6KWXXtLevXv14YcfauLEibW2nTNnjt5++23t3r1b48aN09GjRxkI7CeEGpgiOztbK1asUGpqqpYsWaLly5erW7dukn67DLt8+XLt3r1bqampevzxxzV9+nS31/ft21djxozRjTfeqLi4OD3xxBO1nic9PV1TpkzRpEmTdNFFFykvL08ZGRmuj2SeSVxcnBYtWqQ33nhD3bp106xZszR79uxa286aNUv33HOPevXqpcLCQr333nvMYQHTRUVFqU+fPnrmmWfUr18/9ejRQw8//LBuv/12/e1vf/P5+a666ip17NhR/fr104033qg//elPdU614K3IyEjl5uaqdevW+p//+R917dpVf/3rX3XixAnFxMRIku677z79+c9/1qhRo5SWlqbo6GgNHz68zuNeeumlmjdvnp5++mn17NlTa9eu1YQJE876HhESEqIVK1Zo69at6tGjhyZMmKAnn3yy1razZs3SrFmz1LNnT3366ad699131bJly/r9IFAnm8HNfZxnNptNb7/9tmlXMwYOHKiEhAQtXbr0nI6zceNGDRgwQEePHmV2YzRoGRkZOnbs2Hl53ML5cPvtt2v37t365JNPzuk4+/btU7t27fT111+7zY0F/2GgMCytoqJC8+bN06BBgxQaGqrly5frgw8+qDFvDoCGa/bs2a7nTq1Zs0aLFy/Wiy++aHZZqAdCDSzNZrNp9erVmjFjhk6cOKHOnTvrrbfe0tVXX212aQACxBdffKEnnnhCx48fV0pKip5//nnddtttZpeFeuD2EwAAsAQGCgMAAEsg1AAAAEsg1AAAAEsg1AAAAEsg1AAAAEsg1AAAAEsg1AAAAEsg1AAAAEsg1AAAAEv4fwQhYif317m8AAAAAElFTkSuQmCC", + "application/vnd.jupyter.widget-view+json": { + "model_id": "", + "version_major": 2, + "version_minor": 0 + }, "text/plain": [ - "
" + "Subsampling: 0%| | 0/500 [00:00\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " 2024-04-25T08:49:07.309054\n", + " image/svg+xml\n", + " \n", + " \n", + " Matplotlib v3.8.0, https://matplotlib.org/\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n" + ], "text/plain": [ - " 0%| | 0/500 [00:00" ] }, "metadata": {}, @@ -1699,13 +4498,27 @@ }, { "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "", - "version_major": 2, - "version_minor": 0 - }, + "text/markdown": [ + "Notes on this plot:\n", + "\n", + "1. We show the _true_ ATE as a red vertical line\n", + "2. We show both this process done with the original ADMG and the reduced ADMG. This shows that the reduction\n", + " on the ADMG does not affect estimation. However, reduction is still valuable for simplifying visual exploration.\n", + "\n", + "#### Interpreting $Y_0$/Ananke Estimation of ACE\n", + "\n", + "The p-value for testing if ananke/y0 estimation of the ACE is non-zero is 7.13e-65, which is below the the significance threshold of 0.01. Therefore, we reject the null hypothesis of the 1 Sample T-test and conclude that the distribution is significantly different from zero. This means that the treatment $X$ has *a negative effect* on the outcome $Y$. \n", + "\n", + "The p-value for testing if ananke/y0 estimation of the ACE is different from the reference ATE is 2.30e-20, which is below the the significance threshold of 0.01. Therefore, we reject the null hypothesis of the 1-Sample T-test and conclude that the distribution is significantly different from the ground truth calculated by synthetic generation of interventional data (ATE=4.90e-01). \n", + "\n", + "#### Interpreting Linear Regression Estimation of ACE\n", + "\n", + "The p-value for testing if Eliater linear regression estimation of the ACE is non-zero is 1.57e-69, which is below the the significance threshold of 0.01. Therefore, we reject the null hypothesis of the 1 Sample T-test and conclude that the distribution is significantly different from zero. This means that the treatment $X$ has *a negative effect* on the outcome $Y$. \n", + "\n", + "The p-value for testing if Eliater linear regression estimation of the ACE is different from the reference ATE is 5.64e-18, which is below the the significance threshold of 0.01. Therefore, we reject the null hypothesis of the 1-Sample T-test and conclude that the distribution is significantly different from the ground truth calculated by synthetic generation of interventional data (ATE=4.90e-01). \n" + ], "text/plain": [ - "No Workflow ATEs: 0%| | 0/500 [00:00" ] }, "metadata": {}, @@ -1713,112 +4526,1525 @@ }, { "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "", - "version_major": 2, - "version_minor": 0 - }, + "text/markdown": [ + "### Estimating the Expected Value\n", + "\n", + "We now estimate the query in the form of the expected value:\n", + "\n", + "$\\mathbb{E}[Y \\mid do(X = 0)]$\n" + ], "text/plain": [ - "Workflow ATEs: 0%| | 0/500 [00:00" ] }, "metadata": {}, "output_type": "display_data" - } - ], - "source": [ - "repeats = 500\n", - "datasets = [\n", - " example.generate_data(num_samples=500, seed=seed)\n", - " for seed in trange(repeats, desc=\"Generating datasets\", leave=False)\n", - "]\n", - "background_ates = [get_background_ace(seed=seed) for seed in trange(repeats, leave=False)]\n", - "unreduced_aces = [\n", - " estimate_ace(graph=graph, treatments=X, outcomes=Y, data=data)\n", - " for data in tqdm(datasets, desc=\"No Workflow ATEs\", leave=False)\n", - "]\n", - "reduced_aces = [\n", - " estimate_ace(\n", - " graph=remove_nuisance_variables(graph, treatments=X, outcomes=Y),\n", - " treatments=X,\n", - " outcomes=Y,\n", - " data=data,\n", - " )\n", - " for data in tqdm(datasets, desc=\"Workflow ATEs\", leave=False)\n", - "]" - ] - }, - { - "cell_type": "markdown", - "id": "fd17b15b-4a40-4894-92a4-11e2dfe6ca8e", - "metadata": {}, - "source": [ - "## Does Reducing Nuissance Variables Matter?\n", - "\n", - "In the experiment below, I create several random datasets and for each see if adding the removal of nuissance variables changes the resulting ACE by taking the difference between the ACE calculated on the original graph vs the reduced graph." - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "id": "a2b7ea36-99ba-4d13-8a42-241e364b41e7", - "metadata": {}, - "outputs": [ + }, { "data": { - "image/png": "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oENEFVN8fDxSUlJK3U/bwbFERBUZgw6RjMTHx8PDwxOZmRlaLyM3O0eHFRER6Zdeg87KlSuxcuVK3LhxAwDQsGFDzJ49Gz179gQAZGVl4b333sPmzZuRnZ0NPz8/rFixggOeiYqRkpKCzMwMtHl7Diyd3ErVN+F8JC7sWI28vLzyKY6ISA/0GnRq1qyJzz//HHXr1oUQAj/88ANef/11nDlzBg0bNsTUqVPxxx9/YMuWLVCpVJg4cSIGDBiAv/76S59lE1V4lk5upR7omp5wo3yKISLSI70Gnb59+6o9X7hwIVauXInjx4+jZs2aWLNmDTZt2oQuXboAAMLCwuDp6Ynjx4/jtdde00fJREREVImU6icgylN+fj42b96Mx48fw9vbG1FRUcjNzYWvr680j4eHB1xcXBAZGVnscrKzs5Genq72ICIioleT3oPO+fPnYW5uDqVSiXfeeQfbtm1DgwYNkJiYCGNjY1hZWanN7+DggMTExGKXFxISApVKJT2cnZ3L+S8gIiKiikrvQad+/fqIjo7GiRMn8O677yIgIACXLl3SenkzZsxAWlqa9Lh165YOqyUiIqLKRO+XlxsbG6NOnToAAC8vL5w8eRJff/013nzzTeTk5CA1NVXtrE5SUhIcHR2LXZ5SqYRSqSzvsomIiKgS0PsZnWcVFBQgOzsbXl5eMDIyQkREhDQtLi4O8fHx8Pb21mOFREREVFno9YzOjBkz0LNnT7i4uODhw4fYtGkTDh06hD179kClUiEwMBDTpk2DtbU1LC0tERwcDG9vb15xRURERCWi16CTnJyMkSNHIiEhASqVCk2aNMGePXvQrVs3AMDSpUthYGAAf39/tRsGEhEREZWEXoPOmjVrnjvdxMQEoaGhCA0NfUkVERERkZxUuDE6RERERLrCoENERESyxaBDREREssWgQ0RERLLFoENERESyxaBDREREssWgQ0RERLLFoENERESyxaBDREREssWgQ0RERLLFoENERESyxaBDREREssWgQ0RERLLFoENERESyxaBDREREssWgQ0RERLLFoENERESyxaBDREREssWgQ0RERLLFoENERESyxaBDREREssWgQ0RERLLFoENERESyxaBDREREssWgQ0RERLLFoENERESyxaBDREREssWgQ0RERLLFoENERESyZajvAoiIqHRiYmK06pednQ2lUqlVX1tbW7i4uGjVl0ifGHSIiCqJzLR7ABQYPny4dgtQKAAhtOpqamqG2NgYhh2qdBh0iIgqidyMhwAEmr31IezcPUrVN+F8JC7sWK1V3/SEGzixdh5SUlIYdKjSYdAhIqpkzO1dYO1Sv1R90hNuaN2XqDLjYGQiIiKSLQYdIiIiki0GHSIiIpItBh0iIiKSLQYdIiIiki0GHSIiIpItBh0iIiKSLQYdIiIiki29Bp2QkBC0atUKFhYWsLe3R//+/REXF6c2T1ZWFoKCgmBjYwNzc3P4+/sjKSlJTxUTERFRZaLXoHP48GEEBQXh+PHj2LdvH3Jzc9G9e3c8fvxYmmfq1Kn4/fffsWXLFhw+fBh37tzBgAED9Fg1ERERVRZ6/QmI3bt3qz0PDw+Hvb09oqKi0KFDB6SlpWHNmjXYtGkTunTpAgAICwuDp6cnjh8/jtdee00fZRMREVElUaHG6KSlpQEArK2tAQBRUVHIzc2Fr6+vNI+HhwdcXFwQGRlZ5DKys7ORnp6u9iAiIqJXU4UJOgUFBZgyZQratWuHRo0aAQASExNhbGwMKysrtXkdHByQmJhY5HJCQkKgUqmkh7Ozc3mXTkRERBVUhQk6QUFBuHDhAjZv3lym5cyYMQNpaWnS49atWzqqkIiIiCobvY7RKTRx4kTs3LkTR44cQc2aNaV2R0dH5OTkIDU1Ve2sTlJSEhwdHYtcllKphFKpLO+SiYiIqBLQ6xkdIQQmTpyIbdu24cCBA3B3d1eb7uXlBSMjI0REREhtcXFxiI+Ph7e398sul4iIiCoZvZ7RCQoKwqZNm/Dbb7/BwsJCGnejUqlgamoKlUqFwMBATJs2DdbW1rC0tERwcDC8vb15xRURERG9kF6DzsqVKwEAnTp1UmsPCwvDqFGjAABLly6FgYEB/P39kZ2dDT8/P6xYseIlV0pERESVkV6DjhDihfOYmJggNDQUoaGhL6EiIiIikpMKc9UVERERka4x6BAREZFsMegQERGRbFWI++gQkbr4+HikpKSUul9MTEw5VENEVHkx6BBVMPHx8fDw8ERmZobWy8jNztFhRURElReDDlEFk5KSgszMDLR5ew4sndxK1TfhfCQu7FiNvLy88imOiKiSYdAhqqAsndxg7VK/VH3SE26UTzFERJUUByMTERGRbPGMDhERlYi2g91tbW3h4uKi42qISoZBh4iInisz7R4ABYYPH65Vf1NTM8TGxjDskF4w6BAR0XPlZjwEINDsrQ9h5+5Rqr7pCTdwYu08pKSkMOiQXjDoEBFRiZjbu5R6gDyRvnEwMhEREckWgw4RERHJFoMOERERyRaDDhEREckWgw4RERHJFoMOERERyRaDDhEREckWgw4RERHJFoMOERERyRaDDhEREckWgw4RERHJFoMOERERyRaDDhEREckWgw4RERHJFoMOERERyRaDDhEREckWgw4RERHJFoMOERERyRaDDhEREckWgw4RERHJFoMOERERyRaDDhEREcmWob4LIJKr+Ph4pKSklLpfTExMOVRDRPRqYtAhKgfx8fHw8PBEZmaG1svIzc7RYUVERK8mBh2icpCSkoLMzAy0eXsOLJ3cStU34XwkLuxYjby8vPIpjojoFcKgQ1SOLJ3cYO1Sv1R90hNulE8xRESvIA5GJiIiItli0CEiIiLZYtAhIiIi2dJr0Dly5Aj69u2L6tWrQ6FQYPv27WrThRCYPXs2nJycYGpqCl9fX1y5ckU/xRIREVGlo9eg8/jxYzRt2hShoaFFTv/iiy+wfPlyrFq1CidOnEDVqlXh5+eHrKysl1wpERERVUZ6veqqZ8+e6NmzZ5HThBBYtmwZPvnkE7z++usAgHXr1sHBwQHbt2/HkCFDXmapREREVAlV2DE6169fR2JiInx9faU2lUqFNm3aIDIysth+2dnZSE9PV3sQERHRq6nCBp3ExEQAgIODg1q7g4ODNK0oISEhUKlU0sPZ2blc6yQiIqKKq8IGHW3NmDEDaWlp0uPWrVv6LomIiIj0pMIGHUdHRwBAUlKSWntSUpI0rShKpRKWlpZqDyIiIno1Vdig4+7uDkdHR0REREht6enpOHHiBLy9vfVYGREREVUWer3q6tGjR7h69ar0/Pr164iOjoa1tTVcXFwwZcoULFiwAHXr1oW7uztmzZqF6tWro3///vormoiIiCoNvQadU6dOoXPnztLzadOmAQACAgIQHh6ODz74AI8fP8a4ceOQmpqK9u3bY/fu3TAxMdFXyURERFSJ6DXodOrUCUKIYqcrFArMnz8f8+fPf4lVERERkVxU2DE6RERERGXFoENERESyxaBDREREssWgQ0RERLLFoENERESyxaBDREREssWgQ0RERLKl1/voEBHRqyEmJkarfra2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", + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " 2024-04-25T08:49:07.420616\n", + " image/svg+xml\n", + " \n", + " \n", + " Matplotlib v3.8.0, https://matplotlib.org/\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "\n" + ], "text/plain": [ - "
" + "
" ] }, "metadata": {}, "output_type": "display_data" - } - ], - "source": [ - "differences = [\n", - " unreduced_ace - reduced_ace for unreduced_ace, reduced_ace in zip(unreduced_aces, reduced_aces)\n", - "]\n", - "sns.histplot(differences)\n", - "plt.title(\"Differences between ACE from unreduced and reduced graph\")\n", - "plt.xlabel(\"Unreduced ACE - Reduced ACE\")\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "id": "296e27d5-5634-4c83-8772-8dab26376a00", - "metadata": {}, - "source": [ - "We're in the numerical instability region since this graph is on the scale of 1e-13 - this seems to indicate that reducing the latent variables from the graph does not have an effect on the ACE." - ] - }, - { - "cell_type": "markdown", - "id": "7d5955ff-544b-4e8e-a965-54593b4e825d", - "metadata": {}, - "source": [ - "# What's the effect of random seed?\n", - "\n", - "In the experiment above, a random seed of `seed=500` was generated which resulted in a \"true\" ATE and a \"calculated\" ATE. The conclusion was that because the calculated ATE was positive, that the treatment (X) had a negative effect on the outcome (Y). A few follow-up questions:\n", - "\n", - "1. What's the correspondence between these numbers? Should they be the same, or different, and by how much?\n", - "2. What happens if we pick different random seeds?\n", - "\n", - "Below, I picked several different random seeds and calculated the differences, and got this chart. You can see that sometimes, the difference is positive, negative, or close to zero. This means we need a better way of interpreting these results, otherwise setting the random seed is effectively cherry picking." - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "id": "a4db4ec5-808c-4fc6-937d-f6626cf38820", - "metadata": {}, - "outputs": [ + }, { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjIAAAGdCAYAAAAIbpn/AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAmT0lEQVR4nO3df1RU953/8dcgPxUYg8gPKyPEWkGzhtYfSJNtjaFSN8mJKydNmrBL1LXbLtIouxtLN9HqyZZsf0Qbixr3KLbbunZtG6O7W3Mi2ZDdDVhDmo02wMZWMqww6NjAIMKAMt8/epxvJ/6I4Ax3PvB8nHPPce4d3vNyTiqv3vncOzafz+cTAACAgSKsDgAAADBcFBkAAGAsigwAADAWRQYAABiLIgMAAIxFkQEAAMaiyAAAAGNRZAAAgLEirQ4QaoODg2pra1NCQoJsNpvVcQAAwE3w+Xzq7u7WlClTFBFx/fMuo77ItLW1KSMjw+oYAABgGFpbWzV16tTrHh/1RSYhIUHS79+IxMREi9MACCtutzR9euC+3/xGSk62Jg8AP4/Ho4yMDP/v8esZ9UXmysdJiYmJFBkAgbzeq/clJEj8WwGEjY9aFsJiXwAAYCyKDAAAMBZFBgAAGIsiAwAAjEWRAQAAxrK0yGRmZspms121lZaWSpL6+vpUWlqqSZMmKT4+XkVFRero6LAyMgAACCOWFpnjx4+rvb3dv73yyiuSpIceekiStG7dOh0+fFgHDhxQbW2t2tratHz5cisjAwCAMGLpfWQmT54c8PjZZ5/V9OnT9dnPflZdXV3avXu39u3bp8WLF0uSqqurlZOTo/r6ei1cuNCKyAAAIIyEzRqZ/v5+/ehHP9LKlStls9nU0NCggYEBFRQU+J+TnZ0th8Ohurq6687xer3yeDwBGwAAGJ3CpsgcPHhQnZ2devzxxyVJLpdL0dHRmjhxYsDzUlNT5XK5rjunsrJSdrvdv/E9SwAAjF5hU2R2796tpUuXasqUKbc0p6KiQl1dXf6ttbU1SAkBAEC4CYvvWnr//fd19OhR/fznP/fvS0tLU39/vzo7OwPOynR0dCgtLe26s2JiYhQTExPKuAAAIEyExRmZ6upqpaSk6L777vPvmzt3rqKiolRTU+Pf19zcLKfTqfz8fCtiAgCAMGP5GZnBwUFVV1erpKREkZH/P47dbteqVatUXl6upKQkJSYmqqysTPn5+VyxBIxiTqdTbrc7ZPOTk5PlcDhCNh/AyLK8yBw9elROp1MrV6686tiWLVsUERGhoqIieb1eFRYWavv27RakBDASnE6nsrNz1Nt7MWSvERc3Xk1NjZQZYJSwvMgsWbJEPp/vmsdiY2NVVVWlqqqqEU4FwAput1u9vReVt3KjEtMzgz7f096iY3s2ye12U2SAUcLyIgMAH5aYnqkkx0yrYwAwQFgs9gUAABgOigwAADAWRQYAABiLIgMAAIxFkQEAAMaiyAAAAGNRZAAAgLEoMgAAwFgUGQAAYCyKDAAAMBZFBgAAGIsiAwAAjEWRAQAAxqLIAAAAY1FkAACAsSgyAADAWBQZAABgLIoMAAAwFkUGAAAYiyIDAACMRZEBAADGosgAAABjRVodAIBZnE6n3G53SGY3NjaGZC6A0YsiA+CmOZ1OZWfnqLf3YkhfZ8DbH9L5AEYPigyAm+Z2u9Xbe1F5KzcqMT0z6PPbT9Tp5KFdunTpUtBnAxidKDIAhiwxPVNJjplBn+tpbwn6TACjG4t9AQCAsSgyAADAWBQZAABgLIoMAAAwFkUGAAAYiyIDAACMRZEBAADGosgAAABjUWQAAICxKDIAAMBYFBkAAGAsigwAADAWRQYAABjL8iJz5swZFRcXa9KkSYqLi9Mf/dEf6c033/Qf9/l82rBhg9LT0xUXF6eCggK99957FiYGAADhwtIi88EHH+iuu+5SVFSUfvGLX+jdd9/Vd7/7Xd12223+53zrW9/S888/r507d+rYsWOaMGGCCgsL1dfXZ2FyAAAQDiKtfPF/+Id/UEZGhqqrq/37srKy/H/2+XzaunWrnnrqKT344IOSpB/+8IdKTU3VwYMH9cgjj4x4ZgAAED4sLTKHDh1SYWGhHnroIdXW1upjH/uY/uqv/kqrV6+WJJ0+fVoul0sFBQX+n7Hb7crLy1NdXd01i4zX65XX6/U/9ng8of+LADBKY2OjJCnygw8050PH3nnnHV36g7PCQ5WcnCyHw3EL6QAMhaVF5re//a127Nih8vJyff3rX9fx48f11a9+VdHR0SopKZHL5ZIkpaamBvxcamqq/9iHVVZWatOmTSHPDsA8vV3nJdlUXFwsSUqWdO5Dz7m3oEDuW3iNuLjxampqpMwAI8TSIjM4OKh58+bpm9/8piTpk5/8pE6ePKmdO3eqpKRkWDMrKipUXl7uf+zxeJSRkRGUvADMNnCxW5JPuY+u1+SsbNl7PNLWJwKes2jt99Q1IXFY8z3tLTq2Z5PcbjdFBhghlhaZ9PR0zZo1K2BfTk6Ofvazn0mS0tLSJEkdHR1KT0/3P6ejo0O5ubnXnBkTE6OYmJjQBAYwKsSnOJTkmKmE7g+uOjZx6sc1LmH4Hy0BGFmWXrV01113qbm5OWDf//7v/2ratGmSfr/wNy0tTTU1Nf7jHo9Hx44dU35+/ohmBQAA4cfSMzLr1q3Tpz/9aX3zm9/UF77wBf3yl7/Url27tGvXLkmSzWbT2rVr9cwzz2jGjBnKysrS008/rSlTpmjZsmVWRgcAAGHA0iIzf/58vfjii6qoqNDmzZuVlZWlrVu36rHHHvM/58knn1RPT4++9KUvqbOzU3fffbeOHDmi2NhYC5MDAIBwYGmRkaT7779f999//3WP22w2bd68WZs3bx7BVAAAwASWf0UBAADAcFFkAACAsSz/aAkYi5xOp9zuW7nt2o1xd1kAYwVFBhhhTqdT2dk56u29GLLX4O6yAMYKigwwwtxut3p7Lypv5UYlpmcGfT53lwUwllBkAIskpmcqyTHT6hgAYDQW+wIAAGNRZAAAgLEoMgAAwFgUGQAAYCyKDAAAMBZFBgAAGIsiAwAAjEWRAQAAxqLIAAAAY1FkAACAsSgyAADAWBQZAABgLIoMAAAwFkUGAAAYiyIDAACMRZEBAADGosgAAABjRVodAEBoNDY2GjETAG4FRQYYZXq7zkuyqbi4OGSvMeDtD9lsABgKigwwygxc7JbkU+6j6zU5Kzuos9tP1OnkoV26dOlSUOcCwHBRZIBRKj7FoSTHzKDO9LS3BHUeANwqFvsCAABjUWQAAICxKDIAAMBYFBkAAGAsigwAADAWRQYAABiLIgMAAIxFkQEAAMaiyAAAAGNRZAAAgLEoMgAAwFgUGQAAYCyKDAAAMJalReYb3/iGbDZbwJadne0/3tfXp9LSUk2aNEnx8fEqKipSR0eHhYkBAEA4sfyMzOzZs9Xe3u7f/uu//st/bN26dTp8+LAOHDig2tpatbW1afny5RamBQAA4STS8gCRkUpLS7tqf1dXl3bv3q19+/Zp8eLFkqTq6mrl5OSovr5eCxcuHOmoAAAgzFh+Rua9997TlClTdPvtt+uxxx6T0+mUJDU0NGhgYEAFBQX+52ZnZ8vhcKiuru6687xerzweT8AGAABGJ0uLTF5envbu3asjR45ox44dOn36tP74j/9Y3d3dcrlcio6O1sSJEwN+JjU1VS6X67ozKysrZbfb/VtGRkaI/xYAAMAqln60tHTpUv+f58yZo7y8PE2bNk3/8i//ori4uGHNrKioUHl5uf+xx+OhzAAAMEpZ/tHSH5o4caI+8YlP6NSpU0pLS1N/f786OzsDntPR0XHNNTVXxMTEKDExMWADAACjU1gVmQsXLug3v/mN0tPTNXfuXEVFRammpsZ/vLm5WU6nU/n5+RamBAAA4cLSj5b+5m/+Rg888ICmTZumtrY2bdy4UePGjdMXv/hF2e12rVq1SuXl5UpKSlJiYqLKysqUn5/PFUsAAECSxUXm//7v//TFL35R58+f1+TJk3X33Xervr5ekydPliRt2bJFERERKioqktfrVWFhobZv325lZAAAEEYsLTL79++/4fHY2FhVVVWpqqpqhBIBAACThNUaGQAAgKGgyAAAAGNRZAAAgLEoMgAAwFgUGQAAYCyKDAAAMBZFBgAAGIsiAwAAjEWRAQAAxqLIAAAAY1FkAACAsSgyAADAWBQZAABgLIoMAAAwFkUGAAAYiyIDAACMRZEBAADGosgAAABjUWQAAICxKDIAAMBYFBkAAGAsigwAADAWRQYAABiLIgMAAIxFkQEAAMaiyAAAAGNRZAAAgLEoMgAAwFgUGQAAYCyKDAAAMBZFBgAAGIsiAwAAjEWRAQAAxoq0OgAAjDaNjY0hmZucnCyHwxGS2YCpKDIAECS9Xecl2VRcXByS+XFx49XU1EiZAf4ARQYAgmTgYrckn3IfXa/JWdlBne1pb9GxPZvkdrspMsAfoMgAQJDFpziU5JhpdQxgTGCxLwAAMBZFBgAAGIsiAwAAjBU2RebZZ5+VzWbT2rVr/fv6+vpUWlqqSZMmKT4+XkVFRero6LAuJAAACCthUWSOHz+uF154QXPmzAnYv27dOh0+fFgHDhxQbW2t2tratHz5cotSAgCAcGN5kblw4YIee+wx/eM//qNuu+02//6uri7t3r1bzz33nBYvXqy5c+equrpab7zxhurr6y1MDAAAwoXlRaa0tFT33XefCgoKAvY3NDRoYGAgYH92drYcDofq6uquO8/r9crj8QRsAABgdLL0PjL79+/XW2+9pePHj191zOVyKTo6WhMnTgzYn5qaKpfLdd2ZlZWV2rRpU7CjAgCAMDSsMzK33367zp8/f9X+zs5O3X777Tc1o7W1VU888YR+/OMfKzY2djgxrqmiokJdXV3+rbW1NWizAQBAeBlWkWlpadHly5ev2u/1enXmzJmbmtHQ0KCzZ8/qU5/6lCIjIxUZGana2lo9//zzioyMVGpqqvr7+9XZ2Rnwcx0dHUpLS7vu3JiYGCUmJgZsAABgdBrSR0uHDh3y//nll1+W3W73P758+bJqamqUmZl5U7PuvfdenThxImDfihUrlJ2drfXr1ysjI0NRUVGqqalRUVGRJKm5uVlOp1P5+flDiQ0AAEapIRWZZcuWSZJsNptKSkoCjkVFRSkzM1Pf/e53b2pWQkKC7rjjjoB9EyZM0KRJk/z7V61apfLyciUlJSkxMVFlZWXKz8/XwoULhxIbAACMUkMqMoODg5KkrKwsHT9+XMnJySEJdcWWLVsUERGhoqIieb1eFRYWavv27SF9TQAAYI5hXbV0+vTpYOeQJL322msBj2NjY1VVVaWqqqqQvB4AADDbsC+/rqmpUU1Njc6ePes/U3PFnj17bjkYAADARxlWkdm0aZM2b96sefPmKT09XTabLdi5AAAAPtKwiszOnTu1d+9e/dmf/Vmw8wAAANy0Yd1Hpr+/X5/+9KeDnQUAAGBIhlVk/uIv/kL79u0LdhYAAIAhGdZHS319fdq1a5eOHj2qOXPmKCoqKuD4c889F5RwAAAANzKsIvPOO+8oNzdXknTy5MmAYyz8BQAAI2VYReY//uM/gp0DAABgyIa1RgYAACAcDOuMzD333HPDj5BeffXVYQcCAAC4WcMqMlfWx1wxMDCgt99+WydPnrzqyyQBAABCZVhFZsuWLdfc/41vfEMXLly4pUAAAAA3K6hrZIqLi/meJQAAMGKCWmTq6uoUGxsbzJEAAADXNayPlpYvXx7w2Ofzqb29XW+++aaefvrpoAQDAAD4KMMqMna7PeBxRESEZs6cqc2bN2vJkiVBCQYAAPBRhlVkqqurg50DAABgyIZVZK5oaGhQY2OjJGn27Nn65Cc/GZRQAAAAN2NYRebs2bN65JFH9Nprr2nixImSpM7OTt1zzz3av3+/Jk+eHMyMwIhzOp1yu90hmX2l/AMAbt2wikxZWZm6u7v161//Wjk5OZKkd999VyUlJfrqV7+qf/7nfw5qSGAkOZ1OZWfnqLf3YkhfZ8DbH9L5ADAWDKvIHDlyREePHvWXGEmaNWuWqqqqWOwL47ndbvX2XlTeyo1KTM8M+vz2E3U6eWiXLl26FPTZADDWDKvIDA4OKioq6qr9UVFRGhwcvOVQQDhITM9UkmNm0Od62luCPhMAxqph3RBv8eLFeuKJJ9TW1ubfd+bMGa1bt0733ntv0MIBAADcyLCKzPe//315PB5lZmZq+vTpmj59urKysuTxeLRt27ZgZwQAALimYX20lJGRobfeektHjx5VU1OTJCknJ0cFBQVBDQcAAHAjQzoj8+qrr2rWrFnyeDyy2Wz63Oc+p7KyMpWVlWn+/PmaPXu2/vM//zNUWQEAAAIMqchs3bpVq1evVmJi4lXH7Ha7/vIv/1LPPfdc0MIBAADcyJCKzP/8z//o85///HWPL1myRA0NDbccCgAA4GYMqch0dHRc87LrKyIjI3Xu3LlbDgUAAHAzhlRkPvaxj+nkyZPXPf7OO+8oPT39lkMBAADcjCEVmT/5kz/R008/rb6+vquO9fb2auPGjbr//vuDFg4AAOBGhnT59VNPPaWf//zn+sQnPqE1a9Zo5szf3/W0qalJVVVVunz5sv7u7/4uJEEBAAA+bEhFJjU1VW+88Ya+8pWvqKKiQj6fT5Jks9lUWFioqqoqpaamhiQoAADAhw35hnjTpk3Tv//7v+uDDz7QqVOn5PP5NGPGDN12222hyAcAAHBdw7qzryTddtttmj9/fjCzAAAADMmwvmsJAAAgHFBkAACAsSgyAADAWMNeIwMAGHmNjY0hm52cnCyHwxGy+UAoUGQAwAC9Xecl2VRcXByy14iLG6+mpkbKDIxiaZHZsWOHduzYoZaWFknS7NmztWHDBi1dulSS1NfXp7/+67/W/v375fV6VVhYqO3bt3OvGgBjzsDFbkk+5T66XpOzsoM+39PeomN7NsntdlNkYBRLi8zUqVP17LPPasaMGfL5fPrBD36gBx98UL/61a80e/ZsrVu3Tv/2b/+mAwcOyG63a82aNVq+fLn++7//28rYAGCZ+BSHkhwzrY4BhA1Li8wDDzwQ8Pjv//7vtWPHDtXX12vq1KnavXu39u3bp8WLF0uSqqurlZOTo/r6ei1cuNCKyAAAIIyEzVVLly9f1v79+9XT06P8/Hw1NDRoYGBABQUF/udkZ2fL4XCorq7uunO8Xq88Hk/ABgAARifLi8yJEycUHx+vmJgYffnLX9aLL76oWbNmyeVyKTo6WhMnTgx4fmpqqlwu13XnVVZWym63+7eMjIwQ/w0AAIBVLC8yM2fO1Ntvv61jx47pK1/5ikpKSvTuu+8Oe15FRYW6urr8W2traxDTAgCAcGL55dfR0dH6+Mc/LkmaO3eujh8/ru9973t6+OGH1d/fr87OzoCzMh0dHUpLS7vuvJiYGMXExIQ6NgAACAOWn5H5sMHBQXm9Xs2dO1dRUVGqqanxH2tubpbT6VR+fr6FCQEAQLiw9IxMRUWFli5dKofDoe7ubu3bt0+vvfaaXn75Zdntdq1atUrl5eVKSkpSYmKiysrKlJ+fzxVLAABAksVF5uzZs/rzP/9ztbe3y263a86cOXr55Zf1uc99TpK0ZcsWRUREqKioKOCGeAAAAJLFRWb37t03PB4bG6uqqipVVVWNUCIAAGCSsFsjAwAAcLMoMgAAwFgUGQAAYCyKDAAAMBZFBgAAGIsiAwAAjEWRAQAAxqLIAAAAY1FkAACAsSgyAADAWBQZAABgLIoMAAAwFkUGAAAYiyIDAACMRZEBAADGosgAAABjUWQAAICxKDIAAMBYFBkAAGAsigwAADAWRQYAABiLIgMAAIxFkQEAAMaiyAAAAGNRZAAAgLEoMgAAwFgUGQAAYCyKDAAAMBZFBgAAGIsiAwAAjEWRAQAAxqLIAAAAY1FkAACAsSKtDgAMh9PplNvtDsnsxsbGkMwFAAQfRQbGcTqdys7OUW/vxZC+zoC3P6TzAQC3jiID47jdbvX2XlTeyo1KTM8M+vz2E3U6eWiXLl26FPTZAIDgosjAWInpmUpyzAz6XE97S9BnAgBCg8W+AADAWBQZAABgLIoMAAAwlqVFprKyUvPnz1dCQoJSUlK0bNkyNTc3Bzynr69PpaWlmjRpkuLj41VUVKSOjg6LEgMAgHBiaZGpra1VaWmp6uvr9corr2hgYEBLlixRT0+P/znr1q3T4cOHdeDAAdXW1qqtrU3Lly+3MDUAAAgXll61dOTIkYDHe/fuVUpKihoaGvSZz3xGXV1d2r17t/bt26fFixdLkqqrq5WTk6P6+notXLjQitgAACBMhNUama6uLklSUlKSJKmhoUEDAwMqKCjwPyc7O1sOh0N1dXXXnOH1euXxeAI2AAAwOoVNkRkcHNTatWt111136Y477pAkuVwuRUdHa+LEiQHPTU1NlcvluuacyspK2e12/5aRkRHq6AAAwCJhU2RKS0t18uRJ7d+//5bmVFRUqKury7+1trYGKSEAAAg3YXFn3zVr1uhf//Vf9frrr2vq1Kn+/Wlpaerv71dnZ2fAWZmOjg6lpaVdc1ZMTIxiYmJCHRkAAIQBS8/I+Hw+rVmzRi+++KJeffVVZWVlBRyfO3euoqKiVFNT49/X3Nwsp9Op/Pz8kY4LAADCjKVnZEpLS7Vv3z699NJLSkhI8K97sdvtiouLk91u16pVq1ReXq6kpCQlJiaqrKxM+fn5XLEEAACsLTI7duyQJC1atChgf3V1tR5//HFJ0pYtWxQREaGioiJ5vV4VFhZq+/btI5wUAACEI0uLjM/n+8jnxMbGqqqqSlVVVSOQCAAAmCRsrloCAAAYKooMAAAwVlhcfo3Ryel0yu12B31uY2Nj0GcCAMxEkUFIOJ1OZWfnqLf3YsheY8DbH7LZAAAzUGQQEm63W729F5W3cqMS0zODOrv9RJ1OHtqlS5cuBXUuAMA8FBmEVGJ6ppIcM4M609PeEtR5AABzsdgXAAAYiyIDAACMRZEBAADGosgAAABjUWQAAICxKDIAAMBYFBkAAGAsigwAADAWRQYAABiLIgMAAIxFkQEAAMaiyAAAAGPxpZEAAL/GxsaQzU5OTpbD4QjZfIxNFBkAgHq7zkuyqbi4OGSvERc3Xk1NjZQZBBVFBgCggYvdknzKfXS9JmdlB32+p71Fx/ZsktvtpsggqCgyAAC/+BSHkhwzrY4B3DQW+wIAAGNRZAAAgLEoMgAAwFgUGQAAYCyKDAAAMBZFBgAAGIsiAwAAjEWRAQAAxqLIAAAAY1FkAACAsSgyAADAWBQZAABgLIoMAAAwFkUGAAAYiyIDAACMRZEBAADGosgAAABjUWQAAICxLC0yr7/+uh544AFNmTJFNptNBw8eDDju8/m0YcMGpaenKy4uTgUFBXrvvfesCQsAAMKOpUWmp6dHd955p6qqqq55/Fvf+paef/557dy5U8eOHdOECRNUWFiovr6+EU4KAADCUaSVL7506VItXbr0msd8Pp+2bt2qp556Sg8++KAk6Yc//KFSU1N18OBBPfLIIyMZFQAAhCFLi8yNnD59Wi6XSwUFBf59drtdeXl5qquru26R8Xq98nq9/scejyfkWQEAN6exsTEkc5OTk+VwOEIyG+EtbIuMy+WSJKWmpgbsT01N9R+7lsrKSm3atCmk2QAAQ9PbdV6STcXFxSGZHxc3Xk1NjZSZMShsi8xwVVRUqLy83P/Y4/EoIyPDwkQAgIGL3ZJ8yn10vSZnZQd1tqe9Rcf2bJLb7abIjEFhW2TS0tIkSR0dHUpPT/fv7+joUG5u7nV/LiYmRjExMaGOBwAYhvgUh5IcM62OgVEkbO8jk5WVpbS0NNXU1Pj3eTweHTt2TPn5+RYmAwAA4cLSMzIXLlzQqVOn/I9Pnz6tt99+W0lJSXI4HFq7dq2eeeYZzZgxQ1lZWXr66ac1ZcoULVu2zLrQAAAgbFhaZN58803dc889/sdX1raUlJRo7969evLJJ9XT06MvfelL6uzs1N13360jR44oNjbWqsgAACCMWFpkFi1aJJ/Pd93jNptNmzdv1ubNm0cwFQAAMEXYrpEBAAD4KBQZAABgLIoMAAAwFkUGAAAYiyIDAACMRZEBAADGosgAAABjUWQAAICxwvZLIwEAGIrGxsaQzU5OTuabtcMURQYAYLTervOSbCouLg7Za8TFjVdTUyNlJgxRZAAARhu42C3Jp9xH12tyVnbQ53vaW3Rszya53W6KTBiiyAAARoX4FIeSHDOtjoERxmJfAABgLIoMAAAwFkUGAAAYiyIDAACMRZEBAADGosgAAABjcfn1GOZ0OuV2u0MyO5R32AQA4AqKzBjldDqVnZ2j3t6LIX2dAW9/SOcDAMY2iswY5Xa71dt7UXkrNyoxPTPo89tP1OnkoV26dOlS0GcDAHAFRWaMS0zPDMmdMD3tLUGfCQDAh7HYFwAAGIsiAwAAjEWRAQAAxqLIAAAAY1FkAACAsSgyAADAWFx+DQCAxUJ5p3VJSk5OlsPhCNl8K1FkAACw0EjcaT0ubryamhpHZZmhyAAAYKFQ32nd096iY3s2ye12U2QAAEBohOpO66Mdi30BAICxOCNzC0K9OMvr9SomJiYksxsbG0MyFwAQnkL1777VC4kpMsM0EouzZLNJPl/o5ksa8PaHdD4AwFq9Xecl2VRcXByS+VYvJKbIDFOoF2e1n6jTyUO7lPvoek3Oyg7Z/EuXLgV9NgAgfAxc7JbkC8nvk3BYSEyRuUWhWpzlaW+RJMWnOEI6HwAwNoTq94nVWOwLAACMxRkZAABuQqgWy3Lxxa2hyAAAcAOhXix7BRdfDI8RRaaqqkrf/va35XK5dOedd2rbtm1asGCB1bEAAGNAKBfLSlx8cavCvsj85Cc/UXl5uXbu3Km8vDxt3bpVhYWFam5uVkpKitXxAABjBBdfhKewX+z73HPPafXq1VqxYoVmzZqlnTt3avz48dqzZ4/V0QAAgMXC+oxMf3+/GhoaVFFR4d8XERGhgoIC1dXVXfNnvF6vvF6v/3FXV5ckyePxBDXbhQsXJEm/e79Zl7y9QZ0tSZ729yVJXWfeU1SkjfkjNJv51s22Yn5fT7c+/C/Dud+clGdCQlDmB9Noe+9Nmc38j5jtckr6/e/EYP+evTLP91E3hvWFsTNnzvgk+d54442A/X/7t3/rW7BgwTV/ZuPGjT5JbGxsbGxsbKNga21tvWFXCOszMsNRUVGh8vJy/+PBwUH97ne/06RJk2SzBb/phiOPx6OMjAy1trYqMTHR6jijCu9t6PDehg7vbejw3oaOz+dTd3e3pkyZcsPnhXWRSU5O1rhx49TR0RGwv6OjQ2lpadf8mZiYmKu+aHHixImhihjWEhMT+R9WiPDehg7vbejw3oYO721o2O32j3xOWC/2jY6O1ty5c1VTU+PfNzg4qJqaGuXn51uYDAAAhIOwPiMjSeXl5SopKdG8efO0YMECbd26VT09PVqxYoXV0QAAgMXCvsg8/PDDOnfunDZs2CCXy6Xc3FwdOXJEqampVkcLWzExMdq4ceNVH7Hh1vHehg7vbejw3oYO7631bD7fR13XBAAAEJ7Ceo0MAADAjVBkAACAsSgyAADAWBQZAABgLIrMGOH1epWbmyubzaa3337b6jjGa2lp0apVq5SVlaW4uDhNnz5dGzduVH9/v9XRjFVVVaXMzEzFxsYqLy9Pv/zlL62OZLzKykrNnz9fCQkJSklJ0bJly9Tc3Gx1rFHp2Weflc1m09q1a62OMuZQZMaIJ5988iNv84yb19TUpMHBQb3wwgv69a9/rS1btmjnzp36+te/bnU0I/3kJz9ReXm5Nm7cqLfeekt33nmnCgsLdfbsWaujGa22tlalpaWqr6/XK6+8ooGBAS1ZskQ9PT1WRxtVjh8/rhdeeEFz5syxOsqYxOXXY8AvfvELlZeX62c/+5lmz56tX/3qV8rNzbU61qjz7W9/Wzt27NBvf/tbq6MYJy8vT/Pnz9f3v/99Sb+/g3dGRobKysr0ta99zeJ0o8e5c+eUkpKi2tpafeYzn7E6zqhw4cIFfepTn9L27dv1zDPPKDc3V1u3brU61pjCGZlRrqOjQ6tXr9Y//dM/afz48VbHGdW6urqUlJRkdQzj9Pf3q6GhQQUFBf59ERERKigoUF1dnYXJRp+uri5J4r/TICotLdV9990X8N8vRlbY39kXw+fz+fT444/ry1/+subNm6eWlharI41ap06d0rZt2/Sd73zH6ijGcbvdunz58lV3605NTVVTU5NFqUafwcFBrV27VnfddZfuuOMOq+OMCvv379dbb72l48ePWx1lTOOMjIG+9rWvyWaz3XBramrStm3b1N3drYqKCqsjG+Nm39s/dObMGX3+85/XQw89pNWrV1uUHLix0tJSnTx5Uvv377c6yqjQ2tqqJ554Qj/+8Y8VGxtrdZwxjTUyBjp37pzOnz9/w+fcfvvt+sIXvqDDhw/LZrP591++fFnjxo3TY489ph/84Aehjmqcm31vo6OjJUltbW1atGiRFi5cqL179yoigv9vMFT9/f0aP368fvrTn2rZsmX+/SUlJers7NRLL71kXbhRYs2aNXrppZf0+uuvKysry+o4o8LBgwf1p3/6pxo3bpx/3+XLl2Wz2RQRESGv1xtwDKFDkRnFnE6nPB6P/3FbW5sKCwv105/+VHl5eZo6daqF6cx35swZ3XPPPZo7d65+9KMf8Y/WLcjLy9OCBQu0bds2Sb//GMThcGjNmjUs9r0FPp9PZWVlevHFF/Xaa69pxowZVkcaNbq7u/X+++8H7FuxYoWys7O1fv16Pr4bQayRGcUcDkfA4/j4eEnS9OnTKTG36MyZM1q0aJGmTZum73znOzp37pz/WFpamoXJzFReXq6SkhLNmzdPCxYs0NatW9XT06MVK1ZYHc1opaWl2rdvn1566SUlJCTI5XJJkux2u+Li4ixOZ7aEhISrysqECRM0adIkSswIo8gAw/DKK6/o1KlTOnXq1FWlkJOcQ/fwww/r3Llz2rBhg1wul3Jzc3XkyJGrFgBjaHbs2CFJWrRoUcD+6upqPf744yMfCAgBPloCAADGYmUiAAAwFkUGAAAYiyIDAACMRZEBAADGosgAAABjUWQAAICxKDIAAMBYFBkAAGAsigwAADAWRQYAABiLIgMAAIxFkQEAAMb6f52NkphEh/JtAAAAAElFTkSuQmCC", + "text/markdown": [ + "**Caveat**: Eliater does not yet have an automated explanation of what the results of this analysis mean.\n" + ], "text/plain": [ - "
" + "" ] }, "metadata": {}, @@ -1826,14 +6052,19 @@ } ], "source": [ - "differences = [\n", - " background_ate - unreduced_ate\n", - " for background_ate, unreduced_ate in zip(background_ates, unreduced_aces)\n", - "]\n", + "eliater.step_5_notebook_synthetic(\n", + " graph=graph,\n", + " reduced_graph=reduced_graph,\n", + " example=example,\n", + " treatment=treatment,\n", + " outcome=outcome,\n", + " seed=SEED,\n", + ")\n", "\n", - "sns.histplot(differences, label=\"Generated ACEs\")\n", - "plt.axvline(ATE_value - true_ate, linewidth=3, color=\"red\")\n", - "plt.show()" + "# Generate credible interval - use pyro or some other probprog lang\n", + "# if the credible interval doesn't cross 0, then you can give i.e. 90% confidence that the effect is positive\n", + "# sample 10000 times\n", + "# difference is frequentist vs bayesian test" ] } ], @@ -1853,7 +6084,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.6" + "version": "3.11.9" } }, "nbformat": 4, diff --git a/setup.cfg b/setup.cfg index 89b98ca..2f08a71 100644 --- a/setup.cfg +++ b/setup.cfg @@ -49,7 +49,7 @@ keywords = [options] install_requires = - y0>=0.2.7 + y0>=0.2.8 scipy numpy ananke-causal>=0.5.0 @@ -128,12 +128,16 @@ strictness = short ######################### [flake8] ignore = - S301 # pickle - S403 # pickle + # pickle + S301 + # pickle + S403 S404 S603 - W503 # Line break before binary operator (flake8 is wrong) - E203 # whitespace before ':' + # Line break before binary operator (flake8 is wrong) + W503 + # whitespace before ':' + E203 exclude = .tox, .git, diff --git a/src/eliater/__init__.py b/src/eliater/__init__.py index 1cace1c..63848c4 100644 --- a/src/eliater/__init__.py +++ b/src/eliater/__init__.py @@ -4,7 +4,19 @@ from .api import workflow from .discover_latent_nodes import remove_nuisance_variables -from .network_validation import add_ci_undirected_edges, plot_ci_size_dependence +from .network_validation import ( + add_ci_undirected_edges, + discretize_binary, + plot_ci_size_dependence, + plot_treatment_and_outcome, +) +from .notebook_utils import ( + step_1_notebook, + step_2_notebook, + step_3_notebook, + step_5_notebook_real, + step_5_notebook_synthetic, +) from .version import get_version __all__ = [ @@ -12,6 +24,13 @@ "remove_nuisance_variables", "add_ci_undirected_edges", "plot_ci_size_dependence", + "plot_treatment_and_outcome", + "discretize_binary", + "step_1_notebook", + "step_2_notebook", + "step_3_notebook", + "step_5_notebook_real", + "step_5_notebook_synthetic", ] diff --git a/src/eliater/discover_latent_nodes.py b/src/eliater/discover_latent_nodes.py index 5cad59f..ec21760 100644 --- a/src/eliater/discover_latent_nodes.py +++ b/src/eliater/discover_latent_nodes.py @@ -141,17 +141,16 @@ $Z_4$ is removed as its children are a subset of $Z_1$'s children. """ -import itertools -from typing import Iterable, Optional, Set, Union +import warnings +from typing import Set, Union -import networkx as nx - -from y0.algorithm.simplify_latent import simplify_latent_dag +from y0.algorithm.simplify_latent import evans_simplify from y0.dsl import Variable -from y0.graph import DEFAULT_TAG, NxMixedGraph +from y0.graph import NxMixedGraph, _ensure_set, get_nodes_in_directed_paths __all__ = [ "remove_nuisance_variables", + "find_nuisance_variables", ] @@ -159,90 +158,23 @@ def remove_nuisance_variables( graph: NxMixedGraph, treatments: Union[Variable, Set[Variable]], outcomes: Union[Variable, Set[Variable]], - tag: Optional[str] = None, ) -> NxMixedGraph: """Find all nuisance variables and remove them based on Evans' simplification rules. :param graph: an NxMixedGraph :param treatments: a list of treatments :param outcomes: a list of outcomes - :param tag: The tag for which variables are latent :return: the new graph after simplification """ - rv = NxMixedGraph( - directed=graph.directed.copy(), - undirected=graph.undirected.copy(), - ) - lv_dag = mark_nuisance_variables_as_latent( - graph=rv, treatments=treatments, outcomes=outcomes, tag=tag - ) - simplified_latent_dag = simplify_latent_dag(lv_dag, tag=tag) - return NxMixedGraph.from_latent_variable_dag(simplified_latent_dag.graph, tag=tag) - - -def mark_nuisance_variables_as_latent( - graph: NxMixedGraph, - treatments: Union[Variable, Set[Variable]], - outcomes: Union[Variable, Set[Variable]], - tag: Optional[str] = None, -) -> nx.DiGraph: - """Find all the nuisance variables and mark them as latent. - - Mark nuisance variables as latent by first identifying them, then creating a new graph where these - nodes are marked as latent. Nuisance variables are the descendants of nodes in all proper causal paths - that are not ancestors of the outcome variables nodes. A proper causal path is a directed path from - treatments to the outcome. Nuisance variables should not be included in the estimation of the causal - effect as they increase the variance. - - :param graph: an NxMixedGraph - :param treatments: a list of treatments - :param outcomes: a list of outcomes - :param tag: The tag for which variables are latent - :return: the modified graph after simplification, in place - """ - if tag is None: - tag = DEFAULT_TAG nuisance_variables = find_nuisance_variables(graph, treatments=treatments, outcomes=outcomes) - lv_dag = NxMixedGraph.to_latent_variable_dag(graph, tag=tag) - # Set nuisance variables as latent - for node, data in lv_dag.nodes(data=True): - if Variable(node) in nuisance_variables: - data[tag] = True - return lv_dag - - -def find_all_nodes_in_causal_paths( - graph: NxMixedGraph, - treatments: Union[Variable, Set[Variable]], - outcomes: Union[Variable, Set[Variable]], -) -> Set[Variable]: - """Find all the nodes in proper causal paths from treatments to outcomes. - - A proper causal path is a directed path from treatments to the outcome. - - :param graph: an NxMixedGraph - :param treatments: a list of treatments - :param outcomes: a list of outcomes - :return: the nodes on all causal paths from treatments to outcomes. - """ - if isinstance(treatments, Variable): - treatments = {treatments} - if isinstance(outcomes, Variable): - outcomes = {outcomes} - - return { - node - for treatment, outcome in itertools.product(treatments, outcomes) - for causal_path in nx.all_simple_paths(graph.directed, treatment, outcome) - for node in causal_path - } + return evans_simplify(graph, latents=nuisance_variables) def find_nuisance_variables( graph: NxMixedGraph, treatments: Union[Variable, Set[Variable]], outcomes: Union[Variable, Set[Variable]], -) -> Iterable[Variable]: +) -> Set[Variable]: """Find the nuisance variables in the graph. Nuisance variables are the descendants of nodes in all proper causal paths that are @@ -255,25 +187,26 @@ def find_nuisance_variables( :param outcomes: a list of outcomes :returns: The nuisance variables. """ - if isinstance(treatments, Variable): - treatments = {treatments} - if isinstance(outcomes, Variable): - outcomes = {outcomes} - - # Find the nodes on all causal paths - nodes_on_causal_paths = find_all_nodes_in_causal_paths( - graph=graph, treatments=treatments, outcomes=outcomes + treatments = _ensure_set(treatments) + outcomes = _ensure_set(outcomes) + intermediaries = get_nodes_in_directed_paths(graph, treatments, outcomes) + return ( + graph.descendants_inclusive(intermediaries) + - graph.ancestors_inclusive(outcomes) + - treatments + - outcomes ) - # Find the descendants of interest - descendants_of_nodes_on_causal_paths = graph.descendants_inclusive(nodes_on_causal_paths) - - # Find the ancestors of outcome variables - ancestors_of_outcomes = graph.ancestors_inclusive(outcomes) - descendants_not_ancestors = descendants_of_nodes_on_causal_paths.difference( - ancestors_of_outcomes +def find_all_nodes_in_causal_paths( + graph: NxMixedGraph, + treatments: Union[Variable, Set[Variable]], + outcomes: Union[Variable, Set[Variable]], +) -> Set[Variable]: + """Find all the nodes in proper causal paths from treatments to outcomes.""" + warnings.warn( + "This has been replaced with an efficient implementation in y0", + DeprecationWarning, + stacklevel=1, ) - - nuisance_variables = descendants_not_ancestors.difference(treatments.union(outcomes)) - return nuisance_variables + return get_nodes_in_directed_paths(graph, treatments, outcomes) diff --git a/src/eliater/examples/frontdoor_backdoor_discrete/example1.py b/src/eliater/examples/frontdoor_backdoor_discrete/example1.py index 8496aee..3324066 100644 --- a/src/eliater/examples/frontdoor_backdoor_discrete/example1.py +++ b/src/eliater/examples/frontdoor_backdoor_discrete/example1.py @@ -66,7 +66,7 @@ def generate( *, seed: int | None = None, ) -> pd.DataFrame: - """Generate discrete testing data for the multiple_mediators_with_multiple_confounders_nuisances_discrete case study. + """Generate discrete test data for the multiple_mediators_with_multiple_confounders_nuisances_discrete case study. :param num_samples: The number of samples to generate. Try 1000. :param treatments: An optional dictionary of the values to fix each variable to. diff --git a/src/eliater/examples/t_cell_signaling_pathway.py b/src/eliater/examples/t_cell_signaling_pathway.py index 24f506d..f7ebdce 100644 --- a/src/eliater/examples/t_cell_signaling_pathway.py +++ b/src/eliater/examples/t_cell_signaling_pathway.py @@ -13,7 +13,7 @@ # does not want to read the reference. Spoon feed the important information # 2. Is there associated data to go with this graph? Commit it into the examples folder - +from eliater.data import load_sachs_df from y0.algorithm.identify import Query from y0.examples import Example from y0.graph import NxMixedGraph @@ -40,6 +40,7 @@ reference="K. Sachs, O. Perez, D. Pe’er, D. A. Lauffenburger, and G. P. Nolan. Causal protein-signaling" "networks derived from multiparameter single-cell data. Science, 308(5721): 523–529, 2005.", graph=graph, + data=load_sachs_df(), description="This is an example of a protein signaling network of the T cell signaling pathway" "It models the molecular mechanisms and regulatory processes of human cells involved" "in T cell activation, proliferation, and function. The observational data consisted of quantitative" diff --git a/src/eliater/network_validation.py b/src/eliater/network_validation.py index ceaab2c..88195b3 100644 --- a/src/eliater/network_validation.py +++ b/src/eliater/network_validation.py @@ -158,6 +158,7 @@ """ import time +import warnings from typing import Optional import matplotlib.pyplot as plt @@ -165,15 +166,23 @@ import pandas as pd import seaborn as sns from numpy import mean, quantile +from sklearn.preprocessing import KBinsDiscretizer from tabulate import tabulate from tqdm.auto import trange -from y0.algorithm.conditional_independencies import get_conditional_independencies +import y0.algorithm.conditional_independencies from y0.algorithm.falsification import get_graph_falsifications from y0.graph import NxMixedGraph -from y0.struct import CITest, _ensure_method, get_conditional_independence_tests +from y0.struct import ( + DEFAULT_SIGNIFICANCE, + CITest, + _ensure_method, + get_conditional_independence_tests, +) __all__ = [ + "discretize_binary", + "plot_treatment_and_outcome", "add_ci_undirected_edges", "print_graph_falsifications", "p_value_of_bootstrap_data", @@ -182,7 +191,25 @@ ] TESTS = get_conditional_independence_tests() -DEFAULT_SIGNIFICANCE = 0.01 + + +def plot_treatment_and_outcome(data, treatment, outcome, figsize=(8, 2.5)) -> None: + """Plot the treatment and outcome histograms.""" + fig, (lax, rax) = plt.subplots(1, 2, figsize=figsize) + sns.histplot(data=data, x=treatment.name, ax=lax) + lax.axvline(data[treatment.name].mean(), color="red") + lax.set_title("Treatment") + + sns.histplot(data=data, x=outcome.name, ax=rax) + rax.axvline(data[outcome.name].mean(), color="red") + rax.set_ylabel("") + rax.set_title("Outcome") + + +def discretize_binary(data: pd.DataFrame) -> pd.DataFrame: + """Discretize continuous data into binary data using K-Bins Discretization.""" + kbins = KBinsDiscretizer(n_bins=2, encode="ordinal", strategy="uniform") + return pd.DataFrame(kbins.fit_transform(data), columns=data.columns) def add_ci_undirected_edges( @@ -204,18 +231,15 @@ def add_ci_undirected_edges( the tested variables. If none, defaults to 0.05. :returns: A copy of the input graph potentially with new undirected edges added """ - rv = NxMixedGraph( - directed=graph.directed.copy(), - undirected=graph.undirected.copy(), + warnings.warn( + "This method has been replaced by a refactored implementation in " + "y0.algorithm.conditional_independencies.add_ci_undirected_edges", + DeprecationWarning, + stacklevel=1, + ) + return y0.algorithm.conditional_independencies.add_ci_undirected_edges( + graph=graph, data=data, method=method, significance_level=significance_level ) - if significance_level is None: - significance_level = DEFAULT_SIGNIFICANCE - for judgement in get_conditional_independencies(rv): - if not judgement.test( - data, boolean=True, method=method, significance_level=significance_level - ): - rv.add_undirected_edge(judgement.left, judgement.right) - return rv def print_graph_falsifications( diff --git a/src/eliater/notebook_utils.py b/src/eliater/notebook_utils.py new file mode 100644 index 0000000..3622c6a --- /dev/null +++ b/src/eliater/notebook_utils.py @@ -0,0 +1,677 @@ +"""High-level Eliater workflow for use in Jupyter notebooks.""" + +import time +from operator import attrgetter +from textwrap import dedent +from typing import Optional + +import matplotlib.pyplot as plt +import numpy as np +import pandas as pd +import seaborn as sns +from scipy.stats import ttest_1samp +from tqdm.auto import tqdm, trange + +from eliater.discover_latent_nodes import find_nuisance_variables, remove_nuisance_variables +from eliater.network_validation import discretize_binary +from eliater.regression import estimate_query_by_linear_regression, get_adjustment_set +from y0.algorithm.estimation import estimate_ace +from y0.algorithm.falsification import get_graph_falsifications +from y0.algorithm.identify import identify_outcomes +from y0.dsl import Variable +from y0.examples import Example +from y0.graph import NxMixedGraph +from y0.struct import DEFAULT_SIGNIFICANCE, CITest, _ensure_method + + +def display_markdown(s: str) -> None: + """Display a markdown string in Jupyter notebook.""" + import IPython.display + + IPython.display.display(IPython.display.Markdown(dedent(s))) + + +def display_df(df: pd.DataFrame) -> None: + """Display a Pandas dataframe in Jupyter notebook.""" + import IPython.display + + html = df.reset_index(drop=True).to_html(index=False) + IPython.display.display(IPython.display.HTML(html)) + + +def step_1_notebook( + graph: NxMixedGraph, + data: pd.DataFrame, + *, + binarize: bool = False, + method: Optional[CITest] = None, + max_given: Optional[int] = 5, + significance_level: Optional[float] = None, + show_all: bool = False, + acceptable_percentage: float = 0.3, + show_progress: bool = False, +): + """Print the summary of conditional independency test results. + + Prints the summary to the console, which includes the total number of conditional independence tests, + the number and percentage of failed tests, and statistical information about each test such as p-values, + and test results. + + :param graph: an NxMixedGraph + :param data: observational data corresponding to the graph + :param binarize: Should the data be discretized into a two-class problem? + :param method: the conditional independency test to use. If None, defaults to ``pearson`` for continuous data + and ``chi-square`` for discrete data. + :param max_given: The maximum set size in the power set of the vertices minus the d-separable pairs + :param significance_level: The statistical tests employ this value for + comparison with the p-value of the test to determine the independence of + the tested variables. If none, defaults to 0.01. + :param show_all: If true, shows all p-values from falsification, if false, only shows significant ones + :param acceptable_percentage: The percentage of tests that need to fail to output an interpretation + that additional edges should be added. Should be between 0 and 1. + :param show_progress: If true, shows a progress bar for calculating d-separations + """ + display_markdown("## Step 1: Checking the ADMG Structure") + if significance_level is None: + significance_level = DEFAULT_SIGNIFICANCE + if binarize: + data = discretize_binary(data) + display_markdown( + "On this try, we're going to discretize the data using K-Bins discretization with K as 2." + " Here are the first few rows of the transformed dataframe after doing that:" + ) + display_df(data.head()) + + start_time = time.time() + method = _ensure_method(method, data) + evidence_df = get_graph_falsifications( + graph=graph, + df=data, + method=method, + significance_level=significance_level, + max_given=max_given, + verbose=show_progress, + sep=";", + ).evidence + end_time = time.time() - start_time + time_text = f"Finished in {end_time:.2f} seconds." + n_total = len(evidence_df) + n_failed = evidence_df["p_adj_significant"].sum() + percent_failed = n_failed / n_total + if n_failed == 0: + display_markdown( + f"All {n_total} d-separations implied by the ADMG's structure are consistent with the data, meaning " + f"that none of the data-driven conditional independency tests' null hypotheses with the {method} test " + f"were rejected at p<{significance_level}. {time_text}\n" + ) + elif percent_failed < acceptable_percentage: + display_markdown( # noqa:T201 + f"Of the {n_total} d-separations implied by the ADMG's structure, only {n_failed} " + f"({percent_failed:.2%}) rejected the null hypothesis for the {method} test at p<{significance_level}." + f"\n\nSince this is less than {acceptable_percentage:.0%}, Eliater considers this minor and leaves the " + f"ADMG unmodified. {time_text}\n" + ) + else: + display_markdown( + f"Of the {n_total} d-separations implied by the ADMG's structure, {n_failed} ({percent_failed:.2%}) " + f"rejected the null hypothesis with the {method} test at p<{significance_level}.\n\nSince this is more " + f"than {acceptable_percentage:.0%}, Eliater considers this a major inconsistency and therefore suggests " + f"adding appropriate bidirected edges using the eliater.add_ci_undirected_edges() function. {time_text}\n" + ) + if show_all: + dd = evidence_df + else: + dd = evidence_df[evidence_df["p_adj_significant"]] + + display_markdown(dd.reset_index(drop=True).to_markdown(index=False)) + + +def step_2_notebook(*, graph: NxMixedGraph, treatment: Variable, outcome: Variable): + """Check query identifiability.""" + tlatex = treatment.to_latex() + olatex = outcome.to_latex() + introduction = dedent( + f""" + ## Step 2: Check Query Identifiability + + The causal query of interest is the average treatment effect of ${tlatex}$ on ${olatex}$, defined as: + $\\mathbb{{E}}[{olatex} \\mid do({tlatex}=1)] - \\mathbb{{E}}[{olatex} \\mid do({tlatex}=0)]$. + """ + ) + + estimand = identify_outcomes(graph=graph, treatments=treatment, outcomes=outcome) + if estimand is None: + analysis = dedent( + """\ + The query was not identifiable, so we can not proceed to Step 3. + """ + ) + else: + analysis = dedent( + f"""\ + + Running the ID algorithm defined by [Identification of joint interventional distributions in recursive + semi-Markovian causal models](https://dl.acm.org/doi/10.5555/1597348.1597382) (Shpitser and Pearl, 2006) + and implemented in the $Y_0$ Causal Reasoning Engine gives the following estimand: + + ${estimand.to_latex()}$ + + Because the query is identifiable, we can proceed to Step 3. + """ + ) + + display_markdown(introduction + "\n" + analysis) + + +def step_3_notebook( + *, graph: NxMixedGraph, treatment: Variable, outcome: Variable +) -> Optional[NxMixedGraph]: + """Identify nuisance variables and simplify the ADMG.""" + display_markdown("## Step 3/4: Identify Nuisance Variables and Simplify the ADMG") + nv = find_nuisance_variables(graph, treatments=treatment, outcomes=outcome) + if not nv: + display_markdown( + """\ + No variables were identified as nuisance variables. + + Nevertheless, the algorithm proposed in [Graphs for margins of Bayesian + networks](https://arxiv.org/abs/1408.1809) (Evans, 2016) and implemented in + the $Y_0$ Causal Reasoning Engine is applied to the ADMG to attempt to + simplify the graph by reasoning over its bidirected edges (if they exist). + """ + ) + else: + nv_text = ", ".join(f"${x.to_latex()}$" for x in sorted(nv, key=attrgetter("name"))) + + display_markdown( + f"""\ + The following {len(nv)} variables were identified as _nuisance_ variables, + meaning that they appear as descendants of nodes appearing in paths between + the treatment and outcome, but are not themselves ancestors of the outcome variable: + + {nv_text} + + These variables are marked as "latent", then + the algorithm proposed in [Graphs for margins of Bayesian + networks](https://arxiv.org/abs/1408.1809) (Evans, 2016) and implemented in + the $Y_0$ Causal Reasoning Engine is applied to the ADMG to + simplify the graph. This minimally removes the latent variables and makes + further simplifications if the latent variables are connected by bidirected + edges to other nodes. + """ + ) + + new_graph = remove_nuisance_variables(graph, treatments=treatment, outcomes=outcome) + if new_graph == graph: + display_markdown("The simplification did not modify the graph.") + return None + new_graph.draw() + return new_graph + + +def step_5_notebook_real( + *, + graph: NxMixedGraph, + example: Example, + treatment: Variable, + outcome: Variable, + n_subsamples: int = 500, + subsample_size: int = 1_000, + eps: float = 1e-10, + threshold: float = 0.01, +): + """Calculate the average causal effect and give context on how to interpret it for real data.""" + subsamples = [ + example.data.sample(subsample_size) + for _ in trange(n_subsamples, desc="Subsampling", leave=False) + ] + adjustment_set, _ = get_adjustment_set(graph=graph, treatments=treatment, outcome=outcome) + + actual_ananke_ace = estimate_ace( + graph, treatments=treatment, outcomes=outcome, data=example.data + ) + actual_linreg_ace = estimate_query_by_linear_regression( + graph, + treatments=treatment, + outcome=outcome, + data=example.data, + query_type="ate", + _adjustment_set=adjustment_set, + ) + + ( + ananke_ace_reference, + ananke_ace_reference_var, + ananke_ace_significance_p_value, + linreg_ace_reference, + linreg_ace_reference_var, + linreg_ace_significance_p_value, + linreg_ev_reference, + linreg_ev_reference_var, + ) = _calc_helper( + graph=graph, + subsamples=subsamples, + treatment=treatment, + outcome=outcome, + adjustment_set=adjustment_set, + ) + _plot_helper( + ananke_ace_reference, + ananke_ace_reference_var, + ananke_ace_significance_p_value, + linreg_ace_reference, + linreg_ace_reference_var, + linreg_ace_significance_p_value, + reference=actual_ananke_ace, + reference_right=actual_linreg_ace, + ) + + plt.tight_layout() + plt.show() + + +def step_5_notebook_synthetic( + *, + graph: NxMixedGraph, + reduced_graph: Optional[NxMixedGraph], + example: Example, + treatment: Variable, + outcome: Variable, + seed: int = 42, + samples: int = 10_000, + n_subsamples: int = 500, + subsample_size: int = 1_000, + eps: float = 1e-10, + threshold: float = 0.01, +): + """Calculate the average causal effect and give context on how to interpret it for synthetic data.""" + tlatex = treatment.to_latex() + olatex = outcome.to_latex() + + data_obs = example.generate_data(samples, seed=seed) + data_1 = example.generate_data(samples, {treatment: 1.0}, seed=seed) + data_0 = example.generate_data(samples, {treatment: 0.0}, seed=seed) + + ates = [] + for _ in range(n_subsamples): + idx = np.random.permutation(samples)[:subsample_size] + data_1_mean = data_1.loc[idx][outcome.name].mean() + data_0_mean = data_0.loc[idx][outcome.name].mean() + diff = data_1_mean - data_0_mean + ates.append(diff) + + ate = np.mean(ates) + ate_var = np.var(ates) + + display_markdown( + f"""\ + ## Step 5: Estimate the Query + + ### Calculating the True Average Treatment Effect (ATE) + + We first generated synthetic observational data. Now, we generate two interventional datasets: + one where we set ${treatment.to_latex()}$ to $0.0$ and one where we set ${treatment.to_latex()}$ to $1.0$. + We can then calculate the "true" average treatment effect (ATE) as the difference of the means + for the outcome variable ${outcome.to_latex()}$ in each. The ATE is formulated as: + + $ATE = \\mathbb{{E}}[{olatex} \\mid do({tlatex} = 1)] - \\mathbb{{E}}[{olatex} \\mid do({tlatex} = 0)]$ + + After generating {samples:,} samples for each distribution, we took {n_subsamples:,} subsamples of size + of size {subsample_size:,} and calculated the + ATE for each. The variance comes to {ate_var:.1e}, which shows that the ATE is very stable with respect + to random generation. We therefore calculate the _true_ ATE as the average value from these samplings, + which comes to {ate:.1e}. + + The ATE can be interpreted in the following way: + + 1. If the ATE is positive, it suggests that the treatment ${tlatex}$ has a negative effect on the outcome ${olatex}$ + 2. If the ATE is negative, it suggests that the treatment ${tlatex}$ has a positive effect on the outcome ${olatex}$ + + ### Estimating the Average Treatment Effect (ATE) + + In practice, we are often unable to get the appropriate interventional data, and therefore want to estimate + the average treatment effect (ATE) from observational data. Because we're using synthetic data, we generate + {samples:,} samples, then took {n_subsamples:,} subsamples of size {subsample_size:,} through which we calculated + the following: + + 1. The ATE, using the y0/ananke implementation + 2. The ATE, using the Eliater linear regression implementation + """ + ) + + subsamples = [ + data_obs.sample(subsample_size) + for _ in trange(n_subsamples, leave=False, desc="Subsampling", unit="sample") + ] + + reference_adjustment_set, _ = get_adjustment_set( + graph=graph, treatments=treatment, outcome=outcome + ) + ( + ananke_ace_reference, + ananke_ace_reference_var, + ananke_ace_significance_p_value, + linreg_ace_reference, + linreg_ace_reference_var, + linreg_ace_significance_p_value, + linreg_ev_reference, + ev_reference_var, + ) = _calc_helper( + graph=graph, + subsamples=subsamples, + treatment=treatment, + outcome=outcome, + adjustment_set=reference_adjustment_set, + ) + _, ananke_ace_correctness_p_value = ttest_1samp( + ananke_ace_reference, ate, alternative="two-sided" + ) + _, linreg_ace_correctness_p_value = ttest_1samp( + linreg_ace_reference, ate, alternative="two-sided" + ) + + if reduced_graph is not None: + reduced_adjustment_set, _ = get_adjustment_set( + graph=reduced_graph, treatments=treatment, outcome=outcome + ) + ( + ananke_ace_reduced, + ananke_ace_reduced_var, + _ananke_ace_significance_p_value, + linreg_ace_reduced, + linreg_ace_reduced_var, + _linreg_ace_significance_p_value, + linreg_ev_reduced, + linreg_ev_reduced_var, + ) = _calc_helper( + graph=reduced_graph, + subsamples=subsamples, + treatment=treatment, + outcome=outcome, + adjustment_set=reduced_adjustment_set, + ) + + ananke_ace_diffs = [a - b for a, b in zip(ananke_ace_reference, ananke_ace_reduced)] + linreg_ace_diffs = [a - b for a, b in zip(linreg_ace_reference, linreg_ace_reduced)] + ev_diffs = [a - b for a, b in zip(linreg_ev_reference, linreg_ev_reduced)] + + fig, axes = plt.subplots(2, 3, figsize=(14, 6.5)) + + sns.histplot(ananke_ace_reference, ax=axes[0][0]) + axes[0][0].set_title( + f"ATEs on Original ADMG\nVariance: {ananke_ace_reference_var:.1e}, " + f"$p={ananke_ace_significance_p_value:.2e}$" + ) + axes[0][0].set_xlabel("ATE from y0.algorithm.estimation.estimate_ace") + axes[0][0].axvline(ate, color="red") + sns.histplot(ananke_ace_reduced, ax=axes[0][1]) + axes[0][1].set_title(f"ATEs on Reduced ADMG\nVariance: {ananke_ace_reduced_var:.1e}") + axes[0][1].set_xlabel("ATE from y0.algorithm.estimation.estimate_ace") + axes[0][1].set_ylabel("") + axes[0][1].axvline(ate, color="red") + sns.histplot(ananke_ace_diffs, ax=axes[0][2]) + axes[0][2].set_xlabel("Reduced ADMG - Original ADMG") + axes[0][2].set_ylabel("") + axes[0][2].set_title(_diff_subtitle(ananke_ace_diffs, eps)) + + sns.histplot(linreg_ace_reference, ax=axes[1][0]) + axes[1][0].set_title( + f"ATEs on Original ADMG\nVariance: {linreg_ace_reference_var:.1e}, " + f"$p={linreg_ace_significance_p_value:.2e}$" + ) + axes[1][0].set_xlabel("ATE from eliater.estimate_query") + axes[1][0].axvline(ate, color="red") + sns.histplot(linreg_ace_reduced, ax=axes[1][1]) + axes[1][1].set_title(f"ATEs on Reduced ADMG\nVariance: {linreg_ace_reduced_var:.1e}") + axes[1][1].set_xlabel("ATE from eliater.estimate_query") + axes[1][1].set_ylabel("") + axes[1][1].axvline(ate, color="red") + sns.histplot(linreg_ace_diffs, ax=axes[1][2]) + axes[1][2].set_xlabel("Reduced ADMG - Original ADMG") + axes[1][2].set_ylabel("") + axes[1][2].set_title(_diff_subtitle(linreg_ace_diffs, eps)) + + else: + _plot_helper( + ananke_ace_reference, + ananke_ace_reference_var, + ananke_ace_significance_p_value, + linreg_ace_reference, + linreg_ace_reference_var, + linreg_ace_significance_p_value, + reference=ate, + ) + + plt.tight_layout() + plt.show() + + display_markdown( + f"""\ + Notes on this plot: + + 1. We show the _true_ ATE as a red vertical line + 2. We show both this process done with the original ADMG and the reduced ADMG. This shows that the reduction + on the ADMG does not affect estimation. However, reduction is still valuable for simplifying visual exploration. + + #### Interpreting $Y_0$/Ananke Estimation of ACE + + {_interpret_nonzero_test( + p_value=ananke_ace_significance_p_value, + threshold=threshold, + treatment=treatment, + outcome=outcome, + distribution=ananke_ace_reference, + label="ananke/y0 estimation of the ACE", + )} + + {_interpret_same_ate_test( + p_value=ananke_ace_correctness_p_value, + threshold=threshold, + reference=ate, + label="ananke/y0 estimation of the ACE", + )} + + #### Interpreting Linear Regression Estimation of ACE + + {_interpret_nonzero_test( + p_value=linreg_ace_significance_p_value, + threshold=threshold, + treatment=treatment, + outcome=outcome, + distribution=linreg_ace_reference, + label="Eliater linear regression estimation of the ACE", + )} + + {_interpret_same_ate_test( + p_value=linreg_ace_correctness_p_value, + threshold=threshold, + reference=ate, + label="Eliater linear regression estimation of the ACE", + )} + """ + ) + + display_markdown( + f"""\ + ### Estimating the Expected Value + + We now estimate the query in the form of the expected value: + + $\\mathbb{{E}}[{olatex} \\mid do({tlatex} = 0)]$ + """ + ) + + if reduced_graph is not None: + fig, axes = plt.subplots(1, 3, figsize=(14, 3)) + + sns.histplot(linreg_ev_reference, ax=axes[0]) + axes[0].set_title( + f"$E[{olatex} \\mid do({tlatex} = 0)]$ on Original ADMG\nVariance: {ev_reference_var:.1e}" + ) + axes[0].set_xlabel(f"$E[{olatex} \\mid do({tlatex} = 0)]$ from eliater.estimate_query") + sns.histplot(linreg_ev_reduced, ax=axes[1]) + axes[1].set_title( + f"$E[{olatex} \\mid do({tlatex} = 0)]$ on Reduced ADMG\nVariance: {linreg_ev_reduced_var:.1e}" + ) + axes[1].set_xlabel(f"$E[{olatex} \\mid do({tlatex} = 0)]$ from eliater.estimate_query") + axes[1].set_ylabel("") + sns.histplot(ev_diffs, ax=axes[2]) + axes[2].set_xlabel("Reduced ADMG - Original ADMG") + axes[2].set_ylabel("") + axes[2].set_title(_diff_subtitle(ev_diffs, eps)) + plt.tight_layout() + else: + fig, axis = plt.subplots(1, 1, figsize=(5, 3)) + + sns.histplot(linreg_ev_reference, ax=axis) + axis.set_title( + f"$E[{olatex} \\mid do({tlatex} = 0)]$ on Original ADMG\nVariance: {ev_reference_var:.1e}" + ) + axis.set_xlabel(f"$E[{olatex} \\mid do({tlatex} = 0)]$ from eliater.estimate_query") + # plt.tight_layout() + + plt.show() + + display_markdown( + """\ + **Caveat**: Eliater does not yet have an automated explanation of what the results of this analysis mean. + """ + ) + + +def _interpret_nonzero_test(p_value, threshold, treatment, outcome, distribution, label): + if p_value < threshold: + # note that the interpretation is opposite of the sign + direction = "negative" if np.mean(distribution) > 0 else "positive" + return dedent( + f"""\ + The p-value for testing if {label} is non-zero is {p_value:.2e}, which is below + the the significance threshold of {threshold}. Therefore, we reject the + null hypothesis of the 1 Sample T-test and conclude that the distribution is significantly + different from zero. This means that the treatment ${treatment.to_latex()}$ has + *a {direction} effect* on the outcome ${outcome.to_latex()}$. + """ + ).replace("\n", " ") + else: + return dedent( + f"""\ + The p-value for testing if {label} is non-zero is is {p_value:.2e}, \ + which is not below the significance threshold of {threshold}. Therefore, we do not reject the \ + null hypothesis of the 1 Sample T-test and conclude that the distribution is not significantly \ + different from zero. This means that the treatment ${treatment.to_latex()}$ has *no significant effect* \ + on the outcome ${outcome.to_latex()}$. + """ + ).replace("\n", " ") + + +def _plot_helper( + ananke_ace_reference, + ananke_ace_reference_var, + ananke_ace_significance_p_value, + linreg_ace_reference, + linreg_ace_reference_var, + linreg_ace_significance_p_value, + *, + reference, + reference_right=None, +): + if reference_right is None: + reference_right = reference + fig, axes = plt.subplots(1, 2, figsize=(8, 3)) + + sns.histplot(ananke_ace_reference, ax=axes[0]) + axes[0].set_title( + f"ATEs on Original ADMG\nVariance: {ananke_ace_reference_var:.1e}, $p={ananke_ace_significance_p_value:.2e}$" + ) + axes[0].set_xlabel("ATE from y0.algorithm.estimation.estimate_ace") + axes[0].axvline(reference, color="red") + sns.histplot(ananke_ace_reference, ax=axes[0]) + + sns.histplot(linreg_ace_reference, ax=axes[1]) + axes[1].set_title( + f"ATEs on Original ADMG\nVariance: {linreg_ace_reference_var:.1e}, $p={linreg_ace_significance_p_value:.2e}$" + ) + axes[1].set_xlabel("ATE from eliater.estimate_query") + axes[1].axvline(reference_right, color="red") + sns.histplot(linreg_ace_reference, ax=axes[1]) + + +def _calc_helper(*, graph, subsamples, treatment, outcome, adjustment_set): + ananke_ace_reference = [] + linreg_ace_reference = [] + linreg_ev_reference = [] + for subsample in tqdm(subsamples, desc="Estimating", leave=False): + ananke_ace_reference.append( + estimate_ace(graph, treatments=treatment, outcomes=outcome, data=subsample) + ) + linreg_ace_reference.append( + estimate_query_by_linear_regression( + graph, + treatments=treatment, + outcome=outcome, + data=subsample, + query_type="ate", + _adjustment_set=adjustment_set, + ) + ) + linreg_ev_reference.append( + estimate_query_by_linear_regression( + graph, + data=subsample, + treatments=treatment, + outcome=outcome, + interventions={treatment: 0}, + query_type="expected_value", + _adjustment_set=adjustment_set, + ) + ) + + # Check that the p-values are significantly different from zero to say + # if the ATE is significant (then after you can use the sign) + _, ananke_ace_significance_p_value = ttest_1samp( + ananke_ace_reference, 0, alternative="two-sided" + ) + _, linreg_ace_significance_p_value = ttest_1samp( + linreg_ace_reference, 0, alternative="two-sided" + ) + + return ( + ananke_ace_reference, + np.var(ananke_ace_reference), + ananke_ace_significance_p_value, + linreg_ace_reference, + np.var(linreg_ace_reference), + linreg_ace_significance_p_value, + linreg_ev_reference, + np.var(linreg_ev_reference), + ) + + +def _interpret_same_ate_test(p_value, threshold, label, reference): + if p_value < threshold: + return dedent( + f"""\ + The p-value for testing if {label} is different from the reference ATE + is {p_value:.2e}, which is below the the significance threshold of {threshold}. + Therefore, we reject the null hypothesis of the 1-Sample T-test and conclude that + the distribution is significantly different from the ground truth calculated + by synthetic generation of interventional data (ATE={reference:.2e}). + """ + ).replace("\n", " ") + else: + return dedent( + f"""\ + The p-value for testing if {label} is different from the reference ATE + is {p_value:.2e}, which is not below the the significance threshold of {threshold}. + Therefore, we do not reject the null hypothesis of the 1-Sample T-test and conclude that + the distribution is not significantly different from the ground truth calculated + by synthetic generation of interventional data (ATE={reference:.2e}). + """ + ).replace("\n", " ") + + +def _diff_subtitle(diffs, eps): + if all(diff < eps for diff in diffs): + return f"Pairwise Differences\nAll $< {eps:.1e}$ (i.e., artifacts of floating pt. math)" + else: + return "Pairwise Differences\nSome are significant" diff --git a/src/eliater/regression.py b/src/eliater/regression.py index ea69769..f4d3224 100644 --- a/src/eliater/regression.py +++ b/src/eliater/regression.py @@ -227,6 +227,7 @@ """ import statistics +import warnings from operator import attrgetter from typing import Dict, Literal, NamedTuple, Tuple @@ -242,6 +243,7 @@ __all__ = [ # High-level functions "estimate_query_by_linear_regression", + "estimate_query", # deprecated "estimate_ate", "estimate_probabilities", "summary_statistics", @@ -329,6 +331,7 @@ def fit_regression( data: pd.DataFrame, treatments: Variable | set[Variable], outcome: Variable, + _adjustment_set=None, ) -> RegressionResult: """Fit a regression model to the adjustment set over the treatments and a given outcome. @@ -346,7 +349,10 @@ def fit_regression( treatments = _ensure_set(treatments) if len(treatments) > 1: raise MultipleTreatmentsNotImplementedError - adjustment_set, _ = get_adjustment_set(graph=graph, treatments=treatments, outcome=outcome) + if _adjustment_set: + adjustment_set = _adjustment_set + else: + adjustment_set, _ = get_adjustment_set(graph=graph, treatments=treatments, outcome=outcome) variable_set = adjustment_set.union(treatments).difference({outcome}) variables = sorted(variable_set, key=attrgetter("name")) model = LinearRegression() @@ -362,6 +368,7 @@ def estimate_query_by_linear_regression( *, query_type: Literal["ate", "expected_value", "probability"] = "ate", interventions: Dict[Variable, float] | None = None, + _adjustment_set=None, ) -> float | list[float]: """Estimate treatment effects using Linear Regression. @@ -385,6 +392,7 @@ def estimate_query_by_linear_regression( data=data, treatments=treatments, outcome=outcome, + _adjustment_set=_adjustment_set, ) elif query_type in {"expected_value", "probability"}: @@ -405,11 +413,18 @@ def estimate_query_by_linear_regression( raise TypeError(f"Unknown query type {query_type}") +def estimate_query(*args, **kwargs): + """Fit a regression model to the adjustment set over the treatments and a given outcome.""" + warnings.warn("This function was renamed", DeprecationWarning, stacklevel=1) + return estimate_query_by_linear_regression(*args, **kwargs) + + def estimate_ate( graph: NxMixedGraph, data: pd.DataFrame, treatments: Variable | set[Variable], outcome: Variable, + _adjustment_set=None, ) -> float: """Estimate the average treatment effect (ATE) using Linear Regression. @@ -426,7 +441,9 @@ def estimate_ate( treatments = _ensure_set(treatments) if len(treatments) > 1: raise MultipleTreatmentsNotImplementedError - coefficients, _intercept = fit_regression(graph, data, treatments=treatments, outcome=outcome) + coefficients, _intercept = fit_regression( + graph, data, treatments=treatments, outcome=outcome, _adjustment_set=_adjustment_set + ) return coefficients[list(treatments)[0]] diff --git a/tox.ini b/tox.ini index 2d61758..8d5b54a 100644 --- a/tox.ini +++ b/tox.ini @@ -88,7 +88,7 @@ description = Check that the MANIFEST.in is written properly and give feedback o skip_install = true deps = darglint - flake8<5.0.0 + flake8 flake8-black flake8-bandit flake8-bugbear @@ -111,7 +111,9 @@ commands = pyroma --min=10 . description = Run the pyroma tool to check the package friendliness of the project. [testenv:mypy] -deps = mypy +deps = + mypy + types-tabulate skip_install = true commands = mypy --install-types --non-interactive --ignore-missing-imports src/ description = Run the mypy tool to check static typing on the project.