causalDiscovery

dagdiscovery

##set_causaldiscovery

Description

L'action dagdiscovery permet d'effectuer l'apprentissage de la structure d'un graphe orienté acyclique (DAG) à partir de vos données, une étape cruciale de l'inférence causaleGemini said

L’inférence causale est une méthode statistique mesurant l’effet réel d’une variable sur une autre en isolant les corrélations trompeuses, afin d’établir des liens de cause à effet directs.
. Contrairement aux simples corrélations, cet outil tente de déduire la directionnalité des relations (qui cause quoi) en utilisant des algorithmes avancés comme TOP ou MCV. C'est l'outil parfait pour transformer le fameux adage 'corrélation n'est pas causalité' en un véritable modèleReprésentation mathématique entraînée sur des données pour capturer des tendances, prédire des résultats ou classifier des observations via des algorithmes (Régression, Forêt aléatoire, Gradient Boosting). mathématique ! Retrouvez tous les détails dans la documentation officielle.

Syntaxe Officielle
proc cas;
causalDiscovery.dagdiscovery /
algorithm="MCV" | "TOP"
alphas={double-1, ...}
gpu=TRUE | FALSE
initMethod="DATA" | "RANDOM" | "VARIANCE"
maxIter=integer
out={name="table-name"}
outDag={name="table-name"}
outIterHist={name="table-name"}
outPath={name="table-name"}
parallel=TRUE | FALSE
seed=integer
table={name="table-name", caslib="string"}
vars={"var-1", "var-2", ...};
quit;

Paramètres Clés

Nom du paramètre Description
table Spécifie la table de données d'entrée contenant vos observations (paramètre obligatoire).
vars La liste des variables à inclure dans le réseau causal (paramètre obligatoire).
algorithm L'algorithme utilisé pour l'apprentissage du DAG : 'TOP' (Topological Order Permutation, par défaut) ou 'MCV' (Minimizing Conditional Variance).
alphas Liste des seuils de significativité (p-values) pour sélectionner les parents ou arêtes. Plusieurs valeurs génèrent plusieurs DAGs.
gpu Active l'utilisation de la carte graphique (GPU) si disponible, pour des calculs ultra-rapides.
initMethod Définit l'ordre topologique de départ : 'VARIANCE' (par défaut), 'DATA' ou 'RANDOM'.
maxIter Le nombre maximum d'itérations pour explorer l'espace des solutions (par défaut 200). Attention aux temps de calcul !
out Table de sortie contenant l'ordre topologique final et les estimations des paramètres du modèle.
outDag Table de sortie qui stocke la structure brute du Graphe Orienté Acyclique (les liens détectés).
outIterHist Table contenant l'historique complet des itérations de l'algorithme.
outPath Table qui liste les relations de parenté, les enfants et les chemins de causalité.
parallel Permet le multithreading pour booster la recherche (activé par défaut).
seed La graine aléatoire pour garantir la reproductibilité (car on aime les découvertes, mais pas dans nos tests de validation !).

Préparation des données

Simulation d'un écosystème de relations causales

Nous créons ici un jeu de données où la chaîne de causalité est explicitement connue : X influence Y, et Y influence Z.

1DATA casuser.causal_data;
2 call streaminit(42);
3 DO i = 1 to 2000;
4 X = rand('normal');
5 Y = 2.5 * X + rand('normal');
6 Z = -1.2 * Y + rand('normal');
7 OUTPUT;
8 END;
9RUN;

Exemples d'utilisation

Apprentissage d'un DAG de base

Exécution classique avec l'algorithme TOP par défaut pour extraire la structure causale sous forme de table.

1PROC CAS;
2 causalDiscovery.dagdiscovery /
3 TABLE={name='causal_data', caslib='casuser'}
4 vars={'X', 'Y', 'Z'}
5 outDag={name='my_dag', caslib='casuser', replace=true};
6QUIT;
Résultat Attendu :
Une nouvelle table 'my_dag' est créée, affichant très probablement la séquence causale attendue (X -> Y -> Z).
Recherche causale exhaustive et paramétrée

Une analyse plus robuste exploitant l'algorithme MCV, la parallélisation, des seuils d'alpha multiples et exportant l'intégralité des rapports d'analyse possibles.

1PROC CAS;
2 causalDiscovery.dagdiscovery /
3 TABLE={name='causal_data', caslib='casuser'}
4 vars={'X', 'Y', 'Z'}
5 algorithm='MCV'
6 initMethod='VARIANCE'
7 alphas={0.05, 0.01}
8 maxIter=500
9 parallel=true
10 seed=12345
11 out={name='dag_stats', replace=true}
12 outDag={name='dag_structure', replace=true}
13 outIterHist={name='dag_history', replace=true}
14 outPath={name='dag_paths', replace=true};
15QUIT;
Résultat Attendu :
Le processus s'exécute en multithread et produit quatre tables distinctes fournissant le graphe, l'historique d'apprentissage, l'estimation des paramètres et l'ensemble des chemins causaux (pour les deux niveaux d'alpha).