https://github.com/inoueakimitsu/cyclicmodel
Statistical causal discovery based on cyclic model
https://github.com/inoueakimitsu/cyclicmodel
causal-inference data-science probabilistic-programming pymc3 statistics
Last synced: 5 months ago
JSON representation
Statistical causal discovery based on cyclic model
- Host: GitHub
- URL: https://github.com/inoueakimitsu/cyclicmodel
- Owner: inoueakimitsu
- License: mit
- Created: 2018-06-14T00:06:19.000Z (about 8 years ago)
- Default Branch: master
- Last Pushed: 2018-06-14T13:27:51.000Z (about 8 years ago)
- Last Synced: 2025-05-07T09:13:57.572Z (about 1 year ago)
- Topics: causal-inference, data-science, probabilistic-programming, pymc3, statistics
- Language: Python
- Size: 14.6 KB
- Stars: 2
- Watchers: 1
- Forks: 1
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# cyclicmodel
[](https://circleci.com/gh/inoueakimitsu/cyclicmodel/tree/master)
Statistical causal discovery based on cyclic model.
This project is under development.
## Summary
Python package that performs statistical causal discovery
under the following condition:
1. there are unobserved common factors
2. two-way causal relationship exists
`cyclicmodel` has been developed based on
[`bmlingam`][4670f282], which implemented bayesian mixed LiNGAM.
[4670f282]: https://github.com/taku-y/bmlingam "bmlingam"
## Example
```Python
import numpy as np
import pymc3 as pm
import cyclicmodel as cym
# Generate synthetic data,
# which assumes causal relation from x1 to x2
n = 200
x1 = np.random.randn(n)
x2 = x1 + np.random.uniform(low=-0.5, high=0.5, size=n)
xs = np.vstack([x1, x2]).T
# Model settings
hyper_params = cym.define_model.CyclicModelParams(
dist_std_noise='log_normal',
df_indvdl=8.0,
dist_l_cov_21='uniform, -0.9, 0.9',
dist_scale_indvdl='uniform, 0.1, 1.0',
dist_beta_noise='uniform, 0.5, 6.0')
# Generate PyMC3 model
model = cym.define_model.get_pm3_model(xs, hyper_params, verbose=10)
# Run variational inference with PyMC3
with model:
fit = pm.FullRankADVI().fit(n=100000)
trace = fit.sample(1000, include_transformed=True)
# Check the posterior mean of the coefficients
print(np.mean(trace['b_21'])) # from x1 to x2
print(np.mean(trace['b_12'])) # from x2 to x1
```
## Installation
```bash
pip install cyclicmodel
```
## References
- [LiNGAM - Discovery of non-gaussian linear causal models](https://sites.google.com/site/sshimizu06/lingam)
- [Shimizu, S., & Bollen, K. (2014). Bayesian estimation of causal direction in acyclic structural equation models with individual-specific confounder variables and non-Gaussian distributions. Journal of Machine Learning Research, 15(1), 2629-2652.](http://jmlr.org/papers/volume15/shimizu14a/shimizu14a.pdf)