diff --git a/notebooks/Case_study1_The_Sars_cov2_model.ipynb b/notebooks/Case_study1_The_Sars_cov2_model.ipynb index 42c2a55..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": "d48c50a4-691c-4383-810d-1a69de1a0eed", + "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.3-dev-b0c3d41b\n", + " 0.0.3-dev-28d9867e\n", " \n", " \n", " 1\n", " y0\n", - " 0.2.9-dev-06df659d\n", + " 0.2.10-dev-8f27d998\n", " \n", " \n", " 2\n", " Run at\n", - " 2024-01-28 19:36:52\n", + " 2024-04-25 09:05:50\n", " \n", " \n", "\n", @@ -71,9 +71,9 @@ ], "text/plain": [ " key value\n", - "0 eliater 0.0.3-dev-b0c3d41b\n", - "1 y0 0.2.9-dev-06df659d\n", - "2 Run at 2024-01-28 19:36:52" + "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,12 +82,14 @@ } ], "source": [ - "from IPython.display import Image\n", + "from IPython.display import Image, set_matplotlib_formats\n", "\n", "import eliater\n", "from eliater.examples.sars_cov2 import sars_large_example as example\n", "from y0.dsl import Variable\n", "\n", + "set_matplotlib_formats(\"svg\")\n", + "\n", "eliater.version_df()" ] }, @@ -398,7 +400,1271 @@ "outputs": [ { "data": { - "image/png": "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35I9u9QiVczaxRN27k2qvJ88M13zwdArpzqXtzg4OMDd3V2D0dQNVUpuly1bhpEjR8La2rpcnY2NDUaNGoWlS5cyuSUiqmP8/f1x4MAB6b2x8f+m/xc96pyI6p7CvAcADDBkyBC1+zA3t0BKSrLeJbhVSm5///13LFq0qNL6rl27YsmSJdUOioiINMvY2LjCJRJf5lHnRFT3FBc8AiDQ4sPJaODlW+X95ZnpOLVuNnJycl7t5DY7O7vCJcCkzoyN8ccff1Q7KCIi0qzr16/D1dUVZmZmCA4ORmxsLNzd3V/4qPPKkluFQgGFQiG952PMibSjnqO7WpfF6LMqrXPbsGFDXL58udL6ixcvwsXFpdpBERGR5gQFBSEuLg579uzBqlWrkJaWhvbt2+PRo0cv9ajzisTGxsLGxkbaylbOISLStioltz169EBMTAyePHlSrq6wsBAzZ85Er169NBYcERFVX/fu3TFo0CA0b94c3bp1w+7du5Gbm4stW7ao3ScfY05EdVWVLkuYPn06tm3bhsaNGyM6OhpNmjw9DZ6SkoKVK1eitLQUX3zxRY0ESkREmmFra4vGjRvjxo0beOedd174qPOK8DHmRFRXVenMrZOTE06cOIGAgABMnToV/fv3R//+/TFt2jQEBATg2LFjXDqGiKiOe/z4MW7evAkXFxe0bNnyhY86JyLSJVV+iEPZQxP+/PNP3LhxA0II+Pj4oH79+jURHxERVdPf/vY39O7dGx4eHrh37x5mzpwJIyMjfPDBB7CxsXnho86JiHSJWk8oA4D69evjrbfe0mQsRERUA/773//igw8+wIMHD9CgQQO0a9cOJ0+eRIMGDQC8+FHnRES6RO3kloiIdMPmzZufW/8yjzonItIVVbrmloiIiIioLmNyS0RERER6g8ktEREREekNJrdEREREpDeY3BIRERGR3mByS0RERER6g8ktEREREekNJrdEREREpDeY3BIRERGR3mByS0RERER6g8ktEREREekNJrdEREREpDeY3BIRERGR3mByS0RERER6g8ktEREREekNJrdEREREpDeMtR0AERGRtmRkZCAnJ0etfZOTkzUcDRFpApNbIiJ6JWVkZMDX1w+FhQXV6qdYUaShiIhIE5jcEhHRKyknJweFhQUIGjET1i6eVd4/81IiLu9Yg5KSEs0HR0RqY3JLRESvNGsX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j48PzM3NK72Rq1mzZggMDMTatWsRHx+PESNGqNSbmpqitLRUpczPzw/Hjx9XKTt+/DgaN24snbUFgFatWuE///kPFixYgCVLlmhoRKRveOaWXkkKhQJZWVkqZcbGxnBwcMA///lPvP/+++jZsyfGjBkDHx8fPH78GHv27AEAlYm2qgwMDDBmzBjMmjULo0aNgoWFRbXGQURU28zMzDB58mRMmjQJpqamaNu2Lf744w9cuXIFERERAJ6evY2OjoalpSX69++vsr+npyeOHj2K0NBQyGQyODg44PPPP8dbb72FuXPn4v3330diYiK++eabCk8EtGnTBrt370b37t1hbGyMcePG1cawSZcIoldMeHi4AFBua9KkidTmzJkzYuDAgcLR0VEYGxsLe3t70a1bN7F582ahVCqFEEKkpaUJAOL8+fMVHqey+vz8fFG/fn2xaNGimhoiEVGNKi0tFfPmzRMeHh7CxMREuLu7iwULFkj1jx49EhYWFmL06NHl9k1MTBTNmzcXMplM/DUN+emnn0TTpk2l/r788kuV/Tw8PMTXX38tvT9y5IiwtLQUy5cv1/wASacZCPH/H7dEREREpAHp6elo1KgRzpw5gzfffFPb4dArhsktERERaURxcTEePHiAv/3tb0hLSyt3HS1RbeANZURERKQRx48fh4uLC86cOYPVq1drOxx6RfHMLRERERHpDZ65JSIiIiK9weSWiIiIiPQGk1siIiIi0htMbomIiIhIbzC5JSIiIiK9weSWiIiIiPQGk1siIiIi0htMbomIiIhIbzC5JSIiIiK98f8Am+WcsW5dSzQAAAAASUVORK5CYII=", + "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": [ "
" ] @@ -608,9 +1874,9 @@ { "data": { "text/markdown": [ - "Of the 99 d-separations implied by the network's structure, only 11 (11.11%) rejected the null hypothesis for the cressie_read test at p<0.01.\n", + "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 network unmodified. Finished in 7.88 seconds.\n" + "Since this is less than 30%, Eliater considers this minor and leaves the ADMG unmodified. Finished in 7.62 seconds.\n" ], "text/plain": [ "" @@ -622,19 +1888,17 @@ { "data": { "text/markdown": [ - "| left | right | given | stats | p | dof | p_adj | p_adj_significant |\n", - "|:---------|:----------|:-----------|---------:|------------:|------:|------------:|:--------------------|\n", - "| Ang | PRR | SARS_COV2 | 126.901 | 0 | 1 | 0 | True |\n", - "| AGTR1 | PRR | SARS_COV2 | 108.975 | 0 | 1 | 0 | True |\n", - "| ADAM17 | PRR | SARS_COV2 | 76.1544 | 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", - "| Ang | NFKB | ADAM17;PRR | 34.944 | 3.39319e-09 | 1 | 3.15567e-07 | True |\n", - "| NFKB | SARS_COV2 | ADAM17;PRR | 29.5691 | 5.39582e-08 | 1 | 4.96415e-06 | True |\n", - "| ACE2 | NFKB | ADAM17;PRR | 27.0682 | 1.96399e-07 | 1 | 1.78723e-05 | True |\n", - "| IL6STAT3 | Toci | Sil6r | 30.6843 | 2.1726e-07 | 2 | 1.95534e-05 | True |\n", - "| Toci | cytok | IL6AMP | 18.1308 | 2.0624e-05 | 1 | 0.00183554 | True |" + "| 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": [ "" @@ -673,7 +1937,7 @@ "\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", + "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", @@ -700,50 +1964,6 @@ { "cell_type": "code", "execution_count": 9, - "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 - } - }, - "outputs": [ - { - "ename": "NameError", - "evalue": "name 'identify_outcomes' is not defined", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[9], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[43midentify_outcomes\u001b[49m(graph\u001b[38;5;241m=\u001b[39mgraph, treatments\u001b[38;5;241m=\u001b[39mtreatment, outcomes\u001b[38;5;241m=\u001b[39moutcome)\n", - "\u001b[0;31mNameError\u001b[0m: name 'identify_outcomes' is not defined" - ] - } - ], - "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": "code", - "execution_count": 10, "id": "4dff38fbf23ce61c", "metadata": { "ExecuteTime": { @@ -796,10 +2016,21 @@ }, "metadata": {}, "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "False" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" } ], "source": [ - "reduced_graph = eliater.step_3_notebook(graph=graph, treatment=treatment, outcome=outcome)" + "reduced_graph = eliater.step_3_notebook(graph=graph, treatment=treatment, outcome=outcome)\n", + "reduced_graph is not None" ] }, { @@ -820,7 +2051,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": null, "id": "14bdcdd244526750", "metadata": { "ExecuteTime": { @@ -849,7 +2080,7 @@ "\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 2.0e-05, which shows that the ATE is very stable with respect\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", @@ -858,9 +2089,6 @@ "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", - "**Caveat**: Eliater does not yet implement a notion of confidence for the ATE. For example, it's not clear\n", - "where the cutoff for _significance_ is, and whether that is dataset- or ADMG-dependent.\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", @@ -881,35 +2109,30 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "59d295a7e5ce47adb4d1f221874e2972", + "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ - "Analyzing w/ subsampling: 0%| | 0/500 [00:00 1\u001b[0m \u001b[43meliater\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mstep_5_notebook_synthetic\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 2\u001b[0m \u001b[43m \u001b[49m\u001b[43mgraph\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mgraph\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mreduced_graph\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mreduced_graph\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mexample\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mexample\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mtreatment\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mtreatment\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43moutcome\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43moutcome\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mseed\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mSEED\u001b[49m\n\u001b[1;32m 3\u001b[0m \u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/dev/eliater/src/eliater/notebook_utils.py:321\u001b[0m, in \u001b[0;36mstep_5_notebook_synthetic\u001b[0;34m(graph, reduced_graph, example, treatment, outcome, seed, samples, n_subsamples, subsample_size, eps)\u001b[0m\n\u001b[1;32m 308\u001b[0m ev_reference\u001b[38;5;241m.\u001b[39mappend(\n\u001b[1;32m 309\u001b[0m estimate_query_by_linear_regression(\n\u001b[1;32m 310\u001b[0m graph,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 317\u001b[0m )\n\u001b[1;32m 318\u001b[0m )\n\u001b[1;32m 319\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m reduced_graph \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 320\u001b[0m ananke_ace_reduced\u001b[38;5;241m.\u001b[39mappend(\n\u001b[0;32m--> 321\u001b[0m estimate_ace(\n\u001b[1;32m 322\u001b[0m reduced_graph, treatments\u001b[38;5;241m=\u001b[39mtreatment, outcomes\u001b[38;5;241m=\u001b[39moutcome, data\u001b[38;5;241m=\u001b[39mdata_obs_sample\n\u001b[1;32m 323\u001b[0m )\n\u001b[1;32m 324\u001b[0m )\n\u001b[1;32m 325\u001b[0m linreg_ace_reduced\u001b[38;5;241m.\u001b[39mappend(\n\u001b[1;32m 326\u001b[0m estimate_query_by_linear_regression(\n\u001b[1;32m 327\u001b[0m reduced_graph,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 333\u001b[0m )\n\u001b[1;32m 334\u001b[0m )\n\u001b[1;32m 335\u001b[0m ev_reduced\u001b[38;5;241m.\u001b[39mappend(\n\u001b[1;32m 336\u001b[0m estimate_query_by_linear_regression(\n\u001b[1;32m 337\u001b[0m reduced_graph,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 344\u001b[0m )\n\u001b[1;32m 345\u001b[0m )\n", - "File \u001b[0;32m~/dev/eliater/src/eliater/regression.py:401\u001b[0m, in \u001b[0;36mestimate_query_by_linear_regression\u001b[0;34m(graph, data, treatments, outcome, query_type, interventions, _adjustment_set)\u001b[0m\n\u001b[1;32m 399\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m interventions \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 400\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124minterventions must be given for query type: \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mquery_type\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m--> 401\u001b[0m y \u001b[38;5;241m=\u001b[39m \u001b[43mestimate_probabilities\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 402\u001b[0m \u001b[43m \u001b[49m\u001b[43mgraph\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mgraph\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 403\u001b[0m \u001b[43m \u001b[49m\u001b[43mdata\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mdata\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 404\u001b[0m \u001b[43m \u001b[49m\u001b[43mtreatments\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mtreatments\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 405\u001b[0m \u001b[43m \u001b[49m\u001b[43moutcome\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43moutcome\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 406\u001b[0m \u001b[43m \u001b[49m\u001b[43minterventions\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43minterventions\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 407\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 408\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m query_type \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mprobability\u001b[39m\u001b[38;5;124m\"\u001b[39m:\n\u001b[1;32m 409\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m y\n", - "File \u001b[0;32m~/dev/eliater/src/eliater/regression.py:474\u001b[0m, in \u001b[0;36mestimate_probabilities\u001b[0;34m(graph, data, treatments, outcome, interventions)\u001b[0m\n\u001b[1;32m 472\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m missing:\n\u001b[1;32m 473\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mMissing treatments: \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mmissing\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m--> 474\u001b[0m coefficients, intercept \u001b[38;5;241m=\u001b[39m \u001b[43mfit_regression\u001b[49m\u001b[43m(\u001b[49m\u001b[43mgraph\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdata\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mtreatments\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mtreatments\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43moutcome\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43moutcome\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 475\u001b[0m y \u001b[38;5;241m=\u001b[39m [\n\u001b[1;32m 476\u001b[0m intercept\n\u001b[1;32m 477\u001b[0m \u001b[38;5;241m+\u001b[39m \u001b[38;5;28msum\u001b[39m(\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 482\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m row \u001b[38;5;129;01min\u001b[39;00m data\u001b[38;5;241m.\u001b[39mto_dict(orient\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mrecords\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m 483\u001b[0m ]\n\u001b[1;32m 484\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m y\n", - "File \u001b[0;32m~/dev/eliater/src/eliater/regression.py:355\u001b[0m, in \u001b[0;36mfit_regression\u001b[0;34m(graph, data, treatments, outcome, _adjustment_set)\u001b[0m\n\u001b[1;32m 353\u001b[0m adjustment_set \u001b[38;5;241m=\u001b[39m _adjustment_set\n\u001b[1;32m 354\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m--> 355\u001b[0m adjustment_set, _ \u001b[38;5;241m=\u001b[39m \u001b[43mget_adjustment_set\u001b[49m\u001b[43m(\u001b[49m\u001b[43mgraph\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mgraph\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mtreatments\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mtreatments\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43moutcome\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43moutcome\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 356\u001b[0m variable_set \u001b[38;5;241m=\u001b[39m adjustment_set\u001b[38;5;241m.\u001b[39munion(treatments)\u001b[38;5;241m.\u001b[39mdifference({outcome})\n\u001b[1;32m 357\u001b[0m variables \u001b[38;5;241m=\u001b[39m \u001b[38;5;28msorted\u001b[39m(variable_set, key\u001b[38;5;241m=\u001b[39mattrgetter(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mname\u001b[39m\u001b[38;5;124m\"\u001b[39m))\n", - "File \u001b[0;32m~/dev/eliater/src/eliater/regression.py:301\u001b[0m, in \u001b[0;36mget_adjustment_set\u001b[0;34m(graph, treatments, outcome)\u001b[0m\n\u001b[1;32m 298\u001b[0m observable_nodes \u001b[38;5;241m=\u001b[39m graph\u001b[38;5;241m.\u001b[39mto_admg()\u001b[38;5;241m.\u001b[39mvertices\n\u001b[1;32m 300\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 301\u001b[0m adjustment_set \u001b[38;5;241m=\u001b[39m \u001b[43mcausal_graph\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43moptimal_adj_set\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 302\u001b[0m \u001b[43m \u001b[49m\u001b[43mtreatment\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mtreatments\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;241;43m0\u001b[39;49m\u001b[43m]\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mname\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43moutcome\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43moutcome\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mname\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mL\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m[\u001b[49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mN\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mobservable_nodes\u001b[49m\n\u001b[1;32m 303\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 304\u001b[0m adjustment_set_type \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mOptimal Adjustment Set\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 305\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m (\n\u001b[1;32m 306\u001b[0m networkx\u001b[38;5;241m.\u001b[39mexception\u001b[38;5;241m.\u001b[39mNetworkXError,\n\u001b[1;32m 307\u001b[0m optimaladj\u001b[38;5;241m.\u001b[39mCausalGraph\u001b[38;5;241m.\u001b[39mNoAdjException,\n\u001b[1;32m 308\u001b[0m optimaladj\u001b[38;5;241m.\u001b[39mCausalGraph\u001b[38;5;241m.\u001b[39mConditionException,\n\u001b[1;32m 309\u001b[0m ):\n", - "File \u001b[0;32m~/.virtualenvs/indra/lib/python3.11/site-packages/optimaladj/CausalGraph.py:360\u001b[0m, in \u001b[0;36mCausalGraph.optimal_adj_set\u001b[0;34m(self, treatment, outcome, L, N)\u001b[0m\n\u001b[1;32m 342\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21moptimal_adj_set\u001b[39m(\u001b[38;5;28mself\u001b[39m, treatment, outcome, L, N):\n\u001b[1;32m 343\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"Returns the optimal adjustment set with respect to treatment, outcome, L and N\u001b[39;00m\n\u001b[1;32m 344\u001b[0m \n\u001b[1;32m 345\u001b[0m \u001b[38;5;124;03m Parameters\u001b[39;00m\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 358\u001b[0m \u001b[38;5;124;03m optimal: set\u001b[39;00m\n\u001b[1;32m 359\u001b[0m \u001b[38;5;124;03m \"\"\"\u001b[39;00m\n\u001b[0;32m--> 360\u001b[0m H1 \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mbuild_H1\u001b[49m\u001b[43m(\u001b[49m\u001b[43mtreatment\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43moutcome\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mL\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mN\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 361\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m treatment \u001b[38;5;129;01min\u001b[39;00m H1\u001b[38;5;241m.\u001b[39mneighbors(outcome):\n\u001b[1;32m 362\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m NoAdjException(EXCEPTION_NO_ADJ)\n", - "File \u001b[0;32m~/.virtualenvs/indra/lib/python3.11/site-packages/optimaladj/CausalGraph.py:231\u001b[0m, in \u001b[0;36mCausalGraph.build_H1\u001b[0;34m(self, treatment, outcome, L, N)\u001b[0m\n\u001b[1;32m 229\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m i, node1 \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28menumerate\u001b[39m(vertices_list):\n\u001b[1;32m 230\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m node2 \u001b[38;5;129;01min\u001b[39;00m vertices_list[(i \u001b[38;5;241m+\u001b[39m \u001b[38;5;241m1\u001b[39m) :]:\n\u001b[0;32m--> 231\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m path \u001b[38;5;129;01min\u001b[39;00m nx\u001b[38;5;241m.\u001b[39mall_simple_paths(H0, source\u001b[38;5;241m=\u001b[39mnode1, target\u001b[38;5;241m=\u001b[39mnode2):\n\u001b[1;32m 232\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mset\u001b[39m(path)\u001b[38;5;241m.\u001b[39missubset(ignore_nodes\u001b[38;5;241m.\u001b[39munion(\u001b[38;5;28mset\u001b[39m([node1, node2]))):\n\u001b[1;32m 233\u001b[0m H1\u001b[38;5;241m.\u001b[39madd_edge(node1, node2)\n", - "File \u001b[0;32m~/.virtualenvs/indra/lib/python3.11/site-packages/networkx/algorithms/simple_paths.py:273\u001b[0m, in \u001b[0;36m_all_simple_paths_graph\u001b[0;34m(G, source, targets, cutoff)\u001b[0m\n\u001b[1;32m 271\u001b[0m \u001b[38;5;28;01myield\u001b[39;00m \u001b[38;5;28mlist\u001b[39m(visited) \u001b[38;5;241m+\u001b[39m [child]\n\u001b[1;32m 272\u001b[0m visited[child] \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[0;32m--> 273\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m targets \u001b[38;5;241m-\u001b[39m \u001b[38;5;28mset\u001b[39m(visited\u001b[38;5;241m.\u001b[39mkeys()): \u001b[38;5;66;03m# expand stack until find all targets\u001b[39;00m\n\u001b[1;32m 274\u001b[0m stack\u001b[38;5;241m.\u001b[39mappend(\u001b[38;5;28miter\u001b[39m(G[child]))\n\u001b[1;32m 275\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n", - "\u001b[0;31mKeyboardInterrupt\u001b[0m: " - ] + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "4d7102e8d4d9482f9118da35acf78027", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Estimating: 0%| | 0/500 [00:00