causalDiscovery

dagsimulate

##set_causaldiscovery

Description

L'action `dagsimulate` permet de simuler un graphe orienté acyclique (DAG - Directed Acyclic Graph) ainsi que les données associées. C'est l'outil parfait pour générer des données synthétiques afin de tester vos algorithmes de découverte causale sans risquer de casser des données réelles (pas de panique, c'est juste de la simulation !). Vous pouvez contrôler précisément le nombre d'observations, le nombre d'arêtes, les distributions de bruit , et la génération des paramètres .

Syntaxe Officielle
proc cas;
causalDiscovery.dagsimulate /
nEdges=entier,
nObs=entier,
noise={dist={mean=double, std=double, type="GAUSSIAN", var=double}},
out={name="nom_table"},
outData={name="nom_table"},
outOrder={name="nom_table"},
outParm={name="nom_table"},
parm={dist={excllb=double, exclub=double, lb=double, type="UNIFORM", ub=double}},
seed=entier,
vars={"var1", "var2", ...};
run;

Paramètres Clés

Nom du paramètre Description
vars (Obligatoire) Liste des variables d'entrée simulées (ex: {"x1", "x2"}). (Alias: inputs)
nEdges Spécifie le nombre d'arêtes (liens) du graphe. Par défaut 0. (Alias: e)
nObs Spécifie la taille de l'échantillon, soit le nombre d'observations à simuler. Par défaut 10000. (Alias: n, sampleSize)
seed Graine pour le générateur de nombres aléatoires. Par défaut 1. Très utile pour la reproductibilité !
noise Définit la distribution du bruit. Comprend un sous-paramètre `dist` où l'on précise `type` (ex: GAUSSIAN), `mean`, `std` ou `var`.
parm Détermine comment les valeurs des paramètres des arêtes sont générées (ex: distribution UNIFORM avec bornes `lb` et `ub`, et une zone d'exclusion entre `excllb` et `exclub`).
out, outData, outOrder, outParm Noms des tables CAS de sortie contenant respectivement la matrice d'adjacence du DAG, les données brutes simulées, l'ordre topologique et les valeurs des paramètres générés.

Préparation des données

Préparation de la session (Rien à charger en entrée !)

Puisque cette action génère elle-même les données, vous n'avez pas besoin de charger une table source. Nous allons juste initialiser la session CAS.

1cas mysess;
2caslib _all_ assign;

Exemples d'utilisation

Génération basique d'un DAG

Créons un simple graphe acyclique dirigé avec 4 variables, 3 arêtes et 5000 observations. Les tables de sortie contiendront la matrice d'adjacence et les données générées.

1PROC CAS;
2 causalDiscovery.dagsimulate /
3 vars={"x1", "x2", "x3", "x4"}
4 nEdges=3
5 nObs=5000
6 seed=12345
7 out={name="sim_dag", replace=true}
8 outData={name="sim_data", replace=true};
9RUN;
10QUIT;
Résultat Attendu :
L'action crée deux tables en mémoire : `sim_dag` détaillant la structure du réseau causal, et `sim_data` contenant les 5000 lignes générées pour les variables x1 à x4.
Simulation avancée avec contrôle complet

Poussons la simulation plus loin en ajustant la distribution du bruit gaussien (moyenne et écart-type) et la distribution uniforme des paramètres pour générer un jeu de données robuste, parfait pour tester un modèle complexe.

1PROC CAS;
2 causalDiscovery.dagsimulate /
3 vars={"v1", "v2", "v3", "v4", "v5"}
4 nEdges=6
5 nObs=20000
6 seed=42
7 noise={dist={type="GAUSSIAN", mean=0, std=1.5}}
8 parm={dist={type="UNIFORM", lb=-2.0, ub=2.0, excllb=-0.1, exclub=0.1}}
9 out={name="adv_dag", replace=true}
10 outData={name="adv_data", replace=true}
11 outOrder={name="adv_order", replace=true}
12 outParm={name="adv_parm", replace=true};
13RUN;
14QUIT;
Résultat Attendu :
Quatre tables CAS sont créées, détaillant la structure du graphe (`adv_dag`), les données massives avec le bruit spécifié (`adv_data`), l'ordre topologique des nœuds (`adv_order`) et la matrice exacte des paramètres (`adv_parm`).