https://github.com/uio-bmi/dagsim
A framework and specification language for simulating data based on graphical models
https://github.com/uio-bmi/dagsim
bayesian-network causal-models directed-acyclic-graph python simulation
Last synced: 8 days ago
JSON representation
A framework and specification language for simulating data based on graphical models
- Host: GitHub
- URL: https://github.com/uio-bmi/dagsim
- Owner: uio-bmi
- License: agpl-3.0
- Created: 2021-04-22T17:42:52.000Z (almost 5 years ago)
- Default Branch: main
- Last Pushed: 2025-05-02T07:43:20.000Z (9 months ago)
- Last Synced: 2025-12-08T17:19:02.001Z (about 1 month ago)
- Topics: bayesian-network, causal-models, directed-acyclic-graph, python, simulation
- Language: Python
- Homepage: https://uio-bmi.github.io/dagsim/
- Size: 6.49 MB
- Stars: 19
- Watchers: 4
- Forks: 3
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# DagSim
[](https://mybinder.org/v2/gh/uio-bmi/dagsim/main?labpath=tutorials%2Fhello_world.ipynb)
DagSim is a Python-based framework and specification language for simulating data based on a Directed Acyclic Graph (
DAG) structure, without any constraints on variable types or functional relations. A succinct YAML format for
defining the structure of the simulation model promotes transparency, while separate user-provided functions for
generating each variable based on its parents ensure the modularization of the simulation code.
Link to the paper: https://journals.plos.org/plosone/article?id=10.1371/journal.pone.0284443
## Installation
DagSim can be easily installed using pip.
### Installing DagSim using [pip](https://pypi.org/project/dagsim/)
To install the DagSim package using `pip`, run:
```bash
pip install dagsim
```
#### Quickstart
To check that DagSim is installed properly, run the following command in the console/terminal:
```bash
dagsim-quickstart
```
#### Installing graphviz
If you use `pip`, you need to install graphviz on the system level in order to use the drawing functionality in DagSim.
Please follow the instrcutions [here](https://graphviz.org/download/) on how to install graphviz depending on the
operating system.
[//]: # (### Installing DagSim using conda)
[//]: # (To install the DagSim package using `conda`, run:)
[//]: # (```bash)
[//]: # (conda install dagsim)
[//]: # (```)
[//]: # (With `conda`, graphviz is automatically installed, both, as a python package and at the system level.)
## Simple example
### Python code
Suppose we are interested in simulating two variables, X and Y, where X follows a standard Gaussian distribution, and Y
is the square of X.
For each node we need a function to simulate the node's values:
- For X, we can use the `numpy.random.normal` function
- For Y, we can use either `numpy.power` or define our own function. We will use the second to illustrate how one can
use
user-define functions.
```python
# needed imports
import dagsim.base as ds
import numpy as np
```
Here, we define our own `square` function:
```python
def square(arg):
return arg * arg
```
Then, we define the nodes in our graph/model by giving each node a name, the function to use in order to evaluate its
value, and the arguments of the function, if any:
```python
X = ds.Node(name="X", function=np.random.normal)
Y = ds.Node(name="Y", function=square, kwargs={"arg": X})
```
After that, we define the graph itself by giving it a name (optional) and a list of all the nodes to be included:
```python
graph = ds.Graph(name="demo_graph", list_nodes=[X, Y])
```
If you wish, you can draw the graph by calling the `draw` method, as follows:
```python
graph.draw()
```
Finally, we simulate data from this graph by calling the `simulate` method, and giving it the number of samples you
want to simulate, and a name for the csv_file (optional) where the data should be saved.
```python
data = graph.simulate(num_samples=10, csv_name="demo_data")
```
Here, `data` would be a dictionary with keys being the names of the nodes in the graph, and the corresponding values
being the simulated values for each node returned as a Python `list`.
For more detailed instructions, check
this [page](https://uio-bmi.github.io/dagsim/specify_with_code.html#how-to-specify-a-simulation-using-python-code), and
for other simple examples, please refer to the `tutorials` folder.
### YAML Specification
dagsim also allows the specification of a simulation using a YAML file. You can run dagsim on a YAML file by running:
```shell
dagsim path/to/yaml/file [-v|--verbose] [-d|--draw] [-o output/path|--output_path=output/path]
```
For a tutorial on using a YAMl file for simulation, check
this [page](https://uio-bmi.github.io/dagsim/specify_with_code.html#how-to-specify-a-simulation-using-yaml).