HighDimDirectLiNGAM
Import and settings
In this example, we need to import numpy, pandas, and
graphviz in addition to lingam.
import numpy as np
import pandas as pd
import graphviz
import lingam
from lingam import HighDimDirectLiNGAM
from lingam.utils import make_dot
print([np.__version__, pd.__version__, graphviz.__version__, lingam.__version__])
np.set_printoptions(precision=3, suppress=True)
np.random.seed(100)
['1.24.4', '2.0.3', '0.20.1', '1.8.3']
Test data
We create test data consisting of 6 variables.
m = np.array([
[ 0.000, 0.000, 0.000, 0.895, 0.000, 0.000],
[ 0.565, 0.000, 0.377, 0.000, 0.000, 0.000],
[ 0.000, 0.000, 0.000, 0.895, 0.000, 0.000],
[ 0.000, 0.000, 0.000, 0.000, 0.000, 0.000],
[ 0.991, 0.000, -0.124, 0.000, 0.000, 0.000],
[ 0.895, 0.000, 0.000, 0.000, 0.000, 0.000]
])
generate_error = lambda p: np.random.uniform(-p, p, size=1000)
error_vars = [0.2, 0.2, 0.2, 1.0, 0.2, 0.2]
params = [0.5 * np.sqrt(12 * v) for v in error_vars]
e = np.array([generate_error(p) for p in params])
X = np.linalg.pinv(np.eye(len(m)) - m) @ e
X = pd.DataFrame(X.T)
display(make_dot(m))
X.head()
| 0 | 1 | 2 | 3 | 4 | 5 | |
|---|---|---|---|---|---|---|
| 0 | -1.245034 | -2.070303 | -1.684946 | -1.466231 | -0.607202 | -1.208680 |
| 1 | -0.129694 | -0.453755 | -0.525306 | 0.238720 | -0.770446 | 0.214530 |
| 2 | -0.426608 | 0.434575 | -0.070464 | -0.346001 | -0.891935 | 0.060805 |
| 3 | -0.058363 | -0.412667 | 0.134419 | -0.661997 | -0.661361 | 0.382801 |
| 4 | 0.560928 | 0.631961 | 1.636429 | 1.484039 | 0.757059 | 0.526978 |
Causal Discovery
To run causal discovery, we create a HighDimDirectLiNGAM object and
call the fit method.
model = HighDimDirectLiNGAM()
model.fit(X)
<lingam.high_dim_direct_lingam.HighDimDirectLiNGAM at 0x7f47d61bcc10>
Using the causal_order_ properties, we can see the causal ordering
as a result of the causal discovery.
model.causal_order_
[3, 2, 0, 4, 1, 5]
Also, using the adjacency_matrix_ properties, we can see the
adjacency matrix as a result of the causal discovery.
model.adjacency_matrix_
array([[ 0. , 0. , 0. , 0.87 , 0. , 0. ],
[ 0.535, 0. , 0.411, 0. , 0. , 0. ],
[ 0. , 0. , 0. , 0.894, 0. , 0. ],
[ 0. , 0. , 0. , 0. , 0. , 0. ],
[ 0.937, 0. , -0.103, 0. , 0. , 0. ],
[ 0.875, 0. , 0. , 0. , 0. , 0. ]])
We can draw a causal graph by utility funciton.
make_dot(model.adjacency_matrix_)