[ 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 in=tables out=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) lrecl=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) delimiter="," lrecl=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) lrecl=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) lrecl=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 */
  data=work.q0xlord
  /* Et on ne peut utiliser sorties(q0x.csv) ici */
  outfile="&chemin/sorties/q0x.csv"
  dbms=csv
  replace;
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 data=tables.htwt graphics;
  by sexe;
  model poids=taille;
  /* r. : les résidus
     p. : les valeurs prédites */

  plot r.*p. / caxis=red ctext=blue;
  /* pred95 : intervalles de confiance à 95% sur les prédictions */
  plot poids*taille / pred95 caxis=red ctext=blue;
run;
quit;

proc reg data=tables.htwt graphics;
  by sexe;
  model  poids=taille age;
  plot r.*p. / caxis=red ctext=blue;
  plot poids*taille / caxis=red ctext=blue;
  plot poids*age / caxis=red ctext=blue;
run;
quit;

proc insight data=tables.htwt tools;
  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 nolist;
  delete gseg;
quit;

/* et les sorties (SAS 6.12) */
dm output 'clear';

data voitures;
  infile donnees(voitures.txt) firstobs=dlm='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 data=voitures;
run;

proc reg data=voitures graphics;
  /* NOINT précise que l'on ne veut pas de terme constant dans la régression */
  model prix=puis / noint ;
  plot r.*p. / caxis=red ctext=blue;
  plot prix*puis / caxis=red ctext=blue pred95;
run;
quit;

proc reg data=voitures;
  /* l'option R affiche les résidus */
  model prix=cyl puis lon lar poids vitesse / r;
  model prix=cyl puis lon lar poids vitesse / noint;
run;
quit;

proc reg data=voitures;
  /* L'option STEPWISE précise une méthode de selection des variables assez utilisée */
  model prix=cyl puis lon lar poids vitesse / selection=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 / selection=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 / selection=adjrsq;
  model prix=cyl puis lon lar poids vitesse / selection=adjrsq noint;
run;
quit;

proc reg data=voitures graphics;
  /* L'option ALL demande toutes les sorties possibles */
  model prix=puis poids / all;
  /* L'option SSE demande la statistique de PRESS (entre autres) */
  model prix=puis poids / r sse;
  model prix=puis poids / noint ;
  plot r.*p. / caxis=red ctext=blue;
run;
quit;