Creative Commons License
This pyAgrum's notebook is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License
Author: Aymen Merrouche and Pierre-Henri Wuillemin.

**Do-caclculus**

This notebook follows the examples from "The Book Of Why" (Pearl, 2018) chapter 7 page 213.

In [1]:
from IPython.display import display, Math, Latex,HTML

import pyAgrum as gum
import pyAgrum.lib.notebook as gnb
gnb.forDarkTheme()

import pyAgrum.causal as csl
import pyAgrum.causal.notebook as cslnb

import os

We create the causal diagram:

The corresponding causal diagram is the following:

We're facing the following situation and we want to measure the causal effect of $X$ on $Y$:

In [2]:
fd = gum.fastBN("w->z->x->y;w->x;w->y")
fd
Out[2]:
G w w z z w->z x x w->x y y w->y z->x x->y

We suspect the presence of some unmeasured confounders, that could explain the correlation between $W$ and $X$ and between $W$ and $Y$:

In [3]:
fdModele = csl.CausalModel(fd, [("u1", ["w","x"]),("u2", ["w","y"])],False) #(<latent variable name>, <list of affected variables’ ids>).
fdModele
Out[3]:
G w w z z w->z x x z->x y y x->y u1 u1->w u1->x u2 u2->w u2->y

Even with two umeausred confounders :

  • We can measure the causal effect of $Z$ on $Y$ using the back-door adjustment:
In [4]:
print(" + Back-door doing Z on Y :"+str(fdModele.backDoor("z","y")))
 + Back-door doing Z on Y :['w']
  • We can measure the causal effect of $W$ on $X$ using the front-door formula:
In [5]:
print(" + Front-door doing W on X :"+str(fdModele.frontDoor("w","x")))
 + Front-door doing W on X :['z']
  • In order to measure the causal effect of $X$ on $Y$, we can use neither the back-door adjustment nor the front-door formula:
In [6]:
print(" + Backdoor doing X on Y :"+str(fdModele.backDoor("x","y")))
print(" + Frontdoor doing X on Y :"+str(fdModele.frontDoor("x","y")))
 + Backdoor doing X on Y :None
 + Frontdoor doing X on Y :None
  • In this case, the only way to measure the causal effect of $X$ on $Y$ is to use the do-calculus:
In [7]:
cslnb.showCausalImpact(fdModele,on="y",doing="x")
G w w z z w->z x x z->x y y x->y u1 u1->w u1->x u2 u2->w u2->y
$$\begin{equation}P( y \mid \hookrightarrow\mkern-6.5mux) = \frac {\sum_{w}{P\left(w\right) \cdot P\left(y\mid w,x,z\right) \cdot P\left(x\mid w,z\right)}}{\sum_{w,y'}{P\left(w\right) \cdot P\left(y'\mid w,x,z\right) \cdot P\left(x\mid w,z\right)}}\end{equation}$$
y
z
x
0
1
0
0
0.13460.8654
1
0.22730.7727
1
0
0.09170.9083
1
0.24110.7589
Causal Model
Explanation : Do-calculus computations
Impact : $P( y \mid \hookrightarrow\mkern-6.5mux)$
In [ ]: