[ Retour aux Travaux Dirigés de SAS ]
/* Statistiques avec SAS, Corrigé du TD 5 */
/* Jean-Sebastien Roy (js@jeannot.org), 2000 */
%let chemin=//diamant/Data Mi2/sas/stats;
libname tables "&chemin/tables";
filename donnees "&chemin/infiles";
filename sorties "&chemin/sorties";
/* Copie de la table q0xl
depuis la library TABLES vers la library WORK
(Pour l'exemple : ce n'est pas du tout necessaire)
*/
proc copy tables work;
select q0xl;
run;
/* On aurait aussi pu faire : */
data q0xl;
set tables.q0xl;
run;
/* Mais c'est moins efficace */
/* Sortie vers un fichier texte (séparation: espace) */
/* DATA _NULL_; est la syntaxe à utiliser si on ne souhaite pas creer de tables
lors d'une étape DATA */
data _null_;
/* lrecl=32000 evite que SAS tronque les lignes au bout de 256 caractères
qui est la valeur par défaut */
/* La syntaxe sorties(q0.txt) est équivalente à écrire "D:\SAS\MASS\Sorties\q0.txt" */
file sorties(q0.txt) 32000;
set q0xl;
/* Premiere ligne :
date 1 2 3 ... 47
*/
if _n_=1 then do;
/* @ à la fin du put empeche SAS de passer à la ligne */
put "date " @;
do i=0 to 47;
put i @;
end;
/* la ligne suivante ne fait que passer à la ligne */
put;
end;
/* Le ':' avant le format précise que SAS formate la valeur avant de l'écrite
comme d'habitude (avec un espace après et une taille de champ variable) */
put date : mmddyy10. dh_0-dh_47;
run;
/* Sortie vers un fichier texte (séparation virgule, SAS v8) */
data _null_;
file sorties(q0.csv) "," 32000;
set q0xl;
/* Premiere ligne :
date,1,2,3, ... ,47
*/
if _n_=1 then do;
put "date," @;
do i=0 to 47;
put i @;
end;
put;
end;
put date : mmddyy10. dh_0-dh_47;
run;
/* Sortie vers un fichier texte (équivalent v6.12) */
data _null_;
/* L'option DELIMITER n'existe pas */
file sorties(q0.csv) 32000;
set q0xl;
if _n_=1 then do;
put "date" @;
do i=0 to 47;
/* +(-1) fait reculer SAS d'un caratère
pour eviter les blancs qui s'interalent entre les valeurs par defaut */
put ',' i +(-1) @;
end;
put;
end;
/* la syntaxe (+(-1) ',') précise ce qu'il faut faire entre chaque ecriture d'une variable
de la liste (dh_0-dh_47) qui précède */
/* Il n'y a pas de ':' après DATE car on ne veut pas de blanc après la date */
put date mmddyy10. ',' (dh_0-dh_47) (+(-1) ',');
run;
/* Sortie vers un fichier texte (SAS v6.12, aligné) */
data _null_;
file sorties(q0a.csv) 32000;
set q0xl;
if _n_=1 then do;
put "date " @;
do i=0 to 47;
put ',' i 5. @;
end;
put;
end;
put date mmddyy10. ',' (dh_0-dh_47) (5. ',');
run;
/* Mise dans l'ordre des variables
(manipulation très rarement utile,
sauf pour PROC Export)
*/
data q0xlord;
/* en réferençant les variables dans un ordre précis avant le set
SAS conserve cet ordre ensuite */
array monordre date dh_0-dh_47;
set q0xl;
run;
/* La procdure export peut générer toutes sortes de formats de fichiers
Mais pour des fichiers texte elle est moins souple qu'une étape DATA
(et plus lente)
*/
proc export
/* ici il FAUT préciser la library même pour WORK */
work.q0xlord
/* Et on ne peut utiliser sorties(q0x.csv) ici */
"&chemin/sorties/q0x.csv"
csv
;
run;
/* Régression */
/* deux ' d'affilée génèrent un ' dans la chaine */
title 'Regression du poids sur la taille et l''age';
/* l'option GRAPHICS est inutile dans SAS v8 */
proc reg tables.htwt ;
by sexe;
model poids=taille;
/* r. : les résidus
p. : les valeurs prédites */
plot r.*p. / red blue;
/* pred95 : intervalles de confiance à 95% sur les prédictions */
plot poids*taille / red blue;
run;
quit;
proc reg tables.htwt ;
by sexe;
model poids=taille age;
plot r.*p. / red blue;
plot poids*taille / red blue;
plot poids*age / red blue;
run;
quit;
proc insight tables.htwt ;
fit poids=taille;
fit poids=taille age;
run;
/* Suppression du titre */
title;
/* Un peu de nettoyage... */
/* Voici comment effacer l'ensemble des graphiques réalisés */
proc datasets mt=cat ;
delete gseg;
quit;
/* et les sorties (SAS 6.12) */
dm output 'clear';
data voitures;
infile donnees(voitures.txt) 2 '09'x;
/* Il faut préciser la taille de la variable nom pour eviter qu'elle soit
tronquée à 8 caractères (taille par défaut) */
length nom $ 20 finition $ 2;
input nom $ cyl puis lon lar poids vitesse finition $ prix;
run;
/* Calcul des correlations linéaires entre toutes les variables de VOITURES */
proc corr voitures;
run;
proc reg voitures ;
/* NOINT précise que l'on ne veut pas de terme constant dans la régression */
model prix=puis / ;
plot r.*p. / red blue;
plot prix*puis / red blue ;
run;
quit;
proc reg voitures;
/* l'option R affiche les résidus */
model prix=cyl puis lon lar poids vitesse / ;
model prix=cyl puis lon lar poids vitesse / ;
run;
quit;
proc reg voitures;
/* L'option STEPWISE précise une méthode de selection des variables assez utilisée */
model prix=cyl puis lon lar poids vitesse / stepwise;
/* En voici deux autres qui testent TOUS les modèles possibles
(a eviter si on a beaucoup de variables)
et classent les modèles selon le R^2 */
model prix=cyl puis lon lar poids vitesse / rsquare;
/* Ou le R^2 ajusté (mieux) qui tient compte du nombre de variables du modèle */
model prix=cyl puis lon lar poids vitesse / adjrsq;
model prix=cyl puis lon lar poids vitesse / adjrsq ;
run;
quit;
proc reg voitures ;
/* L'option ALL demande toutes les sorties possibles */
model prix=puis poids / ;
/* L'option SSE demande la statistique de PRESS (entre autres) */
model prix=puis poids / ;
model prix=puis poids / ;
plot r.*p. / red blue;
run;
quit;