CausalDynamics#

Here, we showcase some key features of CausalDynamics using small example graphs.

import torch
import matplotlib.pyplot as plt

from causaldynamics.scm import create_scm_graph
from causaldynamics.plot import plot_trajectories, plot_scm, plot_3d_trajectories
from causaldynamics.creator import create_scm, simulate_system

Basic coupled model#

num_nodes = 3
node_dim = 3
num_timesteps = 1000

confounders=False,
system_name='Lorenz'

A = torch.tensor([[0,0,0],
                 [1,0,0],
                 [1,0,0]])

A, W, b, root_nodes, _ = create_scm(num_nodes,
                                    node_dim=node_dim,
                                    confounders=confounders,
                                    adjacency_matrix=A)

data = simulate_system(A, W, b, 
                      num_timesteps=num_timesteps, 
                      num_nodes=num_nodes,
                      system_name=system_name) 


plot_scm(G=create_scm_graph(A), root_nodes=root_nodes)
plot_3d_trajectories(data, root_nodes, line_alpha=1.)
plot_trajectories(data, root_nodes, sharey=False)
plt.show()
INFO - Creating SCM with 3 nodes and 3 dimensions each...
INFO - Simulating Lorenz system for 1000 timesteps...
../_images/0fc90f7bc000008eee08c08e86fa7190bc8c2029ffd056a987db41314d59d423.png ../_images/d1b91080096c785ae9f2f298d24f45d294e866a431228d8b189153bb31273690.png ../_images/196443e3bbb5114421dcbb88ede66da492c781c32636deb2a8a4b4e756fa0f11.png

Confounders#

A = torch.tensor([[0,0,0],
                 [1,0,0],
                 [1,1,0]])

A, W, b, root_nodes, _ = create_scm(num_nodes,
                                    node_dim=node_dim,
                                    confounders=confounders,
                                    adjacency_matrix=A)

data = simulate_system(A, W, b, 
                      num_timesteps=num_timesteps, 
                      num_nodes=num_nodes,
                      system_name=system_name) 

plot_scm(G=create_scm_graph(A), root_nodes=root_nodes)
plot_3d_trajectories(data, root_nodes, line_alpha=1.)
plot_trajectories(data, root_nodes, sharey=False)
plt.show()
INFO - Creating SCM with 3 nodes and 3 dimensions each...
INFO - Simulating Lorenz system for 1000 timesteps...
../_images/bc616d067ab7acc51e07a081026b57693316901d8b36b3379f6f729013bf4b76.png ../_images/666eece7520bb6302613ad7e65cee76fbc69bdcac2d75fca6ae9278cfc9f6dba.png ../_images/a6a5a6432b2664570277d571559ce63344e504e3a776d72093936a2133037b43.png

Time-lag edges#

time_lag = 10
time_lag_edge_probability = 0.1

A, W, b, root_nodes, magnitudes = create_scm(
    num_nodes,
    node_dim=node_dim,
    confounders=False,
    graph="scale-free",
    time_lag=time_lag,
    time_lag_edge_probability=time_lag_edge_probability
)

data = simulate_system(A, W, b, 
                      num_timesteps=num_timesteps, 
                      num_nodes=num_nodes,
                      system_name=system_name,
                      time_lag=time_lag,) 

plot_scm(G=create_scm_graph(A), root_nodes=root_nodes)
plot_3d_trajectories(data, root_nodes, line_alpha=1.)
plot_trajectories(data, root_nodes, sharey=False)
plt.show()
INFO - Creating SCM with 3 nodes and 3 dimensions each...
INFO - Simulating Lorenz system for 1000 timesteps...
../_images/b90fde05127d3e41be16cfb2987ad7815f28ce130d69294be792c1ad5a66f52f.png ../_images/57a1cf5082611a1eb93045e6c4d6843f0a56a71e235fa50989c9940e541d0e77.png ../_images/1bc6b45470fb1ee0f70cf44fd806b9a2cad6f291105e2d8a36d81dcef51f99a0.png

Stochastic systems#

num_nodes = 3
node_dim = 3
num_timesteps = 1000
noise = 1.

confounders=False,
system_name='Lorenz'

A = torch.tensor([[0,0,0],
                 [1,0,0],
                 [1,0,0]])

A, W, b, root_nodes, _ = create_scm(num_nodes,
                                    node_dim=node_dim,
                                    confounders=confounders,
                                    adjacency_matrix=A)

data = simulate_system(A, W, b, 
                      num_timesteps=num_timesteps, 
                      num_nodes=num_nodes,
                      system_name=system_name,
                      make_trajectory_kwargs={'noise': noise}) 


plot_scm(G=create_scm_graph(A), root_nodes=root_nodes)
plot_3d_trajectories(data, root_nodes, line_alpha=1.)
plot_trajectories(data, root_nodes, sharey=False)
plt.show()
INFO - Creating SCM with 3 nodes and 3 dimensions each...
INFO - Simulating Lorenz system for 1000 timesteps...
../_images/d4fd9e54186c626fedb18c3b409d573f1c4d79dc05f6e202a57f5f43bc0db4d0.png ../_images/743017cf46b247ac8d3d74607a876df0e5d8116ae48048ced99729f27b0a80fe.png ../_images/d9824dd9c3be01d0168aa3a1d63df0639ad8aa728170de18564f74ac650352aa.png

Periodic drivers#

num_nodes = 3
node_dim = 3
num_timesteps = 1000

confounders=False,
system_name='Lorenz'

A = torch.tensor([[0,0,0],
                 [1,0,0],
                 [1,0,0]])

A, W, b, root_nodes, _ = create_scm(num_nodes,
                                    node_dim=node_dim,
                                    confounders=confounders,
                                    adjacency_matrix=A)

data = simulate_system(A, W, b, 
                      num_timesteps=num_timesteps, 
                      num_nodes=num_nodes,
                      system_name=system_name,
                      init_ratios=[1,1]) 

plot_scm(G=create_scm_graph(A), root_nodes=root_nodes)
plot_3d_trajectories(data, root_nodes, line_alpha=1.)
plot_trajectories(data, root_nodes, sharey=False)
plt.show()
INFO - Creating SCM with 3 nodes and 3 dimensions each...
INFO - Simulating Lorenz system for 1000 timesteps...
../_images/f141a86fdb87a192e8a0177f39d8ac974e8fb6b6c5555748ae0902d5fd8acfcb.png ../_images/c4ae70769bf3d0a199728b92894e875431bf4212799817afabbdc18f5d8b684f.png ../_images/121fed8c1edb9ce592a065c7442a053967e778c774c3085330fa3289cc730a14.png

Internal standardization#

num_nodes = 3
node_dim = 3
num_timesteps = 1000
standardize = True

confounders=False,
system_name='Lorenz'

A = torch.tensor([[0,0,0],
                 [1,0,0],
                 [1,0,0]])

A, W, b, root_nodes, _ = create_scm(num_nodes,
                                    node_dim=node_dim,
                                    confounders=confounders,
                                    adjacency_matrix=A)

data = simulate_system(A, W, b, 
                      num_timesteps=num_timesteps, 
                      standardize=standardize,
                      num_nodes=num_nodes,
                      system_name=system_name) 


plot_scm(G=create_scm_graph(A), root_nodes=root_nodes)
plot_3d_trajectories(data, root_nodes, line_alpha=0.5)
plot_trajectories(data, root_nodes, sharey=False)
plt.show()
INFO - Creating SCM with 3 nodes and 3 dimensions each...
INFO - Simulating Lorenz system for 1000 timesteps...
../_images/f104222c585cd60be8c5c1fe6c00748af36b53562940f623a4faf786413555b4.png ../_images/6e239e5386a24dbe4dbeb725725772a5da9cd23772a385184322f7ce9e39ec5d.png ../_images/1b72b0a2a5455d6ee8cafe14098f6f2bb86f04cb6d6307191e9076e4444c39f4.png