{
 "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 os, sys\n",
    "sys.path.append(os.path.abspath(\"../../../\"))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "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": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>W0</th>\n",
       "      <th>v0</th>\n",
       "      <th>y</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.230046</td>\n",
       "      <td>False</td>\n",
       "      <td>0.328777</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>-0.625509</td>\n",
       "      <td>True</td>\n",
       "      <td>3.794958</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>-2.600417</td>\n",
       "      <td>False</td>\n",
       "      <td>-5.214096</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0.146942</td>\n",
       "      <td>False</td>\n",
       "      <td>1.361876</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>-0.919551</td>\n",
       "      <td>False</td>\n",
       "      <td>-2.228864</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>995</th>\n",
       "      <td>-0.063647</td>\n",
       "      <td>False</td>\n",
       "      <td>0.117779</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>996</th>\n",
       "      <td>-1.962547</td>\n",
       "      <td>False</td>\n",
       "      <td>-4.034488</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>997</th>\n",
       "      <td>-0.089728</td>\n",
       "      <td>True</td>\n",
       "      <td>5.780041</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>998</th>\n",
       "      <td>-0.334302</td>\n",
       "      <td>True</td>\n",
       "      <td>3.872871</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>999</th>\n",
       "      <td>-2.410448</td>\n",
       "      <td>False</td>\n",
       "      <td>-4.524930</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>1000 rows × 3 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "           W0     v0         y\n",
       "0    0.230046  False  0.328777\n",
       "1   -0.625509   True  3.794958\n",
       "2   -2.600417  False -5.214096\n",
       "3    0.146942  False  1.361876\n",
       "4   -0.919551  False -2.228864\n",
       "..        ...    ...       ...\n",
       "995 -0.063647  False  0.117779\n",
       "996 -1.962547  False -4.034488\n",
       "997 -0.089728   True  5.780041\n",
       "998 -0.334302   True  3.872871\n",
       "999 -2.410448  False -4.524930\n",
       "\n",
       "[1000 rows x 3 columns]"
      ]
     },
     "execution_count": 3,
     "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": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "WARNING:dowhy.causal_model:Causal Graph not provided. DoWhy will construct a graph based on data inputs.\n",
      "INFO:dowhy.causal_graph:If this is observed data (not from a randomized experiment), there might always be missing confounders. Adding a node named \"Unobserved Confounders\" to reflect this.\n",
      "INFO:dowhy.causal_model:Model to find the causal effect of treatment ['v0'] on outcome ['y']\n",
      "INFO:dowhy.causal_identifier:Common causes of treatment and outcome:['W0', 'U']\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"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARN: Do you want to continue by ignoring any unobserved confounders? (use proceed_when_unidentifiable=True to disable this prompt) [y/n] y\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "INFO:dowhy.causal_identifier:Instrumental variables for treatment and outcome:[]\n",
      "INFO:dowhy.do_sampler:Using WeightingSampler for do sampling.\n",
      "INFO:dowhy.do_sampler:Caution: do samplers assume iid data.\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0x7f0f4a609e80>"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "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]).groupby(treatment).mean().plot(y=outcome, kind='bar')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "WARNING:dowhy.causal_model:Causal Graph not provided. DoWhy will construct a graph based on data inputs.\n",
      "INFO:dowhy.causal_graph:If this is observed data (not from a randomized experiment), there might always be missing confounders. Adding a node named \"Unobserved Confounders\" to reflect this.\n",
      "INFO:dowhy.causal_model:Model to find the causal effect of treatment ['v0'] on outcome ['y']\n",
      "INFO:dowhy.causal_identifier:Common causes of treatment and outcome:['W0', 'U']\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.do_sampler:Using WeightingSampler for do sampling.\n",
      "INFO:dowhy.do_sampler:Caution: do samplers assume iid data.\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0x7f0f48316358>"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "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": 6,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "INFO:dowhy.causal_model:Model to find the causal effect of treatment ['v0'] on outcome ['y']\n",
      "INFO:dowhy.causal_identifier:Common causes of treatment and outcome:['W0', 'U']\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.do_sampler:Using WeightingSampler for do sampling.\n",
      "INFO:dowhy.do_sampler:Caution: do samplers assume iid data.\n",
      "INFO:dowhy.causal_model:Model to find the causal effect of treatment ['v0'] on outcome ['y']\n",
      "INFO:dowhy.causal_identifier:Common causes of treatment and outcome:['W0', 'U']\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.do_sampler:Using WeightingSampler for do sampling.\n",
      "INFO:dowhy.do_sampler:Caution: do samplers assume iid data.\n"
     ]
    }
   ],
   "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": 7,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>W0</th>\n",
       "      <th>v0</th>\n",
       "      <th>y</th>\n",
       "      <th>propensity_score</th>\n",
       "      <th>weight</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>-0.583286</td>\n",
       "      <td>False</td>\n",
       "      <td>-2.456860</td>\n",
       "      <td>0.574597</td>\n",
       "      <td>1.740350</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>-1.853274</td>\n",
       "      <td>False</td>\n",
       "      <td>-3.699267</td>\n",
       "      <td>0.754520</td>\n",
       "      <td>1.325346</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>-1.530711</td>\n",
       "      <td>False</td>\n",
       "      <td>-4.384006</td>\n",
       "      <td>0.713824</td>\n",
       "      <td>1.400906</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>-0.036469</td>\n",
       "      <td>False</td>\n",
       "      <td>-2.269524</td>\n",
       "      <td>0.486654</td>\n",
       "      <td>2.054847</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>-1.749115</td>\n",
       "      <td>False</td>\n",
       "      <td>-3.311137</td>\n",
       "      <td>0.741816</td>\n",
       "      <td>1.348043</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>995</th>\n",
       "      <td>-1.227516</td>\n",
       "      <td>False</td>\n",
       "      <td>-0.875867</td>\n",
       "      <td>0.672107</td>\n",
       "      <td>1.487859</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>996</th>\n",
       "      <td>-0.405553</td>\n",
       "      <td>False</td>\n",
       "      <td>-1.427872</td>\n",
       "      <td>0.546258</td>\n",
       "      <td>1.830637</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>997</th>\n",
       "      <td>0.230046</td>\n",
       "      <td>False</td>\n",
       "      <td>0.328777</td>\n",
       "      <td>0.443752</td>\n",
       "      <td>2.253509</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>998</th>\n",
       "      <td>-2.157752</td>\n",
       "      <td>False</td>\n",
       "      <td>-4.830362</td>\n",
       "      <td>0.789181</td>\n",
       "      <td>1.267136</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>999</th>\n",
       "      <td>-0.453149</td>\n",
       "      <td>False</td>\n",
       "      <td>-2.167928</td>\n",
       "      <td>0.553884</td>\n",
       "      <td>1.805431</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>1000 rows × 5 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "           W0     v0         y  propensity_score    weight\n",
       "0   -0.583286  False -2.456860          0.574597  1.740350\n",
       "1   -1.853274  False -3.699267          0.754520  1.325346\n",
       "2   -1.530711  False -4.384006          0.713824  1.400906\n",
       "3   -0.036469  False -2.269524          0.486654  2.054847\n",
       "4   -1.749115  False -3.311137          0.741816  1.348043\n",
       "..        ...    ...       ...               ...       ...\n",
       "995 -1.227516  False -0.875867          0.672107  1.487859\n",
       "996 -0.405553  False -1.427872          0.546258  1.830637\n",
       "997  0.230046  False  0.328777          0.443752  2.253509\n",
       "998 -2.157752  False -4.830362          0.789181  1.267136\n",
       "999 -0.453149  False -2.167928          0.553884  1.805431\n",
       "\n",
       "[1000 rows x 5 columns]"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cdf_0"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>W0</th>\n",
       "      <th>v0</th>\n",
       "      <th>y</th>\n",
       "      <th>propensity_score</th>\n",
       "      <th>weight</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>-0.229733</td>\n",
       "      <td>True</td>\n",
       "      <td>4.754793</td>\n",
       "      <td>0.482075</td>\n",
       "      <td>2.074366</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>-0.238390</td>\n",
       "      <td>True</td>\n",
       "      <td>4.487643</td>\n",
       "      <td>0.480676</td>\n",
       "      <td>2.080404</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>-2.161507</td>\n",
       "      <td>True</td>\n",
       "      <td>-1.700668</td>\n",
       "      <td>0.210415</td>\n",
       "      <td>4.752520</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>-1.639879</td>\n",
       "      <td>True</td>\n",
       "      <td>2.173829</td>\n",
       "      <td>0.271959</td>\n",
       "      <td>3.677028</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0.030840</td>\n",
       "      <td>True</td>\n",
       "      <td>4.465655</td>\n",
       "      <td>0.524224</td>\n",
       "      <td>1.907580</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>995</th>\n",
       "      <td>-1.688769</td>\n",
       "      <td>True</td>\n",
       "      <td>2.404017</td>\n",
       "      <td>0.265737</td>\n",
       "      <td>3.763121</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>996</th>\n",
       "      <td>-0.910527</td>\n",
       "      <td>True</td>\n",
       "      <td>2.528176</td>\n",
       "      <td>0.374608</td>\n",
       "      <td>2.669460</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>997</th>\n",
       "      <td>-2.838431</td>\n",
       "      <td>True</td>\n",
       "      <td>-0.226373</td>\n",
       "      <td>0.146704</td>\n",
       "      <td>6.816457</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>998</th>\n",
       "      <td>0.429132</td>\n",
       "      <td>True</td>\n",
       "      <td>6.865883</td>\n",
       "      <td>0.587791</td>\n",
       "      <td>1.701285</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>999</th>\n",
       "      <td>-1.509348</td>\n",
       "      <td>True</td>\n",
       "      <td>2.153207</td>\n",
       "      <td>0.289010</td>\n",
       "      <td>3.460088</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>1000 rows × 5 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "           W0    v0         y  propensity_score    weight\n",
       "0   -0.229733  True  4.754793          0.482075  2.074366\n",
       "1   -0.238390  True  4.487643          0.480676  2.080404\n",
       "2   -2.161507  True -1.700668          0.210415  4.752520\n",
       "3   -1.639879  True  2.173829          0.271959  3.677028\n",
       "4    0.030840  True  4.465655          0.524224  1.907580\n",
       "..        ...   ...       ...               ...       ...\n",
       "995 -1.688769  True  2.404017          0.265737  3.763121\n",
       "996 -0.910527  True  2.528176          0.374608  2.669460\n",
       "997 -2.838431  True -0.226373          0.146704  6.816457\n",
       "998  0.429132  True  6.865883          0.587791  1.701285\n",
       "999 -1.509348  True  2.153207          0.289010  3.460088\n",
       "\n",
       "[1000 rows x 5 columns]"
      ]
     },
     "execution_count": 8,
     "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": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/latex": [
       "$\\displaystyle 5.006194579687894$"
      ],
      "text/plain": [
       "5.006194579687894"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "(cdf_1['y'] - cdf_0['y']).mean()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/latex": [
       "$\\displaystyle 0.2245958282589085$"
      ],
      "text/plain": [
       "0.2245958282589085"
      ]
     },
     "execution_count": 10,
     "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": 11,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<table class=\"simpletable\">\n",
       "<caption>OLS Regression Results</caption>\n",
       "<tr>\n",
       "  <th>Dep. Variable:</th>            <td>y</td>        <th>  R-squared (uncentered):</th>      <td>   0.938</td>\n",
       "</tr>\n",
       "<tr>\n",
       "  <th>Model:</th>                   <td>OLS</td>       <th>  Adj. R-squared (uncentered):</th> <td>   0.938</td>\n",
       "</tr>\n",
       "<tr>\n",
       "  <th>Method:</th>             <td>Least Squares</td>  <th>  F-statistic:       </th>          <td>   7544.</td>\n",
       "</tr>\n",
       "<tr>\n",
       "  <th>Date:</th>             <td>Tue, 07 Jan 2020</td> <th>  Prob (F-statistic):</th>           <td>  0.00</td> \n",
       "</tr>\n",
       "<tr>\n",
       "  <th>Time:</th>                 <td>11:54:35</td>     <th>  Log-Likelihood:    </th>          <td> -1408.7</td>\n",
       "</tr>\n",
       "<tr>\n",
       "  <th>No. Observations:</th>      <td>  1000</td>      <th>  AIC:               </th>          <td>   2821.</td>\n",
       "</tr>\n",
       "<tr>\n",
       "  <th>Df Residuals:</th>          <td>   998</td>      <th>  BIC:               </th>          <td>   2831.</td>\n",
       "</tr>\n",
       "<tr>\n",
       "  <th>Df Model:</th>              <td>     2</td>      <th>                     </th>              <td> </td>   \n",
       "</tr>\n",
       "<tr>\n",
       "  <th>Covariance Type:</th>      <td>nonrobust</td>    <th>                     </th>              <td> </td>   \n",
       "</tr>\n",
       "</table>\n",
       "<table class=\"simpletable\">\n",
       "<tr>\n",
       "   <td></td>     <th>coef</th>     <th>std err</th>      <th>t</th>      <th>P>|t|</th>  <th>[0.025</th>    <th>0.975]</th>  \n",
       "</tr>\n",
       "<tr>\n",
       "  <th>x1</th> <td>    2.2679</td> <td>    0.025</td> <td>   89.049</td> <td> 0.000</td> <td>    2.218</td> <td>    2.318</td>\n",
       "</tr>\n",
       "<tr>\n",
       "  <th>x2</th> <td>    5.0091</td> <td>    0.050</td> <td>  100.297</td> <td> 0.000</td> <td>    4.911</td> <td>    5.107</td>\n",
       "</tr>\n",
       "</table>\n",
       "<table class=\"simpletable\">\n",
       "<tr>\n",
       "  <th>Omnibus:</th>       <td> 2.664</td> <th>  Durbin-Watson:     </th> <td>   2.034</td>\n",
       "</tr>\n",
       "<tr>\n",
       "  <th>Prob(Omnibus):</th> <td> 0.264</td> <th>  Jarque-Bera (JB):  </th> <td>   2.431</td>\n",
       "</tr>\n",
       "<tr>\n",
       "  <th>Skew:</th>          <td>-0.049</td> <th>  Prob(JB):          </th> <td>   0.297</td>\n",
       "</tr>\n",
       "<tr>\n",
       "  <th>Kurtosis:</th>      <td> 2.779</td> <th>  Cond. No.          </th> <td>    2.03</td>\n",
       "</tr>\n",
       "</table><br/><br/>Warnings:<br/>[1] Standard Errors assume that the covariance matrix of the errors is correctly specified."
      ],
      "text/plain": [
       "<class 'statsmodels.iolib.summary.Summary'>\n",
       "\"\"\"\n",
       "                                 OLS Regression Results                                \n",
       "=======================================================================================\n",
       "Dep. Variable:                      y   R-squared (uncentered):                   0.938\n",
       "Model:                            OLS   Adj. R-squared (uncentered):              0.938\n",
       "Method:                 Least Squares   F-statistic:                              7544.\n",
       "Date:                Tue, 07 Jan 2020   Prob (F-statistic):                        0.00\n",
       "Time:                        11:54:35   Log-Likelihood:                         -1408.7\n",
       "No. Observations:                1000   AIC:                                      2821.\n",
       "Df Residuals:                     998   BIC:                                      2831.\n",
       "Df Model:                           2                                                  \n",
       "Covariance Type:            nonrobust                                                  \n",
       "==============================================================================\n",
       "                 coef    std err          t      P>|t|      [0.025      0.975]\n",
       "------------------------------------------------------------------------------\n",
       "x1             2.2679      0.025     89.049      0.000       2.218       2.318\n",
       "x2             5.0091      0.050    100.297      0.000       4.911       5.107\n",
       "==============================================================================\n",
       "Omnibus:                        2.664   Durbin-Watson:                   2.034\n",
       "Prob(Omnibus):                  0.264   Jarque-Bera (JB):                2.431\n",
       "Skew:                          -0.049   Prob(JB):                        0.297\n",
       "Kurtosis:                       2.779   Cond. No.                         2.03\n",
       "==============================================================================\n",
       "\n",
       "Warnings:\n",
       "[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.\n",
       "\"\"\""
      ]
     },
     "execution_count": 11,
     "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.6.9"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}