Skip to main content

Structural Causal Models

Project description

OS Status
Linux L Py 3.7 - 3.9
Windows W Py 3.7 - 3.9
Mac M Py 3.7 - 3.9

A Python package implementing Structural Causal Models (SCM).

The library uses the CAS library SymPy to allow the user to state arbitrary assignment functions and noise distributions as supported by SymPy and builds the DAG with networkx.

It supports the features:

  • Sampling
  • Intervening
  • Plotting
  • Printing

and by extension all methods on a DAG provided by networkx after accessing the member variable dag

Installation

Git clone the repository and run the setup.py file

git clone https://github.com/maichmueller/scm
cd scm
python setup.py install

Example usage

To build the DAG

X \rightarrow Y \leftarrow Z \rightarrow X

with the assignments

Z ~ LogLogistic(alpha=1, beta=1)

X = 3Z^2{\cdot}N

Y = 2Z + \sqrt{X} + N

one can describe the assignments as strings

from scm import SCM

myscm = SCM(
    [
        "Z = N, N ~ LogLogistic(alpha=1, beta=1)",
        "X = N * 3 * Z ** 2, N ~ LogNormal(mean=1, std=1)",
        "Y = N + 2 * Z + sqrt(X), N ~ Normal(mean=2, std=1)"
    ]
)

or build the assignments piecewise themselves via an assignment map

from sympy.stats import LogLogistic, LogNormal, Normal


assignment_map = {
   "Z": (
       "N",
       LogLogistic("N", alpha=1, beta=1)
   ),
   "X": (
       "N * 3 * Z ** 2",
       LogNormal("N", mean=1, std=1),
   ),
   "Y": (
       "N + 2 * Z + sqrt(X)",
       Normal("N", mean=2, std=1),
   ),
}

myscm = SCM(assignment_map)

The SCM supports a form of pretty printing its current setup, which includes mentioning active interventions and the assignments

print(myscm)
Structural Causal Model of 3 variables: Z, X, Y
Following variables are actively intervened on: []
Current Assignments are:
Z := f(N) = N	 [ N ~ LogLogistic(alpha=1, beta=1) ]
X := f(N, Z) = N * 3 * Z ** 2	 [ N ~ LogNormal(mean=1, std=1) ]
Y := f(N, X, Z) = N + 2 * Z + sqrt(X)	 [ N ~ Normal(mean=2, std=1) ]

One can easily perform interventions on the variables, e.g. a Do-intervention \text{do}(X=1=)

myscm.do_intervention([("X", 1)])

and sample as many samples from it as desired

myscm.sample(5)
X Z Y
0 1 0.204204 2.412121
1 1 0.038627 2.035116
2 1 0.627638 4.767240
3 1 0.620331 4.497902
4 1 0.143817 4.723647

The current intervention is also noted in its string representation

print(myscm)
Structural Causal Model of 3 variables: Z, X, Y
Following variables are actively intervened on: ['X']
Current Assignments are:
Z := f(N) = N	 [ N ~ LogLogistic(alpha=1, beta=1) ]
X := f(N) = 1	 [ N ~ LogNormal(mean=1, std=1) ]
Y := f(N, X, Z) = N + 2 * Z + sqrt(X)	 [ N ~ Normal(mean=2, std=1) ]

which can be restored to the initial status via undoing the intervention

myscm.undo_intervention()

If you have graphviz installed, you can also use it to plot the DAG easily

myscm.plot(node_size=1000, alpha=1)

example_plot

No history capture as of yet.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

scmodels-0.1.tar.gz (19.2 kB view hashes)

Uploaded Source

Built Distribution

scmodels-0.1-py3-none-any.whl (16.1 kB view hashes)

Uploaded Python 3

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page