Automatiser la comparaison de modèles SAS : Macros et Test F avec PROC GLM

Ce code est également disponible en : Deutsch English Español
Niveau de difficulté
Expert
Publié le :
Simon

Le Conseil de l'Expert

Simon
Expert SAS et fondateur.

L'un des piliers de la modélisation statistique est la capacité à justifier la complexité d'un modèle : une variable supplémentaire apporte-t-elle une amélioration significative ou n'est-elle que du bruit ? Ce script illustre parfaitement comment transformer cette question théorique en un processus industriel robuste grâce au langage macro de SAS.

Pourquoi cette approche est-elle celle d'un expert ?
L'élégance de cette solution repose sur l'extraction et le retraitement intelligent des statistiques de la PROC GLM :

Exploitation de la table OUTSTAT : Au lieu de lire manuellement des rapports, le script utilise les statistiques de sortie pour isoler les sommes des carrés (SS) et les degrés de liberté (df). C'est la base de tout système de reporting automatisé fiable.

Calcul dynamique du Test F : La macro %hw6problem2 ne se contente pas d'ajuster des modèles ; elle recrée mathématiquement le test de Fisher pour modèles imbriqués (Nested Models). L'usage de la fonction lag() pour comparer le modèle complet au modèle réduit au sein d'une étape DATA est une technique avancée qui garantit une comparaison rigoureuse.

Modularité et Portabilité : En encapsulant la logique dans des macros imbriquées, le code devient agnostique vis-à-vis des données. Vous pouvez tester des dizaines de combinaisons de variables simplement en changeant les paramètres d'appel, tout en générant un rapport PDF structuré.

Le script commence par créer un jeu de données 'comp2010' à partir de données en ligne (datalines/cards), en calculant des variables supplémentaires. Ensuite, il définit une macro `%hw6problem1` qui encapsule la procédure `PROC GLM` pour ajuster un modèle de régression linéaire. Une seconde macro, `%hw6problem2`, utilise la première pour ajuster deux modèles (un complet et un réduit), combine leurs statistiques de sortie, et calcule manuellement un test F pour comparer les deux modèles. Enfin, le script exécute cette comparaison de modèles à deux reprises avec des configurations différentes et génère un rapport PDF.
Analyse des données

Type : CREATION_INTERNE


Le jeu de données 'comp2010' est créé directement dans le code à l'aide d'une étape DATA avec une instruction 'cards' pour l'entrée des données.

1 Bloc de code
ODS
Explication :
Ouvre une destination ODS pour générer un fichier de sortie au format PDF.
Copié !
1ods pdf file="HW6NickLipanovich.pdf";
2 Bloc de code
DATA STEP Data
Explication :
Crée la table 'comp2010'. Lit les trois variables 'winper', 'score', et 'save' à partir des données en ligne (cards) et calcule trois variables supplémentaires : 'save2', 'scoresave', et 'differential'.
Copié !
1DATA comp2010;
2INPUT winper score save;
3 save2=save*save;
4 scoresave = score+save;
5 differential = 100*(save-(1-score));
6CARDS;
70.661016949 0.409090909 0.706730769
80.631578947 0.369158879 0.720379147
90.571428571 0.317596567 0.729613734
100.593220339 0.352040816 0.712871287
110.615384615 0.365714286 0.729885057
120.596153846 0.359605911 0.694581281
130.517241379 0.339622642 0.690821256
140.576923077 0.340909091 0.714285714
150.568627451 0.365979381 0.680412371
160.5625 0.388571429 0.649122807
170.519230769 0.349726776 0.650793651
180.465517241 0.256281407 0.705882353
190.446428571 0.293532338 0.668367347
200.568181818 0.404580153 0.65942029
210.510638298 0.315068493 0.68627451
220.436363636 0.308080808 0.663212435
230.442307692 0.337423313 0.62962963
240.5 0.283950617 0.707006369
250.55 0.324675325 0.70625
260.44 0.345945946 0.60989011
270.456521739 0.365853659 0.628930818
280.416666667 0.259259259 0.680851064
290.434782609 0.305389222 0.650887574
300.434782609 0.337423313 0.625
310.358490566 0.234972678 0.653631285
320.386363636 0.309859155 0.582733813
330.457142857 0.345132743 0.617391304
340.365853659 0.311258278 0.623287671
350.365853659 0.27480916 0.603053435
360.378378378 0.307692308 0.580357143
37;
38RUN;
3 Bloc de code
PROC PRINT
Explication :
Affiche le contenu de la table 'comp2010' dans la sortie de résultats.
Copié !
1PROC PRINT DATA=comp2010;
2RUN;
3QUIT;
4 Bloc de code
MACRO
Explication :
Définit une macro `%hw6problem1` qui exécute la procédure GLM (General Linear Model). La macro ajuste un modèle ('model') pour une variable dépendante ('outcome') en fonction de prédicteurs ('modelx'). Elle peut optionnellement inclure une variable de classification ('classx'). Les statistiques du modèle sont sauvegardées dans une table de sortie ('myoutstat').
Copié !
1%macro hw6problem1 (outcome,classx,modelx,myoutstat,indata);
2 %IF &classx=' ' %THEN
3 %DO;
4 PROC GLM noprint DATA=&indata outstat=&myoutstat;
5 model &outcome = &modelx;
6 RUN;
7 QUIT;
8 %END;
9 %ELSE
10 %DO;
11 PROC GLM noprint DATA=&indata outstat=&myoutstat;
12 class &classx;
13 model &outcome = &modelx;
14 RUN;
15 QUIT;
16 %END;
17 
18%mend;
5 Bloc de code
MACRO Data
Explication :
Définit une macro `%hw6problem2` pour comparer deux modèles (un complet et un réduit). Elle appelle deux fois la macro `%hw6problem1` pour ajuster chaque modèle. Ensuite, via des étapes DATA, elle combine les résultats, calcule la statistique du test F et la p-valeur associée pour évaluer si le modèle complet est significativement meilleur que le modèle réduit. Le résultat du test F est ensuite affiché.
Copié !
1%macro hw6problem2 (outcome,classx1,classx2,modelx1,modelx2,myoutstat1,myoutstat2,indata);
2 %hw6problem1 (&outcome,&classx1,&modelx1,&myoutstat1,&indata);
3 %hw6problem1 (&outcome,&classx2,&modelx2,&myoutstat2,&indata);
4 DATA fullvsreduced;
5 SET &myoutstat1 &myoutstat2;
6 IF _type_="ERROR";
7 RUN;
8 PROC SORT DATA=fullvsreduced;
9 BY df;
10 RUN;
11 DATA fullvsreduced2;
12 SET fullvsreduced;
13 fullss=lag(ss);
14 fulldf=lag(df);
15 num = (ss-fullss)/(df-fulldf);
16 den = fullss/fulldf;
17 f = num/den;
18 pvalue=1-cdf('f', f, df-fulldf, fulldf);
19 keep f pvalue;
20 IF _n_=1 THEN delete;
21 RUN;
22 PROC PRINT DATA=fullvsreduced2;
23 RUN;
24%mend;
6 Bloc de code
MACRO CALL
Explication :
Appelle la macro de comparaison de modèles `%hw6problem2` à deux reprises. Le premier appel compare un modèle avec 'score' et 'save' comme prédicteurs à un modèle plus simple avec 'differential'. Le second appel inverse l'ordre de la comparaison. Les résultats sont écrits dans les tables 'ssout' et 'dout'.
Copié !
1%hw6problem2(winper,,,score save,differential,ssout,dout,comp2010);
2%hw6problem2(winper,,,differential,score save,dout,ssout,comp2010);
3 
7 Bloc de code
ODS
Explication :
Ferme la destination ODS PDF, finalisant ainsi la création du fichier.
Copié !
1ods pdf close;
L'Astuce Pro
L'utilisation de cdf('f', ...) pour générer la p-value est cruciale. Elle permet de transformer une statistique brute en une probabilité actionnable. Si votre p-value est inférieure à votre seuil (généralement 0.05), vous avez la preuve statistique que votre modèle complexe est supérieur au modèle réduit. Attention toutefois : cette méthode suppose que vos modèles sont bien "imbriqués", c'est-à-dire que les prédicteurs du modèle réduit sont un sous-ensemble de ceux du modèle complet.
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.