{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Demo for the DoWhy causal API\n", "We show a simple example of adding a causal extension to any dataframe. " ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import dowhy.datasets\n", "import dowhy.api\n", "\n", "import numpy as np\n", "import pandas as pd\n", "\n", "from statsmodels.api import OLS" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
W0v0y
00.883800True6.032204
12.151652True8.274524
20.565327True5.615925
31.943763True9.943361
41.025108True6.526274
............
995-1.452482False-1.081065
9961.532964False2.817101
997-0.350965True1.761346
998-1.642007False-3.852874
9990.641072False2.620429
\n", "

1000 rows × 3 columns

\n", "
" ], "text/plain": [ " W0 v0 y\n", "0 0.883800 True 6.032204\n", "1 2.151652 True 8.274524\n", "2 0.565327 True 5.615925\n", "3 1.943763 True 9.943361\n", "4 1.025108 True 6.526274\n", ".. ... ... ...\n", "995 -1.452482 False -1.081065\n", "996 1.532964 False 2.817101\n", "997 -0.350965 True 1.761346\n", "998 -1.642007 False -3.852874\n", "999 0.641072 False 2.620429\n", "\n", "[1000 rows x 3 columns]" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data = dowhy.datasets.linear_dataset(beta=5,\n", " num_common_causes=1,\n", " num_instruments = 0,\n", " num_samples=1000,\n", " treatment_is_binary=True)\n", "df = data['df']\n", "df['y'] = df['y'] + np.random.normal(size=len(df)) # Adding noise to data. Without noise, the variance in Y|X, Z is zero, and mcmc fails.\n", "#data['dot_graph'] = 'digraph { v ->y;X0-> v;X0-> y;}'\n", "\n", "treatment= data[\"treatment_name\"][0]\n", "outcome = data[\"outcome_name\"][0]\n", "common_cause = data[\"common_causes_names\"][0]\n", "df" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# data['df'] is just a regular pandas.DataFrame\n", "df.causal.do(x=treatment,\n", " variable_types={treatment: 'b', outcome: 'c', common_cause: 'c'},\n", " outcome=outcome,\n", " common_causes=[common_cause],\n", " proceed_when_unidentifiable=True).groupby(treatment).mean().plot(y=outcome, kind='bar')" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "df.causal.do(x={treatment: 1}, \n", " variable_types={treatment:'b', outcome: 'c', common_cause: 'c'}, \n", " outcome=outcome,\n", " method='weighting', \n", " common_causes=[common_cause],\n", " proceed_when_unidentifiable=True).groupby(treatment).mean().plot(y=outcome, kind='bar')" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "cdf_1 = df.causal.do(x={treatment: 1}, \n", " variable_types={treatment: 'b', outcome: 'c', common_cause: 'c'}, \n", " outcome=outcome, \n", " dot_graph=data['dot_graph'],\n", " proceed_when_unidentifiable=True)\n", "\n", "cdf_0 = df.causal.do(x={treatment: 0}, \n", " variable_types={treatment: 'b', outcome: 'c', common_cause: 'c'}, \n", " outcome=outcome, \n", " dot_graph=data['dot_graph'],\n", " proceed_when_unidentifiable=True)\n" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
W0v0ypropensity_scoreweight
01.117996False2.4970590.3332253.000976
10.238462False0.5090700.4552582.196556
20.213945False2.2795050.4588152.179528
30.425245False-0.2972960.4283362.334615
42.301323False3.4315200.2001394.996525
..................
9950.621286False1.4589360.4005312.496683
9961.642750False3.4099620.2688603.719407
9970.409933False-0.6355690.4305292.322722
998-0.063154False0.9532090.4992212.003123
9991.532964False2.8171010.2816623.550353
\n", "

1000 rows × 5 columns

\n", "
" ], "text/plain": [ " W0 v0 y propensity_score weight\n", "0 1.117996 False 2.497059 0.333225 3.000976\n", "1 0.238462 False 0.509070 0.455258 2.196556\n", "2 0.213945 False 2.279505 0.458815 2.179528\n", "3 0.425245 False -0.297296 0.428336 2.334615\n", "4 2.301323 False 3.431520 0.200139 4.996525\n", ".. ... ... ... ... ...\n", "995 0.621286 False 1.458936 0.400531 2.496683\n", "996 1.642750 False 3.409962 0.268860 3.719407\n", "997 0.409933 False -0.635569 0.430529 2.322722\n", "998 -0.063154 False 0.953209 0.499221 2.003123\n", "999 1.532964 False 2.817101 0.281662 3.550353\n", "\n", "[1000 rows x 5 columns]" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "cdf_0" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
W0v0ypropensity_scoreweight
01.055191True5.7381840.6585681.518446
11.676538True7.1870130.7350051.360535
20.111945True4.3531550.5263461.899889
3-0.840229True3.5037580.3890822.570151
40.556640True5.1252850.5903611.693878
..................
9950.018338True6.1450090.5126871.950507
9960.094625True5.3299910.5238211.909048
9970.711712True4.3944070.6120921.633741
9981.928415True8.1578320.7626781.311169
999-0.280647True5.3772140.4690322.132052
\n", "

1000 rows × 5 columns

\n", "
" ], "text/plain": [ " W0 v0 y propensity_score weight\n", "0 1.055191 True 5.738184 0.658568 1.518446\n", "1 1.676538 True 7.187013 0.735005 1.360535\n", "2 0.111945 True 4.353155 0.526346 1.899889\n", "3 -0.840229 True 3.503758 0.389082 2.570151\n", "4 0.556640 True 5.125285 0.590361 1.693878\n", ".. ... ... ... ... ...\n", "995 0.018338 True 6.145009 0.512687 1.950507\n", "996 0.094625 True 5.329991 0.523821 1.909048\n", "997 0.711712 True 4.394407 0.612092 1.633741\n", "998 1.928415 True 8.157832 0.762678 1.311169\n", "999 -0.280647 True 5.377214 0.469032 2.132052\n", "\n", "[1000 rows x 5 columns]" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "cdf_1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Comparing the estimate to Linear Regression\n", "First, estimating the effect using the causal data frame, and the 95% confidence interval." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/latex": [ "$\\displaystyle 5.092590494260132$" ], "text/plain": [ "5.092590494260132" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "(cdf_1['y'] - cdf_0['y']).mean()" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/latex": [ "$\\displaystyle 0.17478007931409847$" ], "text/plain": [ "0.17478007931409847" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "1.96*(cdf_1['y'] - cdf_0['y']).std() / np.sqrt(len(df))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Comparing to the estimate from OLS." ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "
OLS Regression Results
Dep. Variable: y R-squared (uncentered): 0.970
Model: OLS Adj. R-squared (uncentered): 0.970
Method: Least Squares F-statistic: 1.620e+04
Date: Tue, 02 Mar 2021 Prob (F-statistic): 0.00
Time: 20:29:26 Log-Likelihood: -1414.1
No. Observations: 1000 AIC: 2832.
Df Residuals: 998 BIC: 2842.
Df Model: 2
Covariance Type: nonrobust
\n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "
coef std err t P>|t| [0.025 0.975]
x1 1.7444 0.031 55.843 0.000 1.683 1.806
x2 5.0338 0.052 97.742 0.000 4.933 5.135
\n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "
Omnibus: 4.501 Durbin-Watson: 1.900
Prob(Omnibus): 0.105 Jarque-Bera (JB): 4.538
Skew: 0.147 Prob(JB): 0.103
Kurtosis: 2.851 Cond. No. 2.50


Notes:
[1] R² is computed without centering (uncentered) since the model does not contain a constant.
[2] Standard Errors assume that the covariance matrix of the errors is correctly specified." ], "text/plain": [ "\n", "\"\"\"\n", " OLS Regression Results \n", "=======================================================================================\n", "Dep. Variable: y R-squared (uncentered): 0.970\n", "Model: OLS Adj. R-squared (uncentered): 0.970\n", "Method: Least Squares F-statistic: 1.620e+04\n", "Date: Tue, 02 Mar 2021 Prob (F-statistic): 0.00\n", "Time: 20:29:26 Log-Likelihood: -1414.1\n", "No. Observations: 1000 AIC: 2832.\n", "Df Residuals: 998 BIC: 2842.\n", "Df Model: 2 \n", "Covariance Type: nonrobust \n", "==============================================================================\n", " coef std err t P>|t| [0.025 0.975]\n", "------------------------------------------------------------------------------\n", "x1 1.7444 0.031 55.843 0.000 1.683 1.806\n", "x2 5.0338 0.052 97.742 0.000 4.933 5.135\n", "==============================================================================\n", "Omnibus: 4.501 Durbin-Watson: 1.900\n", "Prob(Omnibus): 0.105 Jarque-Bera (JB): 4.538\n", "Skew: 0.147 Prob(JB): 0.103\n", "Kurtosis: 2.851 Cond. No. 2.50\n", "==============================================================================\n", "\n", "Notes:\n", "[1] R² is computed without centering (uncentered) since the model does not contain a constant.\n", "[2] Standard Errors assume that the covariance matrix of the errors is correctly specified.\n", "\"\"\"" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "model = OLS(np.asarray(df[outcome]), np.asarray(df[[common_cause, treatment]], dtype=np.float64))\n", "result = model.fit()\n", "result.summary()" ] } ], "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.8.5" }, "toc": { "base_numbering": 1, "nav_menu": {}, "number_sections": false, "sideBar": true, "skip_h1_title": true, "title_cell": "Table of Contents", "title_sidebar": "Contents", "toc_cell": false, "toc_position": {}, "toc_section_display": true, "toc_window_display": false } }, "nbformat": 4, "nbformat_minor": 4 }