{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'0.4'" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from dowhy import CausalModel\n", "import dowhy.datasets\n", "import numpy as np\n", "import pandas as pd\n", "\n", "import warnings\n", "warnings.filterwarnings('ignore')\n", "\n", "import logging\n", "#logging.getLogger(\"dowhy\").setLevel(logging.INFO)\n", "np.random.seed(25)\n", "dowhy.__version__" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " X0 X1 W0 W1 v0 y\n", "0 -0.690365 -1.110144 -0.099337 -0.426628 False -0.491223\n", "1 0.417015 -0.511456 -0.216640 -0.057772 True 8.814807\n", "2 0.223920 0.426649 0.120333 2.002458 True 12.894260\n", "3 0.854081 -0.545430 -1.312982 1.033137 True 6.092524\n", "4 0.008900 0.277964 -0.180486 -0.067758 True 10.150629\n", "{'df': X0 X1 W0 W1 v0 y\n", "0 -0.690365 -1.110144 -0.099337 -0.426628 False -0.491223\n", "1 0.417015 -0.511456 -0.216640 -0.057772 True 8.814807\n", "2 0.223920 0.426649 0.120333 2.002458 True 12.894260\n", "3 0.854081 -0.545430 -1.312982 1.033137 True 6.092524\n", "4 0.008900 0.277964 -0.180486 -0.067758 True 10.150629\n", "... ... ... ... ... ... ...\n", "99995 1.496265 0.613054 0.713475 -0.788403 False 2.482054\n", "99996 1.555262 0.013880 1.995508 0.566159 True 22.096263\n", "99997 -0.814917 0.254763 0.919172 -0.694613 False 3.284822\n", "99998 0.554770 1.331817 0.001694 0.521115 True 15.661477\n", "99999 0.396213 0.100599 2.093892 -1.172198 False 7.594258\n", "\n", "[100000 rows x 6 columns], 'treatment_name': ['v0'], 'outcome_name': 'y', 'common_causes_names': ['W0', 'W1'], 'instrument_names': [], 'effect_modifier_names': ['X0', 'X1'], 'dot_graph': 'digraph { U[label=\"Unobserved Confounders\"]; U->y;v0->y; U->v0;W0-> v0; W1-> v0;W0-> y; W1-> y;X0-> y; X1-> y;}', 'gml_graph': 'graph[directed 1node[ id \"y\" label \"y\"]node[ id \"Unobserved Confounders\" label \"Unobserved Confounders\"]edge[source \"Unobserved Confounders\" target \"y\"]node[ id \"W0\" label \"W0\"] node[ id \"W1\" label \"W1\"]node[ id \"v0\" label \"v0\"]edge[source \"v0\" target \"y\"]edge[source \"Unobserved Confounders\" target \"v0\"]edge[ source \"W0\" target \"v0\"] edge[ source \"W1\" target \"v0\"]edge[ source \"W0\" target \"y\"] edge[ source \"W1\" target \"y\"]node[ id \"X0\" label \"X0\"] edge[ source \"X0\" target \"y\"] node[ id \"X1\" label \"X1\"] edge[ source \"X1\" target \"y\"]]', 'ate': 11.759597003791514}\n" ] } ], "source": [ "data = dowhy.datasets.linear_dataset(10, num_common_causes=2, num_samples=100000,\n", " num_instruments=0, num_effect_modifiers=2,\n", " num_treatments=1,\n", " treatment_is_binary=True,\n", " outcome_is_binary=False)\n", "df = data['df']\n", "print(df.head())\n", "print(data)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "scrolled": true }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "INFO:dowhy.causal_model:Model to find the causal effect of treatment ['v0'] on outcome ['y']\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "CC ['U', 'W1', 'W0']\n", "EM ['X1', 'X0']\n" ] }, { "data": { "image/png": "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c+Tq1atHixcvptq1a5OOjg55e3vT3bt3K/zzMVYZcKHGGGP/cujQIXJzcyOZTEaGhobk4+ND165de+/7evbsSTo6OrR///6PznDjxg2aNGkSaWlpEQCqV69eaRHZokUL+vHHH0tbUClTfn4+7dmzh8aMGUNGRkakrq5OXbt2LS20TE1NKTAwkLKyst57rTcVaf8u1rS1tWnWrFmUnp6uhE/GmOriQo0xxt7g4cOH5OfnR40bNyYA1Lp1awoKCnrj6fYPHz4s7WsplUopMDDwo8fPzMykBQsWUPXq1UkqlZK7uzsdPHjwo69bUfLz8yksLIzatm1LAKhRo0a0adMmKikpee9731WkASCpVEpmZmZUXFyshE/CmGrjQo0xxt6huLiYDh48SP379yeZTEYmJibk6+tLN2/eLH3N77///krLJIlEQmPGjPmg9ktFRUUUGBhIBgYGpK+vTz/88AM9efKkIj9ShTt16hS5urqSRCIhe3t7On369Ftfu2HDBpJKpW8s0P73rtqOHTuU+CkYU01cqDHGWBndv3+f/Pz8qGHDhiSVSqlLly4UFhZGFhYWr90dUlNTI7lcTk+fPi3z9U+dOkWtW7cmdXV1mj59usoXaP/rzJkz5OTkRGpqajRx4sTXmp+XtUh7eVfN1ta2THfoGKvK+KlPxhgrp6KiIuzevRtBQUHYv3//Ww9pVVdXR7169bBv3z5YWFi89XolJSX47bffMGfOHHz++edYvnw5rK2tFRVfoej/H5g7bdo0VKtWDRs2bIC9vT2Cg4MxYsSIMvdflUgkICLExMTAyclJwakZU11cqDHG2Efw9PREWFjYOw961dbWxo4dO954HtqTJ08wYMAAHDlyBAsWLMDUqVOrxMn66enpGD58OA4dOoR+/fph06ZNpUWaVCotbe/073lTU1ODoaEhGjRogCZNmsDU1BRTp04tU2N5xqoqLtQYY+wD5eXlwdjYGJmZme98nVQqhUQiwdKlSzFhwoTSr6ekpKB79+7IycnBli1b0KZNG0VHVioiwqJFizB9+nRIJBIYGxvD1NQUjRs3Rv369WFqaor69eujXr16MDU1hYmJCffnZOx/vL1/CWOMsXfavn07srKy3vu6l0ujEydOxJUrV+Dv74+bN29CLpejVq1aOHToEOrWravouEonkUgwbdo0mJqawsvLC506dUJoaCgX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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "model = CausalModel(df,\n", " data[\"treatment_name\"],data[\"outcome_name\"],\n", " data[\"dot_graph\"],\n", " missing_nodes_as_confounders=True,\n", " logging_level=logging.INFO)\n", "\n", "print(\"CC\", model._common_causes)\n", "print(\"EM\", model._effect_modifiers)\n", "model.view_model()\n", "from IPython.display import Image, display\n", "display(Image(filename=\"causal_model.png\"))" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "logging.getLogger(\"causal_estimar\")" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "scrolled": true }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "INFO:dowhy.causal_identifier:Common causes of treatment and outcome:['U', 'W1', 'W0']\n", "WARNING:dowhy.causal_identifier:If this is observed data (not from a randomized experiment), there might always be missing confounders. Causal effect cannot be identified perfectly.\n", "INFO:dowhy.causal_identifier:Continuing by ignoring these unobserved confounders because proceed_when_unidentifiable flag is True.\n", "INFO:dowhy.causal_identifier:Instrumental variables for treatment and outcome:[]\n", "INFO:dowhy.causal_estimator:INFO: Using Linear Regression Estimator\n", "INFO:dowhy.causal_estimator:b: y~v0+W1+W0+v0*X1+v0*X0\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "5.589203357696533\n" ] } ], "source": [ "identified_estimand = model.identify_effect(proceed_when_unidentifiable=True)\n", "import time\n", "start=time.time()\n", "causal_estimate = model.estimate_effect(identified_estimand,\n", " method_name=\"backdoor.linear_regression\",\n", " confidence_intervals=False,\n", " test_significance=False,\n", " method_params = {\n", " 'num_null_simulations':10,\n", " 'num_simulations':10,\n", " 'num_quantiles_to_discretize_cont_cols':10,\n", " 'fit_method': \"statsmodels\",\n", " 'need_conditional_estimates':False\n", " },\n", " )\n", "end=time.time()\n", "print(end-start)\n", "#print(causal_estimate.estimator._linear_model.summary())\n", "#print(causal_estimate)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "ename": "TypeError", "evalue": "_test_significance() got an unexpected keyword argument 'num_simulations'", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mcausal_estimate\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtest_stat_significance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnum_simulations\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;32m/mnt/c/Users/amit_/code/dowhy/dowhy/causal_estimator.py\u001b[0m in \u001b[0;36mtest_stat_significance\u001b[0;34m(self, method, **kwargs)\u001b[0m\n\u001b[1;32m 693\u001b[0m signif_results = self.estimator.test_significance(self.value,\n\u001b[1;32m 694\u001b[0m \u001b[0mmethod\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mmethod\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 695\u001b[0;31m **kwargs)\n\u001b[0m\u001b[1;32m 696\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0;34m'p_value'\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0msignif_results\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m\"p_value\"\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 697\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m/mnt/c/Users/amit_/code/dowhy/dowhy/causal_estimator.py\u001b[0m in \u001b[0;36mtest_significance\u001b[0;34m(self, estimate_value, method, **kwargs)\u001b[0m\n\u001b[1;32m 536\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mmethod\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m\"default\"\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0mmethod\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;31m# user has not provided any method\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 537\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 538\u001b[0;31m \u001b[0msignif_dict\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_test_significance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mestimate_value\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmethod\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 539\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mNotImplementedError\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 540\u001b[0m \u001b[0msignif_dict\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_test_significance_with_bootstrap\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mestimate_value\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mTypeError\u001b[0m: _test_significance() got an unexpected keyword argument 'num_simulations'" ] } ], "source": [ "causal_estimate.test_stat_significance(num_simulations=2)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "print(causal_estimate.estimate_conditional_effects(effect_modifiers=[\"X1\" ]).head(20))" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from sklearn.preprocessing import PolynomialFeatures\n", "from sklearn.linear_model import LassoCV\n", "from sklearn.ensemble import GradientBoostingRegressor\n", "dml_estimate = model.estimate_effect(identified_estimand, method_name=\"backdoor.econml.dml.DMLCateEstimator\",\n", " control_value = 0,\n", " treatment_value = 1,\n", " target_units = \"ate\", # condition used for CATE\n", " confidence_intervals=False,\n", " method_params={\"init_params\":{'model_y':GradientBoostingRegressor(),\n", " 'model_t': GradientBoostingRegressor(),\n", " \"model_final\":LassoCV(), \n", " 'featurizer':PolynomialFeatures(degree=1, include_bias=True)},\n", " \"fit_params\":{}})\n", "print(dml_estimate)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "scrolled": false }, "outputs": [], "source": [ "print(causal_estimate.test_stat_significance(method=\"bootstrap\", num_null_simulations=2))\n", "print(causal_estimate.test_stat_significance())\n", "causal_estimate.test_stat_significance()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "print(causal_estimate.get_standard_error(method=\"bootstrap\", num_ci_simulations=10, sample_size_fraction=0.9))" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "print(causal_estimate.get_confidence_intervals(confidence_level=0.99))\n", "print(causal_estimate.get_confidence_intervals(method=\"bootstrap\", confidence_level=0.95, num_ci_simulations=10))\n", "print(causal_estimate.get_confidence_intervals(method=\"psm\", confidence_level=0.95, num_ci_simulations=10))" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "INFO:dowhy.causal_refuters.placebo_treatment_refuter:Refutation over 1 simulated datasets of Random Data treatment\n", "INFO:dowhy.causal_refuters.placebo_treatment_refuter:Using a Binomial Distribution with 1 trials and 0.5 probability of success\n", "INFO:dowhy.causal_estimator:INFO: Using Linear Regression Estimator\n", "INFO:dowhy.causal_estimator:b: y~placebo+W1+W0+placebo*X1+placebo*X0\n", "WARNING:dowhy.causal_refuters.placebo_treatment_refuter:We assume a Normal Distribution as the sample has less than 100 examples.\n", " Note: The underlying distribution may not be Normal. We assume that it approaches normal with the increase in sample size.\n" ] }, { "data": { "text/plain": [ "'Refute: Use a Placebo Treatment\\nEstimated effect:11.759597003788148\\nNew effect:0.0185251357744729\\np value:0.0\\n'" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "str(model.refute_estimate(identified_estimand, causal_estimate, method_name=\"placebo_treatment_refuter\", num_simulations=1))" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import statsmodels.formula.api as smf\n", "res=smf.ols(formula=\"y~v0+W0+W1+W2+W3\", data=df).fit()\n", "res.summary()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "lm = causal_estimate.estimator._linear_model\n", "print(lm.pvalues)\n", "print(type(lm.conf_int()))\n", "print(lm.bse)\n", "lm.summary()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "scrolled": true }, "outputs": [], "source": [ "print(causal_estimate.get_confidence_intervals(confidence_level =0.9))" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "print(causal_estimate.get_standard_error())" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "print(causal_estimate.test_stat_significance())" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.6" } }, "nbformat": 4, "nbformat_minor": 4 }