/****************************************************************************** * Programme : Procedimiento CAEFFECT: Estimación por Ajuste de Regresión * Reference : PROCEDF6D0 * Source : https://www.wearecas.eu/en/sampleCode/PROCEDF6D0 ******************************************************************************/ /* --- BLOC 1 --- */ /* --- Configuration de la session CAS et de la bibliothèque --- */ proc cas; session casauto; /* Crée une bibliothèque CAS temporaire 'mylib' si elle n'existe pas */ if not caslibexists('mylib') then do; caslib mylib datasource=(path='/tmp/') global; end; quit; /* --- Données synthétiques pour la démonstration (SAS Data Step local) --- */ data work.birthwgt_synth_local; input Smoking $ AgeGroup $ Married $ Drinking $ SomeCollege $ Death $; datalines; Yes '1' Yes No Yes No No '1' No No No No Yes '2' Yes Yes Yes Yes No '2' Yes No No No Yes '3' No Yes No No No '3' No No Yes No Yes '1' Yes No Yes No No '1' No No No No Yes '2' Yes Yes Yes Yes No '2' Yes No No No Yes '3' No Yes No No No '3' No No Yes No ; run; proc cas; session casauto; /* Charge les données synthétiques de la session SAS locale (WORK) vers la session CAS (mylib) */ upload caslib="mylib" data="work.birthwgt_synth_local" casout="birthwgt_synth" promote; quit; /* Les exemples suivants utiliseront 'mylib.birthwgt_synth' */ /* --- BLOC 2 --- */ /* --- Étape 1 : Entraîner un modèle GRADBOOST et le sauvegarder --- */ proc gradboost data=mylib.birthwgt_synth ntrees=10 seed=12345; target Death / level=nominal; input Smoking AgeGroup Married Drinking SomeCollege / level=nominal; savestate rstore=mylib.gbOutMod_ex1; run; /* --- Étape 2 : Exécuter PROC CAEFFECT avec le modèle restauré --- */ proc caeffect data=mylib.birthwgt_synth; treatvar Smoking; outcomevar Death(event='Yes') / type=Categorical; outcomemodel restore=mylib.gbOutMod_ex1 predname=P_DeathYes; pom treatlev='Yes'; pom treatlev='No'; run; /* --- Nettoyage de l'analytic store --- */ proc astore; delete rstore=mylib.gbOutMod_ex1; quit; /* --- BLOC 3 --- */ /* --- Étape 1 : Entraîner un modèle GRADBOOST et le sauvegarder --- */ proc gradboost data=mylib.birthwgt_synth ntrees=20 seed=54321; /* Plus d'arbres pour l'exemple */ target Death / level=nominal; input Smoking AgeGroup Married Drinking SomeCollege / level=nominal; savestate rstore=mylib.gbOutMod_ex2; run; /* --- Étape 2 : Exécuter PROC CAEFFECT avec des options supplémentaires --- */ proc caeffect data=mylib.birthwgt_synth; treatvar Smoking; outcomevar Death(event='Yes') / type=Categorical; outcomemodel restore=mylib.gbOutMod_ex2 predname=P_DeathYes; pom treatlev='Yes'; pom treatlev='No'; /* Spécification explicite des variables d'ajustement (confounding variables) */ adjust AgeGroup Married Drinking SomeCollege; /* Sauvegarde des statistiques d'estimation dans une table CAS */ outstat mylib.caeffect_stats_ex2; run; /* --- Afficher les résultats sauvegardés --- */ proc print data=mylib.caeffect_stats_ex2; run; /* --- Nettoyage --- */ proc astore; delete rstore=mylib.gbOutMod_ex2; quit; proc cas; droptable "caeffect_stats_ex2" incaslib="mylib"; quit; /* --- BLOC 4 --- */ /* --- Étape 1 : Entraîner un modèle GRADBOOST et le sauvegarder --- */ proc gradboost data=mylib.birthwgt_synth ntrees=15 seed=67890; target Death / level=nominal; input Smoking AgeGroup Married Drinking SomeCollege / level=nominal; savestate rstore=mylib.gbOutMod_ex3; run; /* --- Étape 2 : Calculer les prédictions contrefactuelles pour Smoking='Yes' --- */ data mylib.gbPredData_temp; set mylib.birthwgt_synth; tempSmoking = Smoking; /* Sauvegarde la valeur observée de Smoking */ Smoking = 'Yes'; /* Impose 'Yes' pour la prédiction contrefactuelle */ run; proc astore; score data=mylib.gbPredData_temp out=mylib.gbPredData_temp_scored_yes rstore=mylib.gbOutMod_ex3 copyvars=(tempSmoking AgeGroup Married Drinking SomeCollege Death); run; /* --- Étape 3 : Calculer les prédictions contrefactuelles pour Smoking='No' --- */ data mylib.gbPredData_final; set mylib.gbPredData_temp_scored_yes; rename P_DeathYes = Pred_DeathYes_SmokingYes; /* Renomme la première prédiction */ Smoking = 'No'; /* Impose 'No' pour la deuxième prédiction contrefactuelle */ run; proc astore; score data=mylib.gbPredData_final out=mylib.gbPredData_final_scored rstore=mylib.gbOutMod_ex3 copyvars=(tempSmoking Pred_DeathYes_SmokingYes Death); run; /* --- Étape 4 : Nettoyage et préparation des données finales pour CAEFFECT --- */ data mylib.gbPredData_final_scored; set mylib.gbPredData_final_scored; rename P_DeathYes = Pred_DeathYes_SmokingNo; Smoking=tempSmoking; /* Restaure la variable Smoking observée */ drop tempSmoking; run; /* --- Étape 5 : Exécuter PROC CAEFFECT avec les prédictions précalculées --- */ proc caeffect data=mylib.gbPredData_final_scored; treatvar Smoking; outcomevar Death(event='Yes') / type=Categorical; pom treatlev='Yes' predOut=Pred_DeathYes_SmokingYes; pom treatlev='No' predOut=Pred_DeathYes_SmokingNo; run; /* --- Nettoyage --- */ proc astore; delete rstore=mylib.gbOutMod_ex3; quit; proc cas; droptable "gbPredData_temp" incaslib="mylib"; droptable "gbPredData_temp_scored_yes" incaslib="mylib"; droptable "gbPredData_final" incaslib="mylib"; droptable "gbPredData_final_scored" incaslib="mylib"; quit; /* --- BLOC 5 --- */ /* --- Étape 1 : Estimer les scores de propension avec PROC LOGSELECT --- */ /* Pour la méthode IPW, nous modélisons la probabilité de recevoir le traitement (Smoking) */ proc logselect data=mylib.birthwgt_synth; model Smoking = AgeGroup Married Drinking SomeCollege; output out=mylib.propensity_scores pred=Propensity; run; /* --- Étape 2 : Exécuter PROC CAEFFECT avec la méthode IPW --- */ proc caeffect data=mylib.propensity_scores; treatvar Smoking; outcomevar Death(event='Yes') / type=Categorical; outcomemodel propensity=Propensity; /* Utilise les scores de propension prédits */ pom treatlev='Yes'; pom treatlev='No'; method ipw; /* Spécifie la méthode IPW */ run; /* --- Nettoyage --- */ proc cas; droptable "propensity_scores" incaslib="mylib"; quit;