Publié le :
Statistique CREATION_INTERNE

Estimation des effets causaux par méthodes doublement robustes avec PROC CAEFFECT

Ce code est également disponible en : Deutsch English
En attente de validation
Ce document décrit l'application des méthodes doublement robustes (AIPW et TMLE) via la procédure CAEFFECT. Ces méthodes sont particulièrement utiles car elles restent cohérentes si le modèle de traitement ou le modèle de résultat est correctement spécifié (mais pas nécessairement les deux). L'exemple utilise `PROC LOGSELECT` pour modéliser la probabilité d'un traitement (ici, l'arrêt du tabac) et `PROC BART` pour modéliser le résultat (le changement de poids). Les prédictions de ces modèles intermédiaires (`pTrt`, `pCnt`, `P_Change`) sont ensuite utilisées comme intrants pour la procédure `CAEFFECT`. La procédure CAEFFECT estime les moyennes des résultats potentiels (POM) pour différents niveaux de traitement et calcule la différence entre ces POM pour estimer l'effet moyen du traitement (ATE). Cette approche est robuste aux erreurs de spécification dans l'un des deux modèles.
Analyse des données

Type : CREATION_INTERNE


Les exemples utilisent des données synthétiques générées par un `DATA step` avec `datalines` afin de garantir leur autonomie. Une table `SmokingWeight` est créée en session CAS.

1 Bloc de code
PROC CAEFFECT Data
Explication :
Cet exemple illustre l'estimation basique des effets causaux en utilisant la méthode AIPW (Augmented Inverse Probability Weighting).
1. **Préparation des données:** Une table `mylib.SmokingWeight` est créée en session CAS avec des données synthétiques.
2. **Modèle de traitement:** `PROC LOGSELECT` est utilisée pour modéliser la probabilité d'arrêter de fumer (`Quit=1`) en fonction des covariables, générant la probabilité `pTrt` et `pCnt` (probabilité de ne pas arrêter).
3. **Modèle de résultat:** `PROC BART` (Bayesian Additive Regression Trees) est exécutée pour modéliser le changement de poids (`Change`) en fonction des covariables et du statut de tabagisme (`Quit`), et le modèle ajusté est sauvegardé dans `mylib.bartOutMod`.
4. **PROC CAEFFECT:** La procédure `CAEFFECT` est ensuite appelée avec `METHOD=AIPW`, en spécifiant la variable de traitement (`Quit`), la variable de résultat (`Change`) et le modèle de résultat (`mylib.bartOutMod`). Les énoncés `POM` définissent les résultats potentiels pour chaque niveau de traitement (arrêter ou non) en utilisant les probabilités prédites. L'énoncé `DIFFERENCE` calcule la différence entre les moyennes des résultats potentiels.
Copié !
1/* Création d'une session CAS si elle n'existe pas */
2cas;
3 
4/* Assurez-vous que la caslib mylib est disponible et mappée */
5caslib _all_ assign;
6 
7/* Création de la table de données SmokingWeight */
8DATA mylib.SmokingWeight;
9 INFILE DATALINES;
10 INPUT Sex $ Race $ Education $ Exercise $ Activity $ Age YearsSmoke PerDay QUIT Change;
11 DATALINES;
12Female White HighSchool Light Active 30 10 15 0 2.5
13Male Black College Moderate Sedentary 45 20 20 1 5.0
14Female Asian GradSchool Heavy Active 55 30 25 1 7.2
15Male White HighSchool Light Sedentary 35 12 10 0 1.8
16Female Black College Moderate Active 40 18 18 1 4.5
17Male Asian GradSchool Heavy Sedentary 60 25 22 0 3.1
18Female White HighSchool Light Active 28 8 12 1 6.0
19Male Black College Moderate Sedentary 50 22 19 0 2.0
20Female Asian GradSchool Heavy Active 48 28 24 1 8.0
21Male White HighSchool Light Sedentary 32 10 11 0 1.5
22;
23RUN;
24 
25/* 1. Modélisation de la variable de traitement 'Quit' avec PROC LOGSELECT */
26PROC LOGSELECT DATA=mylib.SmokingWeight;
27 class Sex Race Education Exercise Activity;
28 model QUIT(Event='1') = Sex Race Education
29 Exercise Activity Age YearsSmoke PerDay;
30 OUTPUT out=mylib.swDREstData pred=pTrt copyvars=(_ALL_);
31RUN;
32 
33/* Calcul de la probabilité de la condition de contrôle (Quit=0) */
34DATA mylib.swDREstData;
35 SET mylib.swDREstData;
36 pCnt = 1 - pTrt;
37RUN;
38 
39/* 2. Modélisation de la variable de résultat 'Change' avec PROC BART */
40PROC BART DATA=mylib.swDREstData nTree=100 nMC=200 seed=2156;
41 class Sex Race Education Exercise Activity QUIT;
42 model Change = Sex Race Education Exercise QUIT Activity
43 Age YearsSmoke PerDay;
44 store out=mylib.bartOutMod;
45RUN;
46 
47/* 3. Estimation des effets causaux avec PROC CAEFFECT (AIPW) */
48PROC CAEFFECT DATA=mylib.swDREstData method=aipw;
49 treatvar QUIT;
50 outcomevar Change;
51 outcomemodel restore=mylib.bartOutMod predName=P_Change;
52 pom treatLev=1 treatProb=pTrt;
53 pom treatLev=0 treatProb=pCnt;
54 difference evtLev=1;
55RUN;
56 
2 Bloc de code
PROC CAEFFECT Data
Explication :
Cet exemple démontre l'utilisation de la méthode TMLE (Targeted Maximum Likelihood Estimation), une alternative à l'AIPW, pour l'estimation des effets causaux.
1. **Préparation des données et modèles intermédiaires:** Les étapes de création de données, de modélisation du traitement avec `PROC LOGSELECT` et de modélisation du résultat avec `PROC BART` sont identiques à celles de l'Exemple 1.
2. **PROC CAEFFECT avec TMLE:** La seule différence est le paramètre `METHOD=tmle` dans l'énoncé `PROC CAEFFECT`. La méthode TMLE cible directement le paramètre d'intérêt (l'ATE) en ajustant de manière itérative les prédictions du modèle de résultat, ce qui peut améliorer la robustesse et l'efficacité de l'estimation par rapport à l'AIPW dans certains cas. Les résultats obtenus sont généralement très similaires à ceux de l'AIPW, comme le montre la documentation.
Copié !
1/* Création d'une session CAS si elle n'existe pas */
2cas;
3 
4/* Assurez-vous que la caslib mylib est disponible et mappée */
5caslib _all_ assign;
6 
7/* Création de la table de données SmokingWeight */
8DATA mylib.SmokingWeight;
9 INFILE DATALINES;
10 INPUT Sex $ Race $ Education $ Exercise $ Activity $ Age YearsSmoke PerDay QUIT Change;
11 DATALINES;
12Female White HighSchool Light Active 30 10 15 0 2.5
13Male Black College Moderate Sedentary 45 20 20 1 5.0
14Female Asian GradSchool Heavy Active 55 30 25 1 7.2
15Male White HighSchool Light Sedentary 35 12 10 0 1.8
16Female Black College Moderate Active 40 18 18 1 4.5
17Male Asian GradSchool Heavy Sedentary 60 25 22 0 3.1
18Female White HighSchool Light Active 28 8 12 1 6.0
19Male Black College Moderate Sedentary 50 22 19 0 2.0
20Female Asian GradSchool Heavy Active 48 28 24 1 8.0
21Male White HighSchool Light Sedentary 32 10 11 0 1.5
22;
23RUN;
24 
25/* 1. Modélisation de la variable de traitement 'Quit' avec PROC LOGSELECT */
26PROC LOGSELECT DATA=mylib.SmokingWeight;
27 class Sex Race Education Exercise Activity;
28 model QUIT(Event='1') = Sex Race Education
29 Exercise Activity Age YearsSmoke PerDay;
30 OUTPUT out=mylib.swDREstData pred=pTrt copyvars=(_ALL_);
31RUN;
32 
33/* Calcul de la probabilité de la condition de contrôle (Quit=0) */
34DATA mylib.swDREstData;
35 SET mylib.swDREstData;
36 pCnt = 1 - pTrt;
37RUN;
38 
39/* 2. Modélisation de la variable de résultat 'Change' avec PROC BART */
40PROC BART DATA=mylib.swDREstData nTree=100 nMC=200 seed=2156;
41 class Sex Race Education Exercise Activity QUIT;
42 model Change = Sex Race Education Exercise QUIT Activity
43 Age YearsSmoke PerDay;
44 store out=mylib.bartOutMod;
45RUN;
46 
47/* 3. Estimation des effets causaux avec PROC CAEFFECT (TMLE) */
48PROC CAEFFECT DATA=mylib.swDREstData method=tmle;
49 treatvar QUIT;
50 outcomevar Change;
51 outcomemodel restore=mylib.bartOutMod predName=P_Change;
52 pom treatLev=1 treatProb=pTrt;
53 pom treatLev=0 treatProb=pCnt;
54 difference evtLev=1;
55RUN;
56 
3 Bloc de code
PROC CAEFFECT Data
Explication :
Cet exemple avancé illustre une analyse par sous-groupe en utilisant la méthode AIPW et en sauvegardant les résultats dans des tables de sortie. L'objectif est de voir si l'effet du traitement (arrêter de fumer) sur le changement de poids varie selon le sexe.
1. **Préparation des données et modèles intermédiaires:** Les étapes sont les mêmes que les exemples précédents.
2. **Analyse par sous-groupe:** L'énoncé `CLASS Sex;` déclare la variable `Sex` comme variable de classification, et l'énoncé `BY Sex;` demande à `PROC CAEFFECT` de répéter l'analyse pour chaque niveau de `Sex` (Homme et Femme).
3. **Options de sortie:** Les énoncés `ODS OUTPUT` sont utilisés pour sauvegarder les tables d'estimations (`Estimates`) et de différences (`OutDiff`) générées par la procédure dans de nouvelles tables CAS (`mylib.aipwEstimates` et `mylib.aipwDifferences`). Cela permet une analyse plus poussée des résultats ou leur intégration dans d'autres rapports.
Copié !
1/* Création d'une session CAS si elle n'existe pas */
2cas;
3 
4/* Assurez-vous que la caslib mylib est disponible et mappée */
5caslib _all_ assign;
6 
7/* Création de la table de données SmokingWeight */
8DATA mylib.SmokingWeight;
9 INFILE DATALINES;
10 INPUT Sex $ Race $ Education $ Exercise $ Activity $ Age YearsSmoke PerDay QUIT Change;
11 DATALINES;
12Female White HighSchool Light Active 30 10 15 0 2.5
13Male Black College Moderate Sedentary 45 20 20 1 5.0
14Female Asian GradSchool Heavy Active 55 30 25 1 7.2
15Male White HighSchool Light Sedentary 35 12 10 0 1.8
16Female Black College Moderate Active 40 18 18 1 4.5
17Male Asian GradSchool Heavy Sedentary 60 25 22 0 3.1
18Female White HighSchool Light Active 28 8 12 1 6.0
19Male Black College Moderate Sedentary 50 22 19 0 2.0
20Female Asian GradSchool Heavy Active 48 28 24 1 8.0
21Male White HighSchool Light Sedentary 32 10 11 0 1.5
22;
23RUN;
24 
25/* 1. Modélisation de la variable de traitement 'Quit' avec PROC LOGSELECT */
26PROC LOGSELECT DATA=mylib.SmokingWeight;
27 class Sex Race Education Exercise Activity;
28 model QUIT(Event='1') = Sex Race Education
29 Exercise Activity Age YearsSmoke PerDay;
30 OUTPUT out=mylib.swDREstData pred=pTrt copyvars=(_ALL_);
31RUN;
32 
33/* Calcul de la probabilité de la condition de contrôle (Quit=0) */
34DATA mylib.swDREstData;
35 SET mylib.swDREstData;
36 pCnt = 1 - pTrt;
37RUN;
38 
39/* 2. Modélisation de la variable de résultat 'Change' avec PROC BART */
40PROC BART DATA=mylib.swDREstData nTree=100 nMC=200 seed=2156;
41 class Sex Race Education Exercise Activity QUIT;
42 model Change = Sex Race Education Exercise QUIT Activity
43 Age YearsSmoke PerDay;
44 store out=mylib.bartOutMod;
45RUN;
46 
47/* 3. Estimation des effets causaux avec PROC CAEFFECT (AIPW) par sous-groupe */
48PROC CAEFFECT DATA=mylib.swDREstData method=aipw;
49 class Sex; /* Ajout d'une variable de classification pour l'analyse par groupe */
50 treatvar QUIT;
51 outcomevar Change;
52 outcomemodel restore=mylib.bartOutMod predName=P_Change;
53 pom treatLev=1 treatProb=pTrt;
54 pom treatLev=0 treatProb=pCnt;
55 difference evtLev=1;
56 BY Sex; /* Analyse séparée par le sexe */
57 ods OUTPUT Estimates=mylib.aipwEstimates OutDiff=mylib.aipwDifferences; /* Sauvegarde des résultats */
58RUN;
59 
4 Bloc de code
PROC CAEFFECT Data
Explication :
Cet exemple met l'accent sur l'intégration et l'optimisation pour les environnements SAS Viya/CAS, en particulier pour les grands ensembles de données, en utilisant la méthode TMLE.
1. **Gestion de session CAS et nettoyage:** Les commandes `cas;` et `caslib _all_ assign;` garantissent que la session CAS est active et que la caslib est mappée. `PROC CASUTIL` est utilisée pour nettoyer les tables CAS résiduelles avant la création de nouvelles données.
2. **Génération de données à grande échelle:** Une table `mylib.SmokingWeight` avec 10 000 observations est générée pour simuler un grand ensemble de données, en utilisant `promote=yes` pour assurer qu'elle soit une table CAS.
3. **Optimisation des procédures:** Pour `PROC LOGSELECT` et `PROC BART`, des paramètres comme `nthreads` (pour `LOGSELECT`) sont utilisés pour tirer parti du traitement parallèle de CAS. Le nombre d'arbres (`nTree`) et d'itérations Monte Carlo (`nMC`) pour `BART` est augmenté pour refléter un modèle plus robuste sur des données plus volumineuses.
4. **PROC CAEFFECT:** La procédure `CAEFFECT` est ensuite exécutée avec `METHOD=TMLE`, démontrant son applicabilité et sa performance sur de plus grands volumes de données dans l'environnement CAS.
Copié !
1/* Création d'une session CAS si elle n'existe pas */
2cas;
3 
4/* Assurez-vous que la caslib mylib est disponible et mappée */
5caslib _all_ assign;
6 
7/* Nettoyage des tables existantes pour s'assurer d'un redémarrage propre */
8PROC CASUTIL;
9 droptable casdata='SmokingWeight' incaslib='mylib' quiet;
10 droptable casdata='swDREstData' incaslib='mylib' quiet;
11 droptable casdata='bartOutMod' incaslib='mylib' quiet;
12RUN;
13 
14/* Création d'un ensemble de données plus grand simulé */
15DATA mylib.SmokingWeight(promote=yes);
16 array char_vars Sex $ Race $ Education $ Exercise $ Activity $;
17 DO i = 1 to 10000; /* Simule 10000 observations */
18 call streaminit(12345 + i);
19 DO _n_ = 1 to dim(char_vars);
20 char_vars(_n_) = ranword(char_vars(_n_)); /* Générer des valeurs de caractères aléatoires */
21 END;
22 
23 IF rand('UNIFORM') < 0.5 THEN Sex = 'Female'; ELSE Sex = 'Male';
24 IF rand('UNIFORM') < 0.7 THEN Race = 'White'; ELSE Race = 'Black';
25 IF rand('UNIFORM') < 0.6 THEN Education = 'HighSchool'; ELSE Education = 'College';
26 IF rand('UNIFORM') < 0.5 THEN Exercise = 'Light'; ELSE Exercise = 'Moderate';
27 IF rand('UNIFORM') < 0.5 THEN Activity = 'Active'; ELSE Activity = 'Sedentary';
28 Age = round(rand('NORMAL', 40, 10));
29 YearsSmoke = round(rand('NORMAL', 15, 5));
30 PerDay = round(rand('NORMAL', 15, 5));
31 IF rand('UNIFORM') < 0.5 THEN QUIT = 0; ELSE QUIT = 1;
32 Change = rand('NORMAL', 3, 1.5) + (QUIT * rand('NORMAL', 2, 0.5)) - (PerDay * 0.1);
33 OUTPUT;
34 END;
35 drop i;
36 label QUIT = "Arrêt du Tabac (0=Non, 1=Oui)";
37 label Change = "Changement de Poids (kg)";
38RUN;
39 
40/* 1. Modélisation de la variable de traitement 'Quit' avec PROC LOGSELECT */
41/* Utilisation de l'option NTHREADS pour le parallélisme en CAS */
42PROC LOGSELECT DATA=mylib.SmokingWeight nthreads=4;
43 class Sex Race Education Exercise Activity;
44 model QUIT(Event='1') = Sex Race Education
45 Exercise Activity Age YearsSmoke PerDay;
46 OUTPUT out=mylib.swDREstData pred=pTrt copyvars=(_ALL_);
47RUN;
48 
49/* Calcul de la probabilité de la condition de contrôle (Quit=0) */
50DATA mylib.swDREstData;
51 SET mylib.swDREstData;
52 pCnt = 1 - pTrt;
53RUN;
54 
55/* 2. Modélisation de la variable de résultat 'Change' avec PROC BART */
56/* Utilisation d'un Ntree et Nmc appropriés pour de grands jeux de données */
57PROC BART DATA=mylib.swDREstData nTree=200 nMC=500 seed=2156;
58 class Sex Race Education Exercise Activity QUIT;
59 model Change = Sex Race Education Exercise QUIT Activity
60 Age YearsSmoke PerDay;
61 store out=mylib.bartOutMod;
62RUN;
63 
64/* 3. Estimation des effets causaux avec PROC CAEFFECT (TMLE) pour grands ensembles de données */
65PROC CAEFFECT DATA=mylib.swDREstData method=tmle;
66 treatvar QUIT;
67 outcomevar Change;
68 outcomemodel restore=mylib.bartOutMod predName=P_Change;
69 pom treatLev=1 treatProb=pTrt;
70 pom treatLev=0 treatProb=pCnt;
71 difference evtLev=1;
72RUN;
73 
Ce matériel est fourni "tel quel" par We Are Cas. Il n'y a aucune garantie, expresse ou implicite, quant à la qualité marchande ou à l'adéquation à un usage particulier concernant le matériel ou le code contenu dans les présentes. We Are Cas n'est pas responsable des erreurs dans ce matériel tel qu'il existe maintenant ou existera, et We Are Cas ne fournit pas de support technique pour celui-ci.
Informations de Copyright : Copyright © SAS Institute Inc. All Rights Reserved