Vous êtes sur la page 1sur 127

La FAQ SAS

Date de publication : 26 avril 2012

Dernière mise à jour : 20 décembre 2012

Cette F.A.Q., qui traite de tout type de questions portant sur l'outil SAS,
a été réalisée à partir des contributions des membres des forums sas de
developpez.com en vue de répondre à des questions fréquemment posées
par les utilisateurs et grâce à SAS France qui a bien voulu nous donner accès
à ses sources.

Si vous désirez contribuer à l'amélioration de cette F.A.Q., vous pouvez


participer au billet de participation à l'enrichissement de la faq SAS, ou
contacter le responsable SAS, ou contacter un des responsables de l'équipe
Business Intelligence.

Nous espérons que cette F.A.Q. saura répondre à un maximum de vos


questions. Nous vous souhaitons une bonne lecture.

L'équipe SAS de developpez.com remercie les contributeurs actuels :


ash_rmy, bahraoui, datametric, fafabzh6, Fleur-Anne.Blain, green_fr,
oncle_pete, raf64flo, rastoix, s_a_m et steelspirit.

L'équipe SAS de developpez.com remercie aussi claudeLeloup et


jacques_jean pour leurs relectures attentives de la F.A.Q. dans le but de
chasser les fautes d'orthographes.
Ont contribué à cette FAQ :

steelspirit - datametric - oncle_pete - oncle_pete


- rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
La FAQ SAS

1. Généralités (30) ......................................................................................................................................................4


1.1. Débuter (3) .....................................................................................................................................................5
1.2. Fenêtre éditeur (2) ......................................................................................................................................... 6
1.3. Fenêtre Log (6) ..............................................................................................................................................7
1.4. Fenêtre sortie (5) ......................................................................................................................................... 10
1.5. Les modules (1) ...........................................................................................................................................12
1.6. Batch (2) ...................................................................................................................................................... 13
1.7. Commandes X (6) ....................................................................................................................................... 14
1.8. Divers (5) ..................................................................................................................................................... 17
2. SAS BASE (65) ....................................................................................................................................................20
2.1. Gestion de bases de données (43) .............................................................................................................21
2.2. Caractères (9) .............................................................................................................................................. 41
2.3. Les formats (2) ............................................................................................................................................ 45
2.4. Dates (5) ...................................................................................................................................................... 46
2.5. Calculs (3) ....................................................................................................................................................49
2.6. Autres (3) ..................................................................................................................................................... 51
3. Macro Langage (24) .............................................................................................................................................52
3.1. Généralités (5) ............................................................................................................................................. 53
3.2. Macrovariables (15) ..................................................................................................................................... 56
3.3. Macrofonctions (1) ....................................................................................................................................... 62
3.4. Macroprogrammes (3) ................................................................................................................................. 63
4. SAS AF et fomulaires (34) ...................................................................................................................................65
4.1. Généralités (1) ............................................................................................................................................. 66
4.2. SAS AF (32) ................................................................................................................................................ 67
4.3. Interface graphique avec SAS BASE : %WINDOW (1) ...............................................................................82
5. Administration et autres (3) ..................................................................................................................................83
5.1. Généralités (3) ............................................................................................................................................. 84
6. SAS STAT (56) .....................................................................................................................................................85
6.1. Général (21) .................................................................................................................................................86
6.2. Modélisation (21) ......................................................................................................................................... 98
6.3. Analyse de données (10) .......................................................................................................................... 108
6.4. Analyse de survie (4) .................................................................................................................................113
7. ODS et Reporting (20) ....................................................................................................................................... 115
7.1. Généralités (4) ........................................................................................................................................... 116
7.2. SAS Mail (4) .............................................................................................................................................. 118
7.3. SAS EXCEL (6) ......................................................................................................................................... 121
7.4. SAS GRAPH (6) ........................................................................................................................................ 124

-3-
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

Sommaire > Généralités

-4-
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

Sommaire > Généralités > Débuter


Qu'est-ce que SAS, comment pouvons-nous le définir ?
Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
SAS, qui signifie Statistical Analysis System ou Système d'Analyse Statistique, est une suite de logiciels
basée sur quatre points : l'accès, la gestion, l'analyse et enfin la présentation des données.

Ces données peuvent être de tous types (numérique ou alphanumérique).

SAS permet la gestion du système d'informations, la saisie, la gestion et interrogation de données, l'analyse
statistique et le reporting.

Quelle est la structure générale d'un programme SAS ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Un programme SAS est constitué d'une suite d'étapes (steps). On distingue deux étapes principales :
DATA : pour l'accès aux données ;
PROC : pour les procédures de traitements des données.
Chaque étape doit obligatoirement se terminer par un ";".

Où se trouve la documentation en ligne de SAS ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
La documentation en ligne est accessible sur les sites internet suivants :

SAS 9.3

SAS 9.2

SAS 9.1.3

SAS 9.1.2

SAS 9.1

-5-
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

Sommaire > Généralités > Fenêtre éditeur


Comment ajouter ou supprimer le numéro de ligne de l'éditeur SAS ?
Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Vous devez taper 'nums' dans la barre de commande se trouvant en haut à gauche pour ajouter ou
supprimer le numéro de ligne.

Comment savoir si l'exécution d'un programme est terminée ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Un moyen simple pour savoir si l'exécution d'un programme est finie consiste à émettre un son à l'aide de
la routine SOUND lorsque l'exécution du programme se termine.

Le code suivant est à mettre à la fin du programme :

data _null_;
call sound(400,200);
run;

La première valeur représente la fréquence (Hertz) et la deuxième valeur la durée en millisecondes.

-6-
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

Sommaire > Généralités > Fenêtre Log


Comment diminuer le contenu de la log SAS ?
Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Différentes options SAS permettent d'alléger la log SAS.

Voici les principales :

• l'option "nonotes" permet de supprimer les notes SAS dans la log. Les messages d'alertes
(Warning) et les erreurs seront toujours visibles ;
• l'option "nosource" permet de ne pas afficher dans la log le code exécuté ;
• l'option "noechoauto" permet de ne pas afficher dans la log le résultat de l'exécution d'un fichier
autoexec.sas.

Pour obtenir la liste complète des options concernant la LOG, vous pouvez exécuter ceci :

proc options group=LOGCONTROL DEFINE ;


run;

Comment exécuter une étape data sans l'afficher dans la log ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Cet exemple permet d'exécuter des étapes data sans afficher leur déroulement dans la log SAS.

data sample;
input code 3. ;
cards;
1
1
2
;
run;

/* répertoire de stockage du programme */

libname stored 'C:\temp\stored';

/* le code suivant sera sauvegardé dans la bibliothèque STORED et aura pour nom SAMPLE */

data sample2 / pgm=stored.sample;


set sample;
if code = 1 then
do;
Type='Perennial';
number+4;
end;
run;

/
* Ensuite, pour exécuter ce programme, sans faire apparaître le code dans la log, vous pouvez exécuter le code s

data pgm=stored.sample;
execute;

-7-
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

run;

La log ainsi générée sera la suivante :

216 data pgm=stored.sample;


217 execute;
218 run;

Est-il possible de modifier le nombre de lignes maximum écrites dans les fenêtres
Log et Output ? Ceci afin d'éviter l'ouverture d'une fenêtre indiquant « Window Full ».
Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
En SAS 9, les options DMSOUTSIZE (pour l'output) et DMSLOGSIZE (pour la log) permettent de modifier le
nombre de lignes affichées avec un minimum de 500 lignes et un maximum de 999 999 lignes.

Leur valeur par défaut est 99 999 lignes.

Ces options sont positionnables dans le fichier de configuration de SAS ou à l'invocation de SAS.

Pourquoi, lorsque j'imprime les résultats de la fenêtre output,


la page imprimée est-elle différente de celle visualisée ?
Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Il faut vérifier que la police d'affichage est la même que la police d'impression.

• Pour l'impression, aller dans le menu fichier >> Définir impression >> Police
• De préférence, veuillez sélectionner la police SAS Monospace.

Pour l'affichage, aller dans le menu Outils >> Options >> Police

Comment effacer la log depuis un programme SAS (depuis la fenêtre Program Editor) ?
Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
L'instruction suivante permet d'effacer le contenu de la log SAS :

dm log 'clear' editor;

-8-
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

Aide en ligne : DM statement

Comment supprimer le contenu de la log?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Le code ci-dessous permet supprimer le contenu de la fenêtre log :

dm log 'clear' editor;

-9-
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

Sommaire > Généralités > Fenêtre sortie


Comment ajouter des commentaires dans un programme SAS ?
Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Pour ajouter un commentaire il suffit de faire comme ceci :

/*commentaires*/

où bien entendu ici commentaires représente le texte à mettre en commentaire.

Comment afficher le résultat de mon tableau (programme) dans la fenêtre de sortie SAS ?
Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Faire un programme... c'est bien. Voir les résultats... c'est mieux !
Nous allons répondre à travers un petit programme :

DATA equipe;
INPUT nom$ anneecreation nbjoueur;
CARDS;
sharks 1950 12
tigers 1951 33
lions 2000 42
zodiac 2006 11
flyers 2007 42
;
RUN;
PROC PRINT DATA=equipe;
RUN;

PROC PRINT est une procédure qui permet d'afficher le résultat en sortie, plus particulièrement le dernier
tableau créé.

Comment séparer les affichages en sortie ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Les affichages en fenêtre de sortie peuvent être lourds, répétitifs si l'on réexécute le même programme
avec quelques modifications... Pouvoir distinguer les différents affichages en sortie serait un plus.
En ajoutant au début de votre fichier de programme SAS ceci :

OPTION FORMDLIM ='/';

Si vous souhaitez que vos sorties soient séparées par une ligne de "/". Bien entendu, il est possible de
mettre un tout autre caractère à la place.

- 10 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

Comment ne pas afficher les résultats dans la fenêtre de sortie ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
À l'aide de l'ODS vous pouvez effectuer cette manipulation :

ODS LISTING CLOSE;

Comment supprimer l'affichage des numéros de page dans l'output ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Il faut utiliser l'option NUMBER :

a) soit comme une instruction OPTION à soumettre dans SAS :

pour désactiver l'affichage du numéro :

Options number=0;

pour l'activer :

Options number=1;

b) soit comme une option à indiquer dans le fichier de configuration :

pour désactiver l'affichage du numéro :

• NONUMBER

pour l'activer :

• NUMBER

- 11 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

Sommaire > Généralités > Les modules


Comment lister les modules de votre licence SAS ?
Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
La proc setinit permet de lister l'ensemble des modules disponibles de votre licence.

proc setinit;
run;

Les modules disponibles sont indiqués dans la fenêtre "journal" ou "log".

- 12 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

Sommaire > Généralités > Batch


Comment exécuter un programme SAS en batch ?
Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Depuis un prompt système ou dans un script, vous pouvez utiliser une commande de ce type :

!SASROOT/sas /mon_prog.sas -altlog /mon_prog.log

où :

• !SASROOT représente le chemin absolu où se situe l'exécutable SAS sur votre système ;
• /mon_prog.sas représente le chemin où se situe votre programme ;
• /mon_prog.log représente le chemin où vous souhaitez enregistrer le journal d'exécution de votre
programme.

Remarque : l'option -altlog est optionnelle. Elle permet de sauvegarder le journal afin de voir si l'exécution
s'est déroulée correctement ou non.

Lors de l'exécution d'un programme en batch ou en non interactif, dès qu'une


erreur intervient, pourquoi la suite du programme n'est-elle pas exécutée ?
Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Par défaut, en batch, SAS est démarré en mode ?Syntaxcheck' : dès qu'une erreur est rencontrée, l'option
OBS est positionnée à 0, ainsi le code est simplement validé mais non exécuté. Cela permet de ne pas
écraser des données valides alors qu'une erreur est survenue.

La log indique d'ailleurs ceci :

NOTE: The SAS System stopped processing this step because of errors.
NOTE: SAS set option OBS=0 and will continue to check statements.
This may cause NOTE: No observations in data set.

Ce fait est décrit dans la Usage Note SN-007751,

'Error messages that cause SAS to enter syntax check mode'.

Pour passer en mode 'nosyntaxcheck', il y a plusieurs possibilités :

• vous pouvez ajouter une instruction OPTION dans l'autoexec de SAS ou bien au sein du
programme : options NOSYNTAXCHECK ;
• vous pouvez également mettre l'option dans le fichier de configuration (sasv8.cfg ou sasv9.cfg): -
NOSYNTAXCHECK.

- 13 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

Sommaire > Généralités > Commandes X


Comment créer un répertoire Windows avec SAS ?
Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Les commandes X permettent de soumettre une commande Windows sans mettre fin à votre session SAS.

La commande mkdir permet la création d'un répertoire.

Un exemple de code :

%let path=c:\mondossier; /
*Création d'une macrovariable avec le chemin du répertoire nommé "mondossier" */

/* NOXWAIT : la fenêtre DOS se ferme automatiquement */


/* XSYNC : SAS attend que DOS ait terminé */

option NOXWAIT XSYNC;

Data _null_;
X "mkdir &path"; /*Création du répertoire à l'aide de la macrovariable */
run;

Comment ouvrir une fenêtre DOS à partir de SAS ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
La commande X permet d'ouvrir une fenêtre MS DOS. Vous pouvez éventuellement mettre cette commande
dans une table temporaire.

DATA _NULL_ ;
X ;
RUN ;
Ou
X ;

Comment lancer une application (Excel, Notepad...) depuis SAS ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Comme la fenêtre MS DOS peut être lancée depuis SAS, il est très facile de pouvoir utiliser n'importe quelle
application. Par exemple pour ouvrir le logiciel Excel vous tapez :

DATA _NULL_ ;
X start excel;
RUN ;

Pour ouvrir la calculatrice Windows :

- 14 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

DATA _NULL_ ;
X start calc;
RUN ;

Pour ouvrir Notepad :

DATA _NULL_ ;
X start notepad;
RUN ;

Comment ouvrir un fichier précis depuis SAS ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Pour pouvoir ouvrir un fichier précis il faut tout d'abord connaître le logiciel permettant d'ouvrir le fichier.

Par exemple si vous voulez ouvrir un fichier " txt " vous pouvez utiliser Notepad, si vous souhaitez ouvrir
un fichier Excel vous ouvrirez naturellement ce fichier avec le logiciel Excel.

La question FAQ (précédente) nous a montré comment lancer une application depuis SAS. Ceci est réalisé
en faisant appel aux commandes MS DOS. Pour ouvrir un fichier nous allons donc procéder de la même
manière.

Pour ouvrir le fichier classeur1.xls enregistré dans le répertoire c:\ nous allons écrire :

DATA _NULL_ ;
X start excel "c:/classeur1.xls";
RUN ;

Pour ouvrir le fichier test.txt enregistré dans le répertoire c:\ nous allons écrire :

DATA _NULL_ ;
X start notepad "c:/text.txt";
RUN ;

Comment créer un dossier / répertoire depuis SAS ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Comme la fenêtre MS DOS peut être lancée depuis SAS, il est très facile de pouvoir utiliser une commande
MS DOS permettant de créer un dossier. Le code ci-dessous crée le répertoire test :

DATA _NULL_ ;
X md "c:/test/";

- 15 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

RUN ;

Comment supprimer un dossier répertoire depuis SAS ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Comme la fenêtre MS DOS peut être lancée depuis SAS, il est très facile de pouvoir utiliser une commande
MS DOS permettant de supprimer un dossier. Le code ci-dessous supprime le répertoire test :

DATA _NULL_ ;
X rd "c:/test/";
RUN ;

- 16 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

Sommaire > Généralités > Divers


Comment récupérer des informations relatives au JRE (Java
Runtime Environment) associé à SAS Foundation ? (SAS9)
Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Il existe la procédure JAVAINFO. Si vous exécutez le code suivant, la procédure écrira dans la log les
informations relatives au JRE utilisé.

proc javainfo;
run;

Comment faire apparaître un messagebox sous SAS ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Cette citation n'est pas valable dans le cas de :

• SAS Entreprise Guide ;


• quand on est en session client léger (le code est soumis au serveur) ;
• si on est sous un OS hors Windows.

*****************ON ferme la log ;


dm log 'log off' continue;
**********ON affiche le message box;
dm editor " postmessage %str( '&sysuserid')' le traitement est terminé.'" continue;
********** ON rouvre la log ;
dm log 'log on' continue;
*************ON peut changer les couleurs des messages erreurs dans la log;
dm log ' color error orange reverse ' continue;

Comment exécuter un script externe depuis SAS ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Plusieurs méthodes sont possibles.

Les commandes « X », « systask » et « call system » permettent d'exécuter des commandes ou des fichiers
de script « BAT » depuis SAS.

Voici un exemple de chaque syntaxe :

a/ Commande X

X "c:\test\fichier.bat";

b/ Commande Call System

- 17 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

data _null_;
call system('dir /w');
run;

c/ Commande Systask

systask command "copy fichier1.txt fichier2.txt"


taskname="copyfile" status=copystat;

d/ Macro %SYSEXEC

%sysexec time;

Aide en ligne - SAS 9 : Running Windows or MS-DOS Commands from within SAS

Comment récupérer une variable d'environnement Windows sous SAS ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Avec la fonction SYSGET, il est possible de récupérer une variable d'environnement et de l'utiliser dans
un programme SAS.

Exemple 1 :

data_null_;
X = sysget('USERNAME');
put x=;
run;

Exemple 2 :

%let HOMEDIR=%SYSGET(HOME);

Comment positionner des variables système Unix lors d'une session SAS ?
Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Il est nécessaire d'utiliser la commande X ainsi que le paramètre « setenv ».

Exemple :

X "setenv TEST 45" ;

La variable TEST prendra la valeur « 45 ».

- 18 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

Attention, la valeur de la variable ne sera disponible que pour la session SAS en cours.

Aide en ligne : Executing Operating System Commands from Your SAS Session

- 19 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

Sommaire > SAS BASE

- 20 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

Sommaire > SAS BASE > Gestion de bases de données


Comment lire des données alphanumériques et numériques dans un programme SAS ?
Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
On distingue deux types de données possibles à lire : les données alphanumériques et les données
numériques. Toutes deux ne se lisent pas de la même manière pour pouvoir ensuite les présenter en fenêtre
de sortie.
Nous allons répondre à travers un petit programme :

DATA equipe;
INPUT nom$ anneecreation nbjoueur;
CARDS;
sharks 1950 12
tigers 1951 33
lions 2000 42
zodiac 2006 11
flyers 2007 42
;
RUN;

L'étape DATA nous permet de créer un tableau appelé equipe.


INPUT nous permet de signaler les variables à lire. INPUT est donc suivi de leurs déclarations.
Une donnée alphanumérique voit son nom de variable obligatoirement suivi par le signe $.
CARDS signifie que les données vont être entrées à la suite et dans l'ordre dans le programme.
RUN exécute toutes les lignes de code le précédant. Obligatoire pour l'exécution donc.

Comment lire un fichier plat et l'exploiter dans un programme SAS ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Supposons que nous ayons un fichier coatch.txt qui contient des équipes décrites par leur nom, année de
création et nombre de joueurs. Pour lire un fichier plat, il faut déterminer le nom et le nombre de variables
à prendre en compte :

DATA equipe;
INFILE "coatch.txt";
INPUT nom$ anneecreation nbjoueur;
RUN;
PROC PRINT DATA=equipe;
RUN;

INFILE permet donc de lire des fichiers plats suivis entre " " de leur nom.

Comment lire des données qui contiennent des espaces dans un programme SAS ?
Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Et si notre nom d'équipe était en deux parties (séparées par un espace) ? Pour SAS un espace correspond
à la valeur suivante :

- 21 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

DATA equipe;
INFILE "coatch.txt";
INPUT nom$ 1-10 anneecreation 13-16 nbjoueur;
RUN;
PROC PRINT DATA=equipe;
RUN;

Ce que nous venons d'ajouter signifie que les données de la variable nom peuvent être sur 10 caractères
maximum, que l'année de création de l'équipe est sur 4 caractères.
Cette méthode permet donc de spécifier les positions des variables, ou leur taille (en comptant le nombre
de caractères y compris les blancs). Résultat : nous affichons les blancs et pas de décalage de données
en sortie.

Comment utiliser du SQL avec SAS ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
La procédure PROC SQL permet de manipuler le langage SQL avec SAS.

PROC SQL;
SELECT * FROM base;
QUIT;

Comment fixer une taille à nos variables ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Afin d'éviter que les données soient tronquées, il est possible de spécifier une taille, soit un nombre de
caractères, disponible pour afficher les données.
Nous allons répondre à travers un petit programme :

DATA equipe;
INPUT nom$ :20. anneecreation nbjoueur;
CARDS;
sharks 1950 12
tigers 1951 33
lions 2000 42
zodiac 2006 11
flyers 2007 42
;
RUN;

Dans cet exemple, nous avons spécifié une taille pour la variable nom. Un nom d'équipe disposera de 20
caractères maximum à l'affichage. Pour cela, il est impératif de mettre "nb" après la variable en question
dans la section INPUT de votre programme. Bien entendu, "nb" est à remplacer par n'importe quelle valeur
entière.

- 22 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

Comment lire des données saisies sur une seule ligne ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Afin de lire les données correctement, pour chaque tuple un utilisateur SAS est contraint de les saisir ou
enregistrer ligne par ligne. Il est possible de tout mettre sur une même ligne avec une instruction précise.
Pour comprendre le problème, regardons le programme suivant :

DATA equipe;
INPUT nom$ :20. anneecreation nbjoueur;
CARDS;
sharks 1950 12 tigers 1951 33 lions 2000 42 zodiac 2006 11 flyers 2007 42
;
RUN;
PROC PRINT DATA=equipe;
RUN;

Toutes les données sont sur une unique ligne. Cependant, à l'exécution de notre programme SAS il n'a été
pris en compte que ceci :

Obs nom anneecreation nbjoueur


1 sharks 1950 12

Donc même si toutes les données sont sur une seule ligne tout n'est pas pris en compte. Pour lire des
données saisies sur une ligne unique il suffit d'ajouter l'instruction @@ dans la section INPUT de votre
programme comme suit :

DATA equipe;
INPUT nom$ :20. anneecreation nbjoueur @@;
CARDS;
sharks 1950 12 tigers 1951 33 lions 2000 42 zodiac 2006 11 flyers 2007 42
;
RUN;
PROC PRINT DATA=equipe;
RUN;

Et nous obtenons bien le résultat voulu :

Obs nom anneecreation nbjoueur

1 sharks 1950 12
2 tigers 1951 33
3 lions 2000 42
4 zodiac 2006 11

- 23 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

5 flyers 2007 42

Comment réaliser une boucle dans une table SAS ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Certains traitements peuvent être répétitifs. Il nous faut donc utiliser une boucle afin d'optimiser le
traitement.
Prenons un exemple simple qui va réaliser une boucle de 1 à 10 durant laquelle on effectuera un traitement
simple : prendre la valeur et la multiplier par 10.

DATA tab_boucles;
DO i=0 TO 10 BY 1;
v= i*10;
OUTPUT tab_boucles;
END;
RUN;

Pour réaliser une boucle, il y a quatre mots-clés :


* DO
* TO
* BY
* END

Comment accéder au numéro de la ligne de la table SAS ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Parfois, lors d'une étape DATA on aimerait savoir sur quelle ligne on se trouve, ou alors lors de l'affichage
(PROC PRINT) on aimerait sélectionner les lignes à afficher en fonction de leur numéro de ligne. Lors
d'un DATA, la table crée une variable automatique _N_, qui correspond au numéro de ligne. Cette variable
disparaît après la fin du DATA, mais on peut la conserver dans une variable.

Le code suivant met le numéro de la ligne dans la variable v2 :

DATA base;
ATTRIB v1 LENGTH=$1. LABEL="Ma premiere variable";
ATTRIB v2 LENGTH=8. LABEL="Ma deuxieme variable";
v2=_N_;
input v1;
cards;
a
b
c
d
;
RUN;

Le code suivant affiche les deux premières lignes de cette table :

PROC PRINT DATA=base LABEL;

- 24 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

WHERE v2 LE 2;
RUN;

Comment faire une fusion horizontale de deux tables "Merge" ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr

DATA t1;
input t t12 t13;
cards;
1 2 1
3 5 6
5 6 7
8 9 3
4 5 3
;
run;

DATA t2;
input t t2;
cards;
1 2
3 5
7 8
2 3
4 5
;
run;

proc sort DATA=t1 ; BY t ;run;


proc sort DATA=t2 ; BY t ;run;
DATA res; merge t1(IN=a) t2(IN=b);
BY t;
IF a AND b then var=1;
else var=0;
DROP t2;
run;

Quelles sont les limites de la fusion horizontale avec un merge ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Si les deux tables qu'on souhaite merger contiennent des doublons => résultat du merge est faux, dans ce
cas il faut utiliser une proc SQL avec un full join. Le merge ne peut être utilisé que s'il y a des doublons
dans une seule table.

Comment faire une fusion verticale SET ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Les tables doivent avoir la même structure.

DATA fusion;

- 25 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

SET table_1 table_2... table_n;


run;

Comment créer une table vide ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Pour créer une table vide vous avez deux solutions : soit utiliser du SQL (PROC SQL) soit utiliser une étape
DATA.

Pour l'étape DATA vous devez procéder comme suit :

DATA VIDE;
SET _NULL_;
length a 3;
run;

Ou comme suit :

DATA vide; length a 3.; stop;


run;

Et pour le SQL :

proc sql;
CREATE TABLE tab (a int);
quit;

Comment renommer les variables d'une table SAS ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Une solution possible consiste à utiliser l'option "RENAME", à l'intérieur d'une étape "DATA".

Ci-dessous, un exemple de code SAS utilisant l'option "RENAME" :

DATA base;
INPUT var1 var2;
CARDS;
10 5
3 8
;
DATA base2;
SET base;
RENAME var1=variable1;
RENAME var2=v2;
RUN;

- 26 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

La table "base" contient deux variables : les variables "var1" et "var2". Grâce à l'option "RENAME", nous
avons renommé la variable "var1" en "variable1" et la variable "var2" en "v2".

Comment changer le nom d'une table SAS ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Pour changer le nom d'une table SAS vous devez utiliser la procédure DATASETS avec l'option CHANGE
comme suit :

PROC SQL;
CREATE TABLE tab (a int);
QUIT;

PROC datasets lib=work;


CHANGE tab=tab_new;
run;
quit;

Comment dupliquer une ligne particulière ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Pour dupliquer une ligne particulière d'une table SAS vous pouvez utiliser l'option OUTPUT dans une étape
DATA.

DATA toto2;
format cle $10. frequence 5. effectif 5.;
input cle $ frequence effectif;
cards;
rean 10 .
tutu 80 .
titi 1 .
tata 90 .
k . 2
k . 1
;
run;

DATA toto22; SET toto2;


IF cle='tutu' then output;
output;
run;

Comment changer l'ordre des variables (ou colonnes) d'une table ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Dans une étape DATA, vous pouvez à l'aide de l'option RETAIN changer l'ordre d'impression des variables
(ou colonnes) d'une table.

- 27 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

DATA base;
INPUT v1 v2;
CARDS;
1 2
10 3
;
RUN;
DATA base;
RETAIN v2 v1;
SET base;
RUN;
PROC PRINT DATA=base2;
RUN;

Comment rajouter un identifiant de type numéro automatique à une table ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Pour rajouter un identifiant de type numéro automatique vous pouvez utiliser la fonction _N_ dans une
étape DATA.

DATA base;
INPUT v1 v2;
CARDS;
9 5
10 3
;
RUN;
DATA base2;
SET base;
id=_N_;
RUN;

Comment tester la validité de la saisie utilisateur et


lui retourner la position de son éventuelle erreur ?
Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
La fonction UTILITY vous permet de faire ce genre de manipulation.

DATA CHECK;
length Autorise $10 MaChaine $50;
Autorise='abcdf';/* ce sont les caractères autorisés */
Machaine='abcbcdfaaqabddb';
x = verify(Machaine, autorise);
run;

Ici X=10. verify ne retourne la position que du 1er caractère interdit.

DATA _null_;
SET CHECK;
lettre = substr(Machaine, x, 1);
Put 'La lettre ' lettre ' est incorrecte';

- 28 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

run;

Comment garder en mémoire la valeur de la dernière variable lue ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
La fonction LAG vous permet de faire ce genre de manipulation.

DATA one;
length n 8;
input n @@;
y=lag1(n);
cards;
3 5 . 6 1 4
;
run;

DATA _null_;
SET One;
IF y > x then
put 'Y plus grand que X';
else
put 'Y plus petit que X';
run;

Résultat de la log

Y plus petit que X


Y plus petit que X
Y plus grand que X
Y plus petit que X
Y plus grand que X
Y plus petit que X

Contenu du Dataset One

X Y
3 .
5 3
. 5
6 .
1 6
4 1

Quelle est la différence entre if et where dans une étape data ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
En deux mots : l'instruction where s'applique avant le chargement d'enregistrements dans la mémoire,
l'instruction if - après. Sinon :

- 29 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

• L'utilisation de where est en général plus rapide que celle de if. Au moins parce qu'avec where SAS
n'est pas obligé de charger (et éventuellement traiter) des enregistrements inutiles (filtrés par la
condition). En plus, avec where SAS peut utiliser les index pour améliorer la performance ;
• L'utilisation de if est plus riche. En effet, avec where on ne peut utiliser que des variables présentes
dans la table source. Tandis que dans les conditions de if on peut également inclure des variables
systèmes (_N_, etc.) et des variables résultant des calculs de cette même étape data.

Comment importer un fichier texte contenant des langues différentes ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Pour pouvoir importer ce type de fichier, il faut avoir installé SAS DBCS avec prise en charge Unicode.

Ensuite :

• démarrer « SAS 9.1 English with DBCS and Unicode support » avec l'option encoding UTF8 dans la
commande de démarrage ;
• importer le fichier texte via une étape DATA en incluant l'encoding correct du fichier dans
l'instruction Infile (ex : encoding=unicode) ;
• repérer les variables contenant les caractères spécifiques à une langue, puis les transformer comme
suit avec la fonction KCVT dans l'étape DATA: Out =kcvt (in,"Encoding_entrée","Encoding_sortie").

Exemple :

data table;
infile "C:\exemple\extract.txt" lrecl=64000 firstobs=2 encoding=unicode ignoredoseof dsd
missover dlm='09'x ;
input var1 var2 ;
Var1 =kcvt (var1,"UTF8","wlatin2");
Run ;

UTF8 car l'option placée au démarrage de SAS modifie automatiquement tous les encoding à UTF8.
WLATIN2 : pour les caractères de l'Europe centrale (Pologne, Croatie, etc.). Pour les caractères français,
l'encoding est WLATIN1.

Comment trier un tableau d'observations selon une ou plusieurs variables ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Pour trier un tableau d'observations avec une ou plusieurs variables, il faut utiliser la procédure PROC
SORT et la commande BY
suivie des noms de variables de tri souhaité. Ce tri peut être croissant ou décroissant.
Prenons l'exemple suivant :

DATA equipe;
INPUT nom$ :20. anneecreation nbjoueur;
CARDS;
sharks 1950 12
tigers 1951 33
lions 2000 42

- 30 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

zodiac 2006 11
flyers 2007 42
;
RUN;
PROC SORT DATA=equipe OUT=equipe_triee;
BY nom anneecreation nbjoueur;
RUN;

Pour un tri décroissant de ce même programme, il suffit de remplacer la PROC SORT par ceci :

PROC SORT DATA=equipe OUT=equipe_triee;


BY DESCENDING nom anneecreation nbjoueur;
RUN;

Attention ce tri ne sera décroissant que pour la variable nom, les autres resteront par défaut croissants.

Comment réparer toutes les tables d'une bibliothèque ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Voici un exemple de code qui permet de réparer toutes les tables contenues dans la bibliothèque MYLIB.

libname MYLIB "C:\SASWorkspace\test";

%macro repair ;
%do i=1%to &dscount;
repair &&ds&i;
%end;
%mend;

proc sql;
create table work.listing as
select memname
from sashelp.vtable
where trim(upcase(libname)) = "MYLIB";
quit;

data _null_;
set work.listing;
call symput("ds"||trim(left(_N_)), memname);
call symput("dscount", _N_);
run;

proc datasets lib= MYLIB nolist;


% repair ;

- 31 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

run;

Quelle est la limite d'une table SAS ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Une table SAS V8 a pour limite 32 767 variables. Cette limite n'existe pas en SAS9. Quant au nombre
d'observations il n'y a pas de limite SAS, cela est lié au système d'exploitation.

Comment conserver les dix meilleurs résultats (top ten) obtenus par groupe ?
Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
L'idée est de créer un compteur, par groupe, et de ne garder que les valeurs inférieures ou égales à
dix. Prenons un exemple : comment conserver les dix meilleures ventes de chaque pays, dans la table
sashelp.prdsale ?

/* Tri de la table, par pays et valeur décroissante des ventes */


proc sort data = sashelp.prdsale out=prdsale_tri;
by country descending actual;
run;/*

Création du compteur, réinitialisé à chaque nouveau groupe et extraction des dix premières valeurs de ce compteu
data top_ten(drop=cpt);
retain cpt 0;
set prdsale_tri;
by country;
cpt=cpt+1;
if first.country then cpt=1;
if cpt <=10 then output; run;

Comment récupérer le nombre d'observations d'une table ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr

DATA titi;
dsid=open("sashelp.adomsg"); /*ouvrir la table*/
pw=attrn(dsid,"NOBS ");/
*obtenir le nombre d'obs, la fonction attrn peut recevoir d'autres paramètres NOBS NVARS...*/
rc=close(dsid);/*ermer la table*/
run;
proc contents DATA=sashelp.adomsg out=t noprint; run;
/*Avec la proc contents on obtient beaucoup plus d'informations*/

Comment vérifier l'état de la base de registre SAS ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
La procédure REGISTRY permet de valider l'état de la base de registre SAS :

- 32 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

PROC REGISTRY RUTHERE;


RUN;

La log SAS doit retourner le message suivant :

****** Validating the SASHELP Registry ***********************


The SASHELP Registry is set to read only access.
The SASHELP Registry has data and looks OK.
****** Validating the SASUSER Registry ***********************
The SASUSER Registry is set to read/write access.
The SASUSER Registry has data and looks OK.
NOTE: PROCEDURE REGISTRY used:
real time 0.03 seconds
cpu time 0.00 seconds

Peut-on avoir plusieurs serveurs de métadonnées SAS 9 sur la même machine ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Oui, pour cela il est nécessaire d'utiliser différents ports pour chaque serveur de métadonnées.

Comment importer le contenu d'un répertoire dans un dataset ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Voici le code pour importer le contenu d'un répertoire dans un dataset :

options noxwait xsync;


/* noxwait : masque l'invite de commande
xsync : attend l'exécution de la commande
avant de poursuivre le traitement
*/

filename cmd pipe "Dir /B C:\"; /* Commande DOS pour lister C:\ */

data contenu_disque_c;
format var $500.;
infile cmd DSD MISSOVER; /* lecture du filename */
input var $;
run;

Au travers du filename pipe, SAS lit le résultat de la commande DOS comme un fichier.
Cet exemple fonctionne avec d'autres commandes système aussi bien sur Windows que sur Unix.

Comment accéder aux données stockées dans un fichier binaire SAS ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr

LIBNAME repdata 'c:\Documents and Settings\';


DATA monfichier;
SET repdata.tab;
RUN;

- 33 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

PROC PRINT data=monfichier;


RUN;

L'instruction LIBNAME permet de spécifier le chemin d'accès au fichier. L'instruction SET signifie que l'on
reprend un tableau existant, soit ici tab.
Remarque :
le chemin spécifié peut bien évidemment être différent.

Comment afficher les informations générales d'un tableau SAS ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Il suffit d'ajouter ce bout de code à votre programme SAS

PROC CONTENTS;
RUN;

PROC CONTENTS est une procédure SAS qui permet d'obtenir le nombre d'observations (ou de lignes), le
nombre de variables, le nom de la table ou encore la date de création.

Comment extraire les doublons d'une table ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr

DATA t1;
input a b;
cards;
1 2
1 4
2 6
3 4
3 3
5 6
4 8
;
run;
/*V9*/
proc sort DATA=t1 out=tr_tr nodupkey dupout=tr_dup; BY a;run;
/*V8 ou V9*/
proc freq DATA=t1 ; TABLES a/out=t1_fr(WHERE=(COUNT>1)); run;
proc sql;
CREATE TABLE t1_v9_dup AS
SELECT al_1.*
FROM t1 al_1, t1_fr al_2
WHERE al_1.a=al_2.a;

- 34 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

quit;

Comment supprimer une table SAS ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Suppression de toutes les tables de l'espace work :

proc datasets lib=work KILL;


run;
quit;

Suppression de la table T1 de l'espace work :

proc datasets lib=work ;


DELETE t1;
run;
quit;

Comment ajouter du texte dans un fichier ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr

/***************************************/
/* Code SAS pour lire le contenu d'un fichier et l'insérer à la fin d'un autre fichier txt*/
/***************************************/

Filename FilInput "G:\fichierlecture.txt";


Filename FilOut "G:\FichierSortie.txt";

DATA _null_;
/* lecture du fichier externe */
length enregis $200;
INFILE FilInput dlm='£'; /
* afin de lire la totalité de l'enregistrement, la probabilité de trouver ce caractère étant limitée */
input enregis;
/* écriture dans le fichier de sortie (comme le mode append) */
file FilOut mod;
put enregis;
run;

Comment lire un fichier de données de type texte contenu dans un fichier de type ZIP ?
Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Si un fichier de données de type texte est compressé au format zip. Il existe un moyen de le lire directement
sans le décompresser. Il suffit d'utiliser l'utilitaire PKUNZIP.EXE de décompression des fichiers au format
ZIP. L'instruction FILENAME comprend l'option PIPE qui permet d'exécuter une commande lors de son
appel.

- 35 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

Exemple de décompression de fichier de type ZIP :

filename fichier pipe 'c:\pkunzip.exe c:\fichier.zip -c' ;


data a ;
infile fichier dlm=',' ; /* le caractère " , " est le délimiteur de champs */
input A $ B $ C $ ; /* le fichier texte contient 3 champs de type caractère */
run ;

L'option " -c " permet d'extraire les données du fichier texte directement vers une console DOS et non vers
le disque dur.
Le Système SAS® lira les informations affichées sur la mire DOS.

Il est important de noter les points suivants :

• il ne faut pas lire les premières lignes de la mire DOS. Elles concernent seulement l'utilitaire
PKUNZIP.EXE. (Pour ce faire, utiliser l'instruction FIRSTOBS= ) ;
• le fichier compressé au format ZIP ne doit contenir qu'un seul fichier texte ;
• ce traitement est plus long lors de la lecture des données.

Comment lire un fichier hébergé par un serveur internet ou


intranet à l'aide d'une instruction FILENAME en version 8 ?
Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Il suffit de déclarer une instruction FILENAME avec l'option URL pour spécifier le lien Web (ou URL) pour
trouver votre fichier.
Exemple de lecture d'un fichier du Web :

// Déclaration d'un FILENAME de lecture avec le lien vers la page à lire.


filename web url 'http://www.addresse/vers/ma/page.html' ;

// Déclaration d'un FILENAME d'écriture.


filename test 'c:\temp\test.html';

data _null_;
n=-1;
infile web recfm=s nbyte=n length=len _infile_=tmp;
input;
file test recfm=n; put tmp $varying32767. len;
run;

Attention
Le programme ci-dessus fonctionne correctement dans le cas où vous n'utilisez pas de machine PROXY
pour vos connexions Intranet/Internet. Dans le cas où vous recevez l'erreur " ERROR: service httpd not
found" , c'est qu'il n'arrive pas à contacter le lien demandé. Dans ce cas, une machine PROXY est utilisée.
Vous devez déclarer son adresse Web lors de l'exécution de l'instruction FILENAME. L'option DEBUG
permet juste d'avoir plus d'informations sur la lecture du fichier et n'est pas indispensable.

Exemple :

filename web url 'http://www.addresse/vers/ma/page.html'

- 36 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

proxy='http://proxy2.eur.sas.com.:3128/' debug ;

En version 8 du Système SAS, on obtient parfois des tables SAS


avec une extension .sd7 et non .sas7bdat. Comment peut-on lire ces
tables en version 8, et comment convertir les fichiers en .sas7bdat ?
Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
1/ Pour pouvoir lire ces tables en version 8 , il faut créer une bibliothèque particulière avec l'option
SHORTFILEEXT.
Exemple :

libname mylib 'c:\mysasdata' shortfileext;

2/ Pour convertir une table .sd7 en .sas7bdat, il suffit d'utiliser une proc copy pour convertir les données
de la bibliothèque créée ci-dessus vers une bibliothèque 'standard'.
Exemple :

libname mylib 'c:\mysasdata' shortfileext;


libname mylibfinal 'c:\newdata';

proc copy in=mylib out=mylibfinal;


run;

Comment remplacer toutes les valeurs manquantes d'une table par 0 ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Vous pouvez utiliser un ARRAY qui référence toutes les variables numériques. L'avantage principal de cette
méthode est double :

• il n'est pas nécessaire de connaître le nom des variables ;


• il n'est pas nécessaire de connaître le nombre de variables.

Le macroprogramme ci-dessous prend en paramètre le nom de la table SAS en entrée.

%Macro M_Zero (ds=) ;


data &ds.2 (drop=_i);
set &ds ;
array A_VarNum[*] _NUMERIC_ ;

do _i=1 to dim( A_VarNum ) ;


If A_VarNum (_i)=. then A_VarNum (_i)=0 ;
End ;
run ;

- 37 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

%Mend ;

Comment créer une table SAS à partir de plusieurs fichiers texte, stockés dans un
même répertoire, en commençant la lecture des observations sur la nième ligne ?
Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
L'utilisation d'un FILENAME avec l'option PIPE va vous permettre dans un premier temps d'utiliser la
commande DOS pour lister les fichiers.
Ensuite, vous devez combiner les options FILEVAR et FIRSTOBS de l'instruction INFILE.
L'exemple de code ci-dessous liste l'ensemble des fichiers texte présents dans le répertoire « c:\temp\text
files », puis lit ces fichiers à partir de la 2e ligne. Tous les fichiers ont la même structure.

%let dir=%bquote(")C:\temp\text files%bquote(");


filename test pipe "dir &dir /b /s";

data f2r;
infile test truncover;
input ftr $200.;
infile test filevar=ftr truncover end=done firstobs=2;
do while(not done);
input var1 var2 var3 ;
output;
end;
run;

Comment mettre à jour un programme ouvert et


modifié par plusieurs personnes en même temps ?
Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Par défaut, lorsque le même programme est ouvert et modifié simultanément via plusieurs applications
par une ou plusieurs personnes, le .sas physique est écrasé dès qu'il est sauvé depuis n'importe laquelle
des applications. Chacun travaille sur son programme, sans savoir que le programme a pu être modifié.
L'option EEFILECHANGEUPDATES permet d'être alerté lorsque le programme ouvert dans la session SAS
en cours a été modifié.

Cette option s'ajoute dans votre fichier de configuration C:\Program Files\SAS\SASFoundation


\9.2\SASV9.cfg (ou bien l'un des fichiers se trouvant sous le dossier NLS): EEFILECHANGEUPDATES.

Lors de la création d'un fichier texte, l'instruction « put var1 var2 » insère
un espace entre les champs. Comment ne pas avoir cet espace ?
Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Vous pouvez utiliser cette syntaxe :

Put var1 +(-1) var2;

- 38 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

Exemple :

data _null_ ;
file "c:\temp\test.txt" ;
var1="aaa" ;
var2="111" ;
put var1 +(-1) var2;
run ;

Contenu de test.txt :
aaa111

Pour en savoir plus : depuis le sommaire de l'aide en ligne, sélectionner SAS Products > Base SAS > SAS
Language dictionary > Dictionay of language elements > Statements > PUT Statement > Column Pointer
Controls.

Comment importer des données d'un fichier texte dans


SAS en conservant les variables caractères à point ?
Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Il faut utiliser le format $char2. permettant à SAS d'interpréter le caractère ?.' ainsi que l'option TRUNCOVER
pour revenir à la ligne lors de l'importation des données.

Exemple :

À partir du fichier présent dans C:\FAQ.txt contenant les données suivantes :

var1 var2
1 .
2 .
3 y
4 z
5 r
6 r

data test;

infile 'C:\FAQ.txt' delimiter='09'x firstobs=2 truncover;


input var1 var2 $char2. ;

run;

Comment mettre à jour une table existante par rapport


à une autre table, tout en conservant les index ?
Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Voici un exemple pour effectuer la mise à jour d'une table maitresse avec une autre table en gardant les
index.

- 39 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

-----------------------------------------------

/* La table maitresse. */
data BIG ;
X = 1 ; Y = 'A' ; output ;
X = 2 ; Y = 'B' ; output ;
X = 3 ; Y = 'C' ; output ;
run ;

/*Création l'index */
proc datasets lib=work nolist ;
modify BIG ;
index create X ;
quit ;

/* Depuis la table SMALL,


L'observation avec X=3 doit être mise à jour,
celle avec X=999 est une nouvelle observation */
data SMALL ;
X = 3 ; Y = 'Z' ; output ;
X = 999 ; Y = 'Z' ; output ;
run ;

/*Creation l'index */
proc datasets lib=work nolist ;
modify SMALL ;
index create X ;
quit ;

/* Mise à jour de la table "maitre". l'index est conservé... */


data BIG;
set SMALL(rename=(Y=tY));
by X;
modify BIG key=X;
if _iorc_=%sysrc(_sok) then do;
Y=tY;
_error_=0;
put 'in replace';
replace BIG;
end;
else if (%sysrc(_dsenom)) then do;
_error_=0;
Y=tY;
put 'in insert';
output BIG;
end;
run;

-----------------------------------------------

- 40 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

Sommaire > SAS BASE > Caractères


Comment convertir une variable de type caractère en variable de type numérique ?
Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
À l'aide de la fonction "input" vous pouvez convertir une variable de type caractère en variable numérique.

DATA base;
INPUT var1$ var2;
CARDS;
10 5
3 8
;
DATA base2;
SET base;
var3=input(var1,3.);
RUN;

Comment concaténer deux chaînes de caractères ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
La fonction !! permet ce genre de manipulation comme vous le montre l'exemple suivant :

DATA base;
INPUT var1$ var2$;
cards ;
Hello world
;
DATA base2;
SET base;
var3=var1!!var2;
RUN;

Comment supprimer les blancs d'une chaîne de caractères ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
La fonction "compress" permet ce genre de manipulation :

DATA base;
INPUT var1$ var2$;
cards ;
Hello world
;
RUN;
DATA base2;
SET base;
var3=var1!!var2;
RUN;
DATA base3;
SET base2;
var4=compress(var3);

- 41 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

RUN;

Comment mettre en majuscules une chaîne de caractères ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
La fonction "upcase" permet cette manipulation comme vous pouvez le voir dans l'exemple suivant :

DATA base;
INPUT var1$ var2$;
cards ;
Hello world
;
RUN;
DATA base2;
SET base;
var3=var1!!var2;
RUN;
DATA base3;
SET base2;
var4=UPCASE(var3);
RUN;

Comment mettre en minuscules une chaîne de caractères ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
La fonction "lowcase" permet la mise en minuscules d'une chaîne de caractères.

DATA base;
INPUT var1$;
cards ;
HEllO
;
RUN;
DATA base2;
SET base;
var2=LOWCASE(var1);
RUN;

Comment extraire une partie de chaîne de caractères ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
La fonction "substr" permet l'extraction d'une partie d'une chaîne de caractères, ces paramètres sont les
suivants : substr(maChaine,debutExtraction,longueurExtraction).

DATA base;
INPUT var1$;
cards ;
HEllO

- 42 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

;
RUN;
DATA base2;
SET base;
var2=SUBSTR(var1,2,3);
RUN;

Comment stocker une variable en la forçant avec des zéros devant ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Par exemple disposant de valeur '123456' censée être stockée sur 9 caractères on désire avoir '000123456'.

Pour résoudre ce problème, on peut utiliser le format ZX., où X désigne le nombre total de chiffres avec
les zéros.

DATA t;
i=123456;
format i_bis Z10.;
i_bis=i;
run;

En SAS9, comment extraire la position d'un mot d'une


chaîne de caractères sans être sensible à la casse ?
Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Vous devez utiliser la fonction FIND avec l'option « i ».

La fonction FIND cherche la première occurrence du mot spécifié en paramètre et retourne sa position.
L'exemple ci-dessous compare les résultats obtenus avec la fonction FIND et la fonction INDEX (présente
depuis la V8). La fonction index étant elle sensible à la casse.

Exemple :

data _null_;
/* cherche le mot trouve, insensible à la casse */
A=find('où se trouve le mot recherché','TROUVE','i');
put A=; /* écrit la valeur de A */

/* cherche le mot trouve en majuscule uniquement */


B=index('où se trouve le mot recherché','TROUVE');
put B=; /* écrit la valeur de B */
run;

Résultats :

A=7

- 43 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

B=0

Dans une chaîne de caractères, comment mettre la première lettre


de chaque mot en majuscule et les autres lettres en minuscule ?
Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Il faut utiliser la fonction PROPCASE.

Exemple :

Data Faq ;
X= 'ALLO SUPPORT';
Y=propcase(X);
Put X= Y= ;
Run;

Résultat :

• X=ALLO SUPPORT
• Y=ALLO SUPPORT

Documentation : Using the PROPCASE function

- 44 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

Sommaire > SAS BASE > Les formats


Comment supprimer un format par programme SAS ?
Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Pour un format numérique :

proc catalog cat=work.formats;


delete NomDuFormat/et=FORMAT;
run; quit ;

Pour un format alphanumérique :

proc catalog cat=work.formats;


delete NomDuFormat/et=FORMATC;
run; quit ;

Comment obtenir la liste des formats présents dans une bibliothèque ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Il faut utiliser la procédure CATALOG.

Exemple :

Libname FAQ 'C:\';

/* création des formats de tests */


proc format library=FAQ.Formats;
value $essai
"O" ="oui"
"N" ="non";
run;

/* Pour avoir les noms des formats présents dans le libname FAQ */
proc catalog cat=FAQ.formats;
contents;
quit;
run;

Exemple :

/* Pour voir plus en détail les modalités


de chaque format de la bibliothèque */
Proc format lib=FAQ fmtlib;
run;

- 45 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

Sommaire > SAS BASE > Dates


Comment obtenir la date du jour ?
Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
En appelant la fonction date() : tout simplement.

DATA base;
ATTRIB variable FORMAT=DDMMYY10. LABEL="Ma date";
variable=date();
RUN;
PROC PRINT DATA=base LABEL;
RUN;

Comment extraire une date/heure d'une variable datetime ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Pour récupérer la date, il suffit d'utiliser la fonction du module Base SAS : DATEPART.
Pour récupérer l'heure, il suffit d'utiliser la fonction du module Base SAS : TIMEPART.

data _null_;
variable = '30JUL1970:20:30:00'dt;
date = datepart(variable);
heure = timepart(variable);
put "la date est " date ddmmyy10.;
put "l'heure est " heure time5.;
run;

Le journal (log) indique :


la date est 30/07/1970
l'heure est 20:30

Comment créer un format pour afficher la date ou un datetime au format dd/mm/yyyy ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Vous devez exécuter une Proc Format avec une instruction Picture suivie de l'option datatype=date ou
datetime.
L'ajout de caractères spéciaux dans le type de format permet ensuite de définir l'affichage souhaité avec
le jour, le mois et l'année.

Exemple :

proc format;
picture ddmmyyyy other='%0d/%0m/%0Y' (datatype=date);
picture dtddmmyyyy other='%0d/%0m/%0Y' (datatype=datetime);
run;

data _null_;

- 46 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

dt='18dec2005 12:34:56'dt;
put dt dtddmmyyyy.;
d='14feb2005'd;
put d ddmmyyyy.;
run;

Résultat dans la fenêtre journal :


18/12/2005
14/02/2005

Comment obtenir le numéro du jour de la semaine d'une date donnée ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
La fonction WEEKDAY retourne le numéro du jour de la semaine d'une date SAS, selon le calendrier anglo-
saxon où le dimanche est le 1er jour de la semaine. Il faut donc retirer un jour pour retrouver le calendrier
usuel conforme à la norme ISA 8601.

En voici une illustration :

data Datum;
attrib date format= weekdate17. informat=ddmmyy10. ;

num_day=weekday (date);
If num_day = 1 then num_day = 7;
else num_day=num_day -1;

input date : ddmmyy10.;

cards;
03.01.2011
04.01.2011
05.01.2011
06.01.2011
07.01.2011
08.01.2011
09.01.2011
;
run;

proc print noobs;


run;

Comment calculer les numéros de semaine ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
SAS9 propose plusieurs méthodes pour déterminer le numéro de la semaine en fonction d'une date SAS :

• la fonction WEEK ;
• les formats WEEKU, WEEKV, WEEKW.

Si vous utilisez SAS 8.2 ou une version antérieure, vous pouvez utiliser l'une des méthodes suivantes.

- 47 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

Ce programme calcule le numéro de semaine de la date courante, sachant qu'une semaine commence le
dimanche (norme US) :

data _null_;
Attrib date length=3. label='Date' format=date7. ;
Attrib semaine length=3. label='N° de semaine';

madate = TODAY();
semaine = INTCK('week', INTNX('year',madate,0),madate);
put semaine =;
run;

Ce programme calcule le numéro de semaine de la date courante, sachant qu'une semaine commence le
lundi :

data _null_;

Attrib date length=3. label='Date' format=date7. ;


Attrib semaine length=3. label='N° de semaine';

date = TODAY();
semaine=-1;
cpt=0;
do until (semaine>0);
semaine=int((7*int((date+3156192)/7)+10 - mdy(1,1,year(date)+1 - cpt) - 3156192)/7);
cpt+1;
end;
output;
put semaine= ;
run;

- 48 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

Sommaire > SAS BASE > Calculs


Comment réaliser un arrondi ?
Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
La fonction "Round" permet de réaliser un arrondi.

DATA base;
INPUT var1;
cards ;
10.12345
;
RUN;
DATA base2;
SET base;
var2=ROUND(var1,0.01);/*Arrondi*/
RUN;

Comment utiliser des fonctions mathématiques classiques ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Le programme ci-dessous va vous montrer le mode de fonctionnement des fonctions logarithme népérien,
exponentielle, valeur absolue et racine carrée.

DATA base;
INPUT var1 var2;
cards ;
10 -2
;
RUN;
DATA base2;
SET base;
var3=LOG(var1);/*Logarithme népérien*/
var4=EXP(var1);/*Exponentielle*/
var5=SQRT(var1);/*Racine carrée*/
var6=ABS(var2);/*Valeur absolue*/
RUN;

Comment générer une variable numérique ou caractère de manière aléatoire ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
- Pour générer un numérique aléatoire, vous pouvez utiliser la fonction RANUNI.

Exemples :

Length var1 $ 10 ;
Var1=ranuni(0) ;
Var1=20*ranuni(0) ;
Var1=ceil (32*ranuni(0)) ;

- 49 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

- Pour générer une variable caractère contenant des chiffres et des lettres, vous pouvez utiliser ce
programme :

Length var1 $ 10 ;
do j=1 to 10;
var1=compress(var1)||trim(scan('A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,0,1,2,3,4,5,6,7,8,9',
ceil(36*ranuni(0))));
end;

- Pour générer une variable caractère contenant des lettres, vous pouvez utiliser le programme ci-dessus,
en ne gardant que l'alphabet dans la première partie de la fonction SCAN, comme ceci :

Length var1 $ 10 ;
do j=1 to 10;
var1=compress(var1)||trim(scan('A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z',
ceil(26*ranuni(0))));
end;

- 50 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

Sommaire > SAS BASE > Autres


Comment lire des données depuis un port série ou parallèle du PC ?
Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Pour rappel :

• '1a'x est la valeur hexadécimale de fin de fichier (EOF) ;


• '0D0A'x est la valeur hexadécimale de fin de page et de fin de ligne ;
• '0A'x est la valeur hexadécimale de fin de ligne ;
• F signifie Fixed format.

Filename port commport 'lpt1:'; /* OU Filename port commport 'com1:';*/

DATA acquisition;
INFILE port lrecl=1 recfm=f unbuffered;
input i s;
IF i = '1a'x then stop;
run;

Lors de l'exécution d'un programme en batch, dès qu'une erreur


intervient, pourquoi la suite du programme n'est-elle pas exécutée ?
Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Parce que, par défaut, en batch, SAS est démarré en mode « Syntaxcheck ». Donc, dès qu'une erreur est
rencontrée, l'option obs est positionnée à 0 (toutes les tables créées seront donc vides) et le code est
simplement validé mais non exécuté. Pour obtenir le même comportement en batch qu'en interactif, il faut
ajouter l'option no$syntaxcheck à l'appel de SAS.

Comment crypter un mot de passe utilisateur depuis SAS 9 ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Vous pouvez être amenés à spécifier des mots de passe d'utilisateur lorsque vous travaillez avec SAS. Pour
crypter ces mots de passe, vous pouvez utiliser la procédure PWENCODE disponible depuis SAS 9.1.

PROC PWENCODE in="your-pw";


RUN;

Aide en ligne The PWENCODE ProcedureAide support SAS 16

- 51 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

Sommaire > Macro Langage

- 52 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

Sommaire > Macro Langage > Généralités


Comment procéder pour que plusieurs utilisateurs puissent accéder
de façon simultanée à un catalogue de macroprocédures compilées ?
Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
En ajoutant l'option access=readonly au niveau de la définition de la bibliothèque où est stocké le catalogue
SASMACR.

Comment créer une boucle avec un incrément décimal ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Classiquement la réponse à cette question devrait à peu près être équivalente à une boucle DO soit :

%DO i=1 %TO 10 %BY 0.1


%END;

Cependant les boucles %DO n'acceptent, contrairement aux boucles DO, que des incréments entiers. Pour
résoudre ce problème, on peut utiliser le code suivant :

%macro test;
%let i=1;
%do %until ( &i >= 5);
%put &i;
%let i =%sysevalf(&i+0.1);
%end;
%mend;
%test;

Quelle est la différence entre les notions de macro,


macrovariable, macroprogramme et macrofonction ?
Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
1) Une macrovariable est variable informatique créée par le logiciel SAS. Les macrovariables ne possèdent
qu'un seul type, le type caractère.

Certaines macrovariables sont créées automatiquement par le logiciel SAS et d'autres peuvent être créées
par l'utilisateur.

Exemple :

%LET maVar=World;

La macrovariable "maVar" contient la chaîne de caractères "Hello".

- 53 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

Pour faire référence à une macrovariable vous devez la faire précéder du caractère "&".

2) Une macrofonction est une fonction pouvant être utilisée dans l'environnement macro du logiciel SAS.
Une macrofonction commence toujours par le caractère '%'.

Exemple :

%PUT Hello;

La macrofonction %PUT indique au logiciel SAS qu'il doit "imprimer" ce qui suit la fonction dans la fenêtre
"Journal", soit "Hello".

%PUT Hello &maVar;

La macrofonction %PUT affiche dans la fenêtre "Journal" "Hello World".

3) Un macroprogramme (ou macro) est un programme créé par un utilisateur. Ce programme ne peut être
utilisé que dans l'environnement macro du logiciel SAS.

Un macroprogramme commence toujours par le mot "%MACRO" et finit toujours par le mot "%MEND;"

/*Elles commencent par*/


%MACRO maMacro;
/*et finissent par*/
%MEND;

À quoi sert une macrovariable ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Une macrovariable sert à stocker une information pour pouvoir la réutiliser. Une macrovariable peut être
initialisée par un %LET ou par un CALL SYMPUT dans une table.

%LET maVar=base;
PROC PRINT data=&maVar;
RUN;

DATA res;
SET base;
CALL SYMPUT('MaVar'_N_,var);
RUN;

Dans le dernier exemple, on va créer autant de macrovariables que de valeurs de la variable 'var'. Si 'var'
prend 10 valeurs MaVar1 prendra la première valeur de var, MaVar2 prendra la 2ème valeur de var, ..., MaVarn
prendra la nième valeur de var.
Il est important de signaler que les macrovariables sont des valeurs stockées en mémoire et non pas dans
des tables.

- 54 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

À quoi sert un macroprogramme ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Un macroprogramme sert à automatiser une suite de tâches récursives.

%MACRO test(var);
proc PRINT DATA = &var;
run;
proc means data=&var;
run;
%MEND test;

Pour utiliser votre macroprogramme vous devez :

• sélectionner le code de votre macroprogramme ;


• cliquer sur F8 pour compiler votre macroprogramme ;
• taper le code ci-dessous :

%test(maTable);

• cliquer sur F8 pour exécuter (utiliser) votre macroprogramme.

- 55 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

Sommaire > Macro Langage > Macrovariables


Comment récupérer le nombre d'observations d'une table dans une macrovariable ?
Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Pour récupérer le nombre d'observations, il faut utiliser l'option NOBS dans l'instruction SET.
Pour créer une macrovariable, il faut utiliser la fonction CALL SYMPUT.

options symbolgen ;

data _null_;
set sashelp.class nobs=nobs ;
call symput ("nbobs",nobs);
run;

%put "Le nombre d'observations de la table est :" &nbobs ;

Comment utiliser les variables d'environnement système dans un programme SAS ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
La fonction "SYSGET" permet de récupérer le contenu d'une variable d'environnement Système. Voici un
exemple où l'on récupère le nom de l'utilisateur (variable Windows "USERNAME") dans une variable SAS.

data _null_;
length MONUSER $50;
MONUSER=sysget(trim("USERNAME"));
put MONUSER=;
run;

Le principe est le même pour les variables Unix :

MAVARIABLE=sysget(trim("$HOME"));

Comment utiliser la macrovariable SYSDATE ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
La macrovariable SYSDATE renvoie la date système courante en utilisant le format DATE7.
La date système "January 5, 2000" sera donc codée "05JAN00".
Exemple :

data _null_ ;
date = input("&sysdate",date7.) ;
put date ddmmyy8. ;
run ;

Résultat : 05/01/00

- 56 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

Avec le passage à l'an 2000, lorsque l'option YEARCUTOFF n'est pas positionnée, cela peut engendrer des
problèmes si des tests sont réalisés par rapport à cette date.
En effet, sans le positionnement de YEARCUTOFF, la valeur de l'exemple précédent sera interprétée comme
la date 05/01/1900.
Pour que la valeur renvoyée par SYSDATE soit interprétée correctement, il suffit de positionner l'option
YEARCUTOFF à une valeur qui vous convient.

Exemple :

options yearcutoff = 1920 ;


data _null_ ;
date = input("&sysdate",date7.) ;
put date ddmmyy10. ;
run ;

Résultat : 05/01/00

À partir des versions 6.12 TS060 et 6.09E TS470, vous pouvez aussi utiliser la macrovariable SYSDATE9
qui retourne l'année sur quatre digits.

Comment créer des macrovariables à partir d'une table SAS ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr

DATA t;
input a $;
cards;
a
b
c
;
run;
%macro cration_macro_var;
DATA _null_; SET t;
call symput('var'||left(trim(_n_)),a);
call symput('nb_ligne',_n_);
run;
%do i =1 %TO &nb_ligne;
%put Valeur &i &&var&i..;
%end;
%mend;
%cration_macro_var;

Comment supprimer une macrovariable ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
La fonction %SYMDEL permet la suppression d'une macrovariable spécifique. Le code ci-dessous explicite
cette notion :

%LET test=Bonjour;/*Déclaration et initialisation de la macrovariable test*/


%PUT &test;/*Affichage de la macrovariable test*/

- 57 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

%PUT _USER_;/*On liste les macrovariables de l'utilisateur*/


%SYMDEL test;/*Suppression de la macrovariable test*/
%PUT _USER_;/*On liste les macrovariables de l'utilisateur*/

Comment lister toutes les macrovariables de votre session ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
En exécutant la ligne ci-dessous vous listerez toutes les macrovariables de votre session, c'est-à-dire les
macrovariables de l'utilisateur et les macrovariables automatiquement générées par SAS.

%PUT _ALL_;

Comment lister les macrovariables créées automatiquement par SAS ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
En exécutant la ligne ci-dessous vous listerez les macrovariables générées automatiquement par SAS.

%PUT _AUTOMATIC_;

Comment connaître les macrovariables créées par un utilisateur ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
En exécutant la ligne ci-dessous vous listerez les macrovariables créées par l'utilisateur.

%PUT _USER_;

Quel est le type d'une macrovariable ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Les macrovariables n'ont qu'un seul type : le type caractère. L'exemple suivant illustre cette notion :

%LET v1=20;
%LET v2=10;
%LET v3=&v1-&v2;
%PUT &v3;

La macrovariable "v3" est égale à la chaine de caractères 20-10 et non à 10 (l'opération 20-10).

- 58 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

Le caractère "&" étant un caractère privilégié de SAS, il faut utiliser une fonction spécifiant que le texte
rentré dans la macrovariable comporte un caractère spécial. La macrofonction %nstr() permet ce genre de
manipulation.

%let macrovariable = %NRSTR(&exemple);


%put &macrovariable;

Comment stocker les valeurs d'une macrovariable dans une table ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
L'instruction symget permet ce genre de manipulation. L'exemple suivant explicite son fonctionnement :

DATA base;
INPUT var1 var2;
cards ;
10 11
15 22
;
RUN;
%MACRO test();
DATA base2;
SET base;
CALL SYMPUT (COMPRESS("mavar"||left(put(_N_,4.))),var1);
varId=symget("mavar"||left(put(_N_,4.)))+2;
RUN;
%MEND test;
%test();

Comment afficher la valeur d'une macrovariable ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
L'instruction %PUT permet d'afficher la valeur d'une macrovariable dans la fenêtre log.

%LET maVar = Hello World;


%PUT &maVar;

On aura alors Hello World d'affiché dans la fenêtre log.

Comment lister les noms des tables d'une bibliothèque dans une macrovariable ?
Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
À l'aide du programme ci-dessous vous pourrez lister les noms des tables contenues dans la bibliothèque
test2. Créons tout d'abord la bibliothèque et les tables :

LIBNAME test2 "C:/";

- 59 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

DATA test2.b1;
INPUT X1 X2;
CARDS;
0 1
2 4
;
RUN;
DATA test2.b2;
INPUT X3 X4;
CARDS;
2 5
6 3
;
RUN;

Pour identifier les noms des tables et leur nombre procédez comme suit :

proc sql noprint;;


SELECT trim(libname)||"."||trim(memname) INTO :liste separated BY ' '
FROM sashelp.vstable
WHERE libname = upcase("Test2");
SELECT count(*) INTO :nb_table
FROM sashelp.vstable
WHERE libname = upcase("Test2");
quit;

Remarque : la description des tables est contenue dans sashelp.vstable.

On récupère les sorties dans des macrovariables :

%put Liste des TABLE &liste ;


%put Nombre de TABLE &nb_table;

Comment exécuter une procédure SAS à partir d'une macrovariable ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
À l'aide de la macrofonction %str() vous pouvez stocker votre procédure SAS dans une macrovariable pour
ensuite l'exécuter. Par exemple :

DATA base;
input v1;
cards;
1
2
;
RUN;
%LET test = %str(PROC PRINT DATA=base NOOBS;RUN;);

- 60 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

&test;

Comment stocker des caractères spéciaux dans une macrovariable ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Les caractères ";" et "'"étant des caractères privilégiés de SAS, il faut utiliser une fonction spécifiant que
le texte rentré dans la macrovariable comporte un caractère spécial. La macrofonction %str() permet ce
genre de manipulation.

%LET test=%str(Hello;);
%PUT &test;

Comment faire un calcul à l'aide de macrovariables ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Le type des macrovariables étant le texte, il faut préciser à SAS lorsque vous voulez que celui-ci fasse le
calcul demandé. Les macrofonctions %EVAL() et %SYSEVALF() permettent cette manipulation.

La différence entre les deux se situe au niveau du résultat de l'opération. Si celui-ci est un nombre entier
vous utiliserez %EVAL() sinon vous utiliserez %SYSEVALF(). L'exemple suivant illustre cette notion :

%LET v1=15;
%LET v2=10;
%LET v3=%EVAL(&v1-&v2);
%PUT &v3;
%LET v4=%SYSEVALF(&v1/&v2);
%PUT &v4;

- 61 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

Sommaire > Macro Langage > Macrofonctions


Comment transformer / remplacer des caractères dans
une macrovariable ou dans une chaine de caractères ?
Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Il est possible de changer un ou plusieurs caractères dans une macrovariable en utilisant la fonction
translate(nom_de_variable,'caractère_de_remplacement','caractère_à_remplacer').

%let variable = titi;


%let variable_tr = %sysfunc(translate(&variable,'o','i'));
%put &variable_tr;
toto

Voir aussi la fonction tranwrd pour modifier toutes les occurrences d'un mot dans une variable.

Pour changer un ou plusieurs caractères dans une chaine de caractères d'une base de données vous
pouvez utiliser les mêmes fonctions :

DATA _null_;
x=translate('SALUT LA SOCIETE', 'C','S');
put x=;
run;

Dans cet exemple, on remplace tous les 'S' de la chaine 'SALUT LA SOCIETE' par des C

- 62 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

Sommaire > Macro Langage > Macroprogrammes


Comment sauvegarder un macroprogramme ?
Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Pour sauvegarder un macroprogramme vous devez utiliser les options MSTORED et STORE. Pour
sauvegarder votre macroprogramme dans un espace de travail défini par une bibliothèque SAS vous devez
ajouter l'option SASMSTORE.

Le code ci-dessous illustre cette notion :

LIBNAME monEsp "c:/";


OPTION MSTORED SASMSTORE=monEsp;
%MACRO test / STORE;
%PUT Hello;
%MEND;

Comment sécuriser votre code enregistré dans un macroprogramme ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Voici comment sécuriser votre code enregistré dans un macroprogramme. Ceci fonctionne en 9.1 et 9.2.

Les résultats des étapes désignées par "la lecture du contenu " sont visibles dans la LOG.

Compilation du code :

options mstored sasmstore=sasuser;


%macro nonsecure/store; /* La macro est visible */
DATA _null_;
x=1;
put "Cette macro est générée SANS protection";
run;
%mend nonsecure;
%nonsecure

Lecture du contenu :

filename maccat catalog 'sasuser.sasmacr.nonsecure.macro';


DATA _null_;
INFILE maccat;
input;
list;
run;

Compilation du code :

%macro secure/store secure; /* Cette macro est chiffrée */


data _null_;
x=1;
put "Cette macro est générée AVEC protection.";

- 63 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

run;
%mend secure;
%secure

Lecture du contenu :

filename maccat catalog 'sasuser.sasmacr.secure.macro';


DATA _null_;
INFILE maccat;
input;
list;
run;

Comment retourner/assigner le résultat d'un


macroprogramme utilisateur à une macrovariable ?
Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Lorsque vous programmez un macroprogramme, il se peut que vous souhaitiez récupérer le traitement de
ce macroprogramme dans une macrovariable spécifique. Il faut préciser ceci dans le macroprogramme en
rajoutant simplement ce que l'on veut récupérer ainsi :

%macro concat(var1,var2);
*Traitement des macrovariables placées en paramètres, par exemple une concaténation ;
%let tmp1 =%sysfunc(compress(&var1,%str(%")));
%let tmp2 =%sysfunc(compress(&var2,%str(%")));
%put "&tmp1,&tmp2"; *Affiche le résultat de la concaténation des macrovariables temporaires tmp1 et
tmp2;
"&tmp1,&tmp2"; *Précise les éléments à renvoyer par le macroprogramme;
%mend;

Il est possible d'attribuer le résultat directement à une autre macrovariable avec la commande suivante :

%let maVarResultat = %concat(&var1,&var2);

On peut ensuite réutiliser la variable :

%let var1 = "Hello";


%let var2 = "World";
%let maVarResultat = %concat(&var1,&var2);
%put Le résultat renvoyé par la macro '%concat' est : &maVarResultat;

Affiche : "Hello,World"

- 64 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

Sommaire > SAS AF et fomulaires

- 65 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

Sommaire > SAS AF et fomulaires > Généralités


Comment construire des applications avec des formulaire (type ACCESS) ?
Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Deux solutions sont possibles :

• le module SAS/AF permet, par l'intermédiaire du langage SCL, la création d'applications de type clic
bouton ;
• les macrofonctions %WINDOWS permettent de faire des interfaces graphiques.

- 66 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

Sommaire > SAS AF et fomulaires > SAS AF


Comment proposer à l'utilisateur (d'une application AF par ex) une session : sans titre,
sans icône, sans menu, sans bouton de réduction, sans possibilité de fermer la fenêtre ?
Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Pour cela,

• lancer une session, puis dans Options => Préférences, sélectionner OFF pour les items commands
et Tools ;
• dans les propriétés de l'icône SAS rajouter (après l'invocation de l'autoexec.sas) la syntaxe
suivante :

-SASCONTROL NOMINMAX NOSYSTEMMENU -ASWCONTROL NOTITLE -NOAWSMENU ;

• Fermer SAS. Relancer SAS. Il n'existe plus aucun moyen de fermer/réduire quoi que ce soit.

Nota : avant de mettre en place ce genre de blocage, il convient de s'assurer que l'appli d'ouverture possède
bien un bouton de fermeture de SAS.

Comment peut-on exécuter une application AF en batch ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
La procédure DISPLAY avec l'option BATCH permet d'exécuter une application en batch.

Syntaxe :

PROC DISPLAY CATALOG= libref.catalog.entry.type BATCH;


RUN;

Comment peut-on insérer une image de fond dans une frame ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Le code SCL suivant vous permet d'insérer une image en fond de frame.

INIT :
instwid = makelist() ;
instreg = makenlist('LRX','LRY','ULX','ULY') ;

rc = setnitemn(instreg,100,'LRX') ;
rc = setnitemn(instreg,100,'LRY') ;
rc = setnitemn(instreg,0,'ULX') ;
rc = setnitemn(instreg,0,'ULY') ;
rc = setniteml(instwid,instreg,'_region_') ;

image = loadclass('sashelp.fsp.image.class');

- 67 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

call send (image, '_NEW_', objid,instwid);

call send (objid, '_READ_FILEPATH_', 'C:\sas612\setup.bmp');


Return ;

Dans un objet Data Table, comment peut-on mettre des lignes complètes en couleur ?
Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
En utilisant la méthode _SET_VIEWER_ATTRIBUTE_ au niveau de l'entrée SCL de l'objet Data Table
(Modèle), vous pourrez mettre toutes les cellules d'une ligne en couleur.

Le code SCL suivant, associé à l'objet Data Table, permet de mettre toutes les lignes où sexe='M' en jaune.

INIT:
if sexe="M" then
call send(_viewer_,'_SET_VIEWER_ATTRIBUTE_','_ALL_', 'BCOLOR','YELLOW');
else
call send(_viewer_,'_SET_VIEWER_ATTRIBUTE_','_ALL_', 'BCOLOR', 'BACKGROUND');
Return;

Quelle est la différence entre un bloc SUBMIT et un bloc SUBMIT CONTINUE ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Avec une instruction SUBMIT CONTINUE, le code de la section n'est pas chargé en mémoire. Il est exécuté
immédiatement.

- 68 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

Quand une instruction SUBMIT est rencontrée, le code placé entre SUBMIT et ENDSUBMIT est chargé dans
le buffer. Il n'est pas exécuté. Pour libérer le buffer et exécuter le code, il faut utliser une autre section
SUBMIT - ENDSUBMIT avec le paramètre CONTINUE ou attendre l'exécution de la section TERM.

Que faut-il faire pour éviter que, dans certains cas, l'exécution
d'une ligne SCL ne soit pas terminée avant la suivante?
Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
La routine CALL WAIT(seconds) permet de synchroniser votre code SCL. Elle suspend l'exécution des
prochaines instructions du programme.

Comment associer des couleurs à votre code SCL ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Pour des raisons de maintenance et de clarté, il est intéressant dans son code SCL de distinguer les blocs
étiquettes (INIT, MAIN, TERM et autres), les blocs SUBMIT ,les blocs de commentaires ou autres textes par
des couleurs différentes.

Suivant que vous ayez saisi le texte ou non, il existe deux moyens de colorier son texte :

a) Si le texte est déjà saisi :

Sélectionner le texte puis dans la boîte de commande saisir : color mtext votre_couleur.

Le nom de la couleur doit être en anglais bien sûr!

b) Avant de saisir le texte :

Touche Echap + initial de la couleur désirée

R : rouge

G : vert

Y : jaune

B : bleu

K : noir

C : cyan

etc.

- 69 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

Maintenant, c'est à vous de définir votre norme de programmation.

Comment obtient-on une observation sur n lignes dans un objet DATATABLE ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Pour qu'une observation puisse être représentée sur plusieurs lignes dans l'objet DATATABLE, il est
nécessaire d'inclure dans votre code SCL les routines CALL SEND suivantes :

· /* Récupération de l'identifiant du DATATABLE */


call send(_SELF_,'_get_widget_','datatab',tableid);

· /* Chargement du DATATABLE à partir de la table NOM.TABLE */


call send(tableid,'_set_dataset_','nom.table','browse');

· /* autorise l'affichage des observations sur plusieurs lignes */


call send( tableid, '_SET_TEXT_WRAP_','Y', 'Y' );

· /* positionne le nombres de caractères en lignes */


call send( tableid, '_SET_COLUMN_ATTRIBUTE_', 'STATE1','DISPLAY_WIDTH',40);
call send( tableid, '_REFRESH_');

Pour garder des performances acceptables, les dimensions des cellules sont calculées en fonction de la
partie visible de la première ligne du DATATABLE. Cela peut entraîner des troncatures si la première ligne
ne contient pas la variable la plus longue.

Quelle différence existe-t-il entre NOBS et NLOBS avec la fonction ATTRN ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
La fonction ATTRN(id_table, param) retourne le nombre d'observations dans la table quand param vaut
'NOBS' ou NLOBS'.

Une table contient un nombre d'observations physiques (NOBS) qui se décomposent en nombre
d'observations utiles (NLOBS) et en nombre d'observations marquées pour suppression (NDEL).

NOBS = NLOBS + NDEL .

Cf. : SAS® SCREEN CONTROL LANGUAGE (55147) page 238-239 et l'AIDE EN LIGNE de la fonction ATTRN.

Comment la procédure de construction de la clause WHERE de


SQL QUERY WINDOW s'utilise-t-elle dans une application AF ?
Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr

length dsname $17 msg $200;


init:
classid=loadclass('sashelp.sql.qwwhere.class');
id = instance(classid);

- 70 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

sqllist = makelist();
wherelst = makelist();
dsname = 'sasuser.crime';
call send(id,'where_bld',
sqllist,
dsname,
wherelst,
'TITRE',
'','','','',msg ) ;
return ;

Ce code appelle la fenêtre WHERE de SQL QUERY WINDOW et vous permet de construire une clause
WHERE.

Le résultat est retourné dans la liste wherelst.

D'autres méthodes sont utilisables aussi facilement.

Pour plus d'informations, vous pouvez consulter SAS® Guide to the SQL Query Window - Usage et
Reference (55342).

Peut-on exécuter plusieurs applications AF simultanément ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Oui, en utilisant la commande AFA ou AFAPPLICATION.

Comment s'exécute une application AF ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Deux commandes L4G sont possibles pour lancer une application AF :

a)
Proc display c= libref.catalog.appli.type ; run;

b
DM 'AF=libref.catalog.appli.type AF';

Une autre possibilité est d'insérer dans le fichier CONFIG.SAS l'option INITCMD dont la syntaxe générale
est :

- 71 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

-INITCMD 'af c=libref.catalog.appli.type ; '

Comment se rafraîchit une list box ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
La méthode _REPOPULATE_ permet de rafraîchir une list box.

Comment se détermine le nombre d'observations dans une table SAS ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
4 solutions sont possibles :

1 - Utilisation de la fonction ATTRN

Cf. : SAS® SCREEN CONTROL LANGUAGE, REFERENCE, Second Edition, page 238.

Remarque : Une clause WHERE sur une table ne sera pas prise en compte dans le calcul du nombre
d'observations. Pour connaître le nombre d'observations d'une table où une clause WHERE est appliquée,
il faut utiliser la fonction VARSTAT et la statistique N (cf. page 592).

2 - Utilisation de la procédure SQL et d'une macro variable

SUBMIT CONTINUE SQL ;


reset noprint ;
select count(*) into :NOBS from libref.table ;
ENDSUBMIT ;

La macro variable NOBS contiendra le nombre d'observations

3 - Utilisation de la fonction FETCH

Cf. : SAS®SCREEN CONTROL LANGUAGE, REFERENCE, Second Edition, page 331.

Exemple :

dsid=open('libref.table') ;
nobs=0 ;
do while(fetch(dsid) ne -1) ;
nobs=nobs+1 ;
end ;
if dsid then dsid=close(dsid) ;

4 - Utilisation d'une liste SCL.

listid=makelist() ;
nobs=0 ;

- 72 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

rc = lvarlevel(dsid,'varname',nobs,listid) ;
rc = dellist(listid) ;

Comment se distribue une application AF sans copier les programmes sources SCL?
Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Il s'agit d'utiliser la procédure BUILD avec l'instruction MERGE et l'option NOSOURCE.

Syntaxe :

proc BUILD c=sortie ;


merge c = entree nosource;
run;

Quelle est l'option qui permet d'éviter d'avoir le curseur qui clignote dans tous les écrans AF ?
Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Il suffit de rajouter l'option -$hidecursor dans votre config.sas.

Comment peut-on préserver les couleurs du texte lors d'un copier/coller ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Dans votre config.sas, l'option -$rtfcolor permettra de préserver la couleur du texte quand on copie du texte
SAS provenant d'une fenêtre SAS Log ou d'une entrée SCL.

Comment se fait-il que les blocs SUBMIT (ou SUBMIT CONTINUE)


ne soient pas exécutés lorsque l'on passe en TESTAF ?
Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Le mode TESTAF ne prend pas en compte les blocs SUBMIT.

Pour les prendre en compte il faut tester la frame en utilisant la commande suivante :

- 73 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

AF C=lib.cat.nom_frame.frame

Comment insérer un numéro de page dans un document Word via OLE ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
L'exemple ci-dessous permet d'insérer un numéro de page, en bas à droite, dans un document Word
existant (c:\testdoc.doc) via OLE :

hostcl=loadclass('sashelp.fsp.hauto');
call send(hostcl,'_new',wordobj,0,'word.application');
call send(wordobj,'_setproperty','visible','true');
call send(wordobj,'_getproperty','documents',wbsobj);
call send(wbsobj,'_do','open','c:\testdoc.doc');
call send(wordobj,'_getproperty','activedocument',wbsobj);

call send(wbsobj,'_getproperty','Sections',section);
call send(section,'_compute','Item', 1 ,section1);
call send(section1,'_getproperty','Footers',footer);
call send(footer,'_compute','Item', 1 ,footer1);
call send(footer1,'_getproperty','PageNumbers',wdpage);
call send(wdpage,'_compute','add','2','true',test);

call send(wbsobj,'_do','saveas','c:\testdoc.doc',0);
call send(wbsobj,'_do','close');
call send(wordobj,'_do','quit');

Comment récupérer le contenu d'une cellule sélectionnée dans


un objet Table Viewer Control associé à un SAS Data Set Model ?
Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Les méthodes à utiliser pour récupérer la valeur d'une cellule sélectionnée sont les suivantes :

sur le Table Viewer Control:

_getActiveCell(rowlist,collist)

= retourne les coordonnées de la cellule active (dans 2 listes, ici, rowlist et collist)

sur le SAS Data Set Model :

_getColumnText(columnName,text) si il s'agit de texte

OU

_getColumnValue(columnName,value) si il s'agit d'une valeur numérique

Pour effectuer le test (variable caractère ou variable numérique), vous devez au préalable récupérer le type
de la colonne.

- 74 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

Pour ce faire, les méthodes _getDisplayedColumnName et _getColumnNumber sont à votre disposition.

Ci-dessous un exemple de code en utilisant un Pushbutton :

pushbutton:
tableviewer._getActiveCell(rowList,columnList);
if listlen(columnList) gt 0 then do;
columnNumber=getitemn(columnList,1);
sasdataset._getDisplayedColumnName(columnNumber,columnName);
sasdataset._getColumnNumber(columnName,columnNumber);
columnType=sasdataset.columns{columnNumber}.type;
if columnType='C' then do;
sasdataset._getColumnText(columnName,text);
put text=;
end;
else if columnType='N' then do;
sasdataset._getColumnValue(columnName,value);
put value=;
end;
end;
return;

Via SCL, comment justifier les données dans un objet


Table Viewer Control associé à un SAS Data Set Model ?
Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Pour spécifier une justification des données via programmation SCL vous pouvez utiliser l'attribut "
Columns " associé à la propriété " Justification ".

Ci-dessous un exemple de code scl qui justifie à droite l'ensemble des colonnes d'une table :

init:

sds.table="work.b";
do i=1 to dim(sds.columns);
sds.columns{i}.justification='right';
end;

return;

Pour de plus amples informations sur l'utilisation de l'attribut " Columns ", nous vous invitons à consulter
l'aide en ligne du Système SAS.

- 75 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

Vous pouvez effectuer une recherche sur "SAS Data Set Model: columns" pour le fonctionnement de
l'attribut " Columns "; et une recherche sur "Column Properties Class Attributes" pour obtenir la liste des
propriétés modifiables via cet attribut " Columns ".

Comment peut-on ouvrir une page html ou un fichier html depuis une application SAS/AF ?
Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Pour ouvrir une page html ou un fichier html, vous pouvez utiliser la commande WBROWSE.

Le code suivant, appliqué à un Push Button, ouvrira la page www.sas.com :

pushbutton1 :
call execcmdi ('WBROWSE"http://www.sas.com"');
return;

Le code suivant, appliqué à un Push Button, ouvrira le fichier open.html :

pushbutton1 :
call execcmdi ('WBROWSE"C:\tests\ods\open.html"') ;
return;

Comment créer un nouvel 'Event Handler' sur un objet donné ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Dans la fenêtre 'Properties', se positionner sur l'objet voulu, puis aller sur 'Event Handler' et faire un click
droit > New Event Handler.

L'exemple suivant est un 'Event Handler' créé sur un 'Graph Output Control' et est déclenché à partir de
n'importe quel objet (Event Generator=Any Object(*)).

La frame comporte donc une listbox comprenant des noms de graphiques et un 'Graph Output Control'
affichant le graphique sélectionné.

Dans ce cas présent, l' 'Event Handler' va permettre de contrôler à tout moment (Event Generator=Any
Object) que le graphique affiché correspond bien à l'item sélectionné dans la listbox.

Pour se faire le nouvel 'Event Handler' est appliqué sur l'évènement 'SelectedItem Changed' et utilise une
nouvelle méthode 'OnSelectedItemChanged'.

Voici le code utilisé pour la méthode :

import sashelp.classes.attributeChangedEvent.class ;

useclass lib.cat.nom_classe.class ; /* nom de la classe objet à utiliser*/

onSelectedItemChanged: method obj:attributeChangedEvent;

- 76 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

dcl char(83) item, num rc index;


item=obj.value.characterValue;
if item ne '' then do;
rc=cexist(item);
if rc=0 then do;
index=obj.objectID.selectedIndex;
item=nameitem(obj.objectID.items, index);
rc=cexist(item);
end;
if rc=0 then put 'Invalid GRSEG name';
else graph=item;
end;
endmethod;
enduseclass;

Remarque : cet exemple, et donc ce code, proviennent du support du cours NFRA (cours Frame v8).

Comment mettre certaines lignes en couleur dans un Table Viewer Control ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
La méthode _setViewerAttribute peut être utilisée afin de colorer une ligne mais uniquement selon une
condition. Cette méthode doit être placée dans le code SCL du modèle du Table Viewer Control (click droit
sur l'objet, " à Table " ; " Edit SCL "). L'exemple suivant montre comment colorer en orange les observations
de la table SASHELP.CLASS pour lesquelles la variable AGE est supérieure à 13.

length colname $ 8;
dfinit:
dcl list columns={};
call send(_self_,'_get_displayed_columns_',columns);
numcols=listlen(columns);
return;

init:
age:
if age gt 13 then
do i=1 to numcols;
colname=getitemc(columns,i);
_self_._setViewerAttribute(colname,'bcolor','orange');
end;
return;

dfterm:
if columns then columns=dellist(columns);
return;

Comment basculer sur une autre frame déjà ouverte sans l'exécuter une nouvelle fois ?
Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
L'utilisation de la commande NEXT permet de se positionner sur une frame déjà active.

Cette commande s'utilise conjointement avec la valeur donnée à l'attribut Title de la frame concernée.

Ainsi, pour une frame dont le titre est " test ", la frame " test " est rendue active de la manière suivante :

- 77 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

Call ExecCMD("NEXT test") ;

Comment imprimer directement un document via


le SCL sans passer par la fenêtre d'impression ?
Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Vous pouvez utiliser la fonction PREVIEW (cf SAS Screen Control Language, Version 6 Second Edition,
p495).

Exemple de programme SCL :

rc = FILENAME ('fichier', "c:\temp\prog.txt");


rc = PREVIEW ('clear');
rc = PREVIEW ('include', 'fichier');
rc = PREVIEW ('print');

L'option -INITCMD du fichier de configuration ne fonctionne plus


pour le lancement d'une application AF en V8. Comment faire ?
Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Cette option fonctionne toujours, mais doit être OBLIGATOIREMENT placée après l'instruction -dmsexp
dans votre fichier de configuration.

Comment personnaliser l'affichage des colonnes dans un Table Viewer Control ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
L'attribut Columns du SasDataSet Model permet de changer la taille, le format, la couleur etc. des différentes
colonnes.

Exemple permettant de changer la couleur de fond pour toutes les colonnes :

do i=1 to dim(sasdataset1.columns);
sasdataset1.columns{i}.dataBackgroundColor='cyan';
end;

- 78 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

L'attribut Columns accepte uniquement le numéro de la colonne, il est possible de récupérer son numéro
via la méthode _getColumnNumber qui prend le nom de la colonne comme argument.

En version 8, pourquoi ne garde-t-on pas la main lorsque l'on


fait appel à une fenêtre (Output,Graph...) dans un bloc submit ?
Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Si du code SCL est exécuté après un bloc submit, le SCL prend automatiquement la main.

Pour pouvoir rester sur la fenêtre lancée par le bloc submit, il faut rajouter la fonction SCL Call ExecCMD
juste après le bloc submit.

Pour l'exemple ci-dessous, sans le Call ExecCMD, la frame Test est appelée et prend la main (la fenêtre
Output est donc en arrière plan).

INIT:
Submit;
proc print data=sashelp.air;
run;
EndSubmit;

Call ExecCMD('output');
Call display ('sasuser.af.test.frame');
Return;

Est-il possible de créer des boites de dialogues avec des messages d'erreurs ?
Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
En version 8, il est possible d'en créer en utilisant la fonction SCL MESSAGEBOX (cf aide en ligne) dont
voici la syntaxe :

text=MESSAGEBOX(textlist-id<, icon<, buttons<, caption<, default<, right>>>>>);

-textlist-id : nom de la liste qui contient le texte à afficher.

-icon :

'I' : Information or note icon (default)

'?' : Query icon

'!' : Warning icon

'S' : Error icon

-buttons :

- 79 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

'O' : OK (default)

'OC' : OK Cancel

'YN' : Yes No

'YNC' : Yes No Cancel

'ARI' : Abort Retry Ignore

'RC' : Retry Cancel

-caption : title of the messagebox

-right :

'N' : Left justify (default)

'Y' : Right justify

Exemple :

dcl list messagelist={'Voulez vous quitter l'application ?'},char(1) box;


box=MessageBox(messagelist,'?','YN','N');
rc=dellist(messagelist);
if box='Y' then call ExecCMD('end');
else ...

En version 8, comment peut-on afficher une icône sur un Push Button Control ?
Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Au niveau des attributs du Push Button Control, vous devez modifier deux attributs concernant
l'apparence :

- Icon : choix de l'icône

- 80 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

- ButtonStyle : choix de la valeur Icon Only ou Icon with Text (attention, la valeur par défaut est Text Only
ce qui peut expliquer la non visualisation de l'icône)

Comment peut-on faire respecter l'ordre de la tabulation


pour aller d'un objet à un autre dans un écran AF ?
Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Vous devez rajouter l'option $TABNOPBMENU à l'exécution de SAS et la tabulation respectera l'ordre de
définition des objets dans la frame.

- 81 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

Sommaire > SAS AF et fomulaires > Interface graphique avec SAS BASE : %WINDOW
Comment est-il possible de donner à son application AF un " look " Windows ?
Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Il suffit de rajouter l'option -$guifont dans la ligne de commande lançant votre application.

- 82 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

Sommaire > Administration et autres

- 83 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

Sommaire > Administration et autres > Généralités


Comment gérer un groupe dans le gestionnaire de programmes ?
Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr

filename groupe dde 'progman|progman' command;

DATA;
file groupe;

/* créer un groupe de programmes */


put '[CreateGroup(MonGroupeSAS)]';

/* afficher le groupe */
put '[ShowGroup(MonGroupeSAS, 1)]';

/* ajouter une icône dans le groupe SAS*/


put '[Additem(c:\saswin\sas.exe, "Mon SAS System")]';
run;

Comment exécuter des commandes DOS ou SHELL à partir de SAS ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
La commande X permet d'excuter des commandes à partir de SAS :

DATA _null_; X mkdir c:\temp;run;

Comment retrouver les logs et les informations renseignées lors


des phases d'installation avec le SAS Deployment Wizard ?
Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Les renseignements donnés lors de l'installation sont dans sdwprefs.txt

La LOG du SAS Deployment Wizard se trouve dans SDW.log.

S'il faut relancer le SDW sans les précédentes informations (ie. repartir sur une installation vierge) il
convient de supprimer les fichiers ou les déplacer.

Ces fichiers se trouvent dans :

• Windows XP : %USERPROFILE%\Local Settings\Application Data\SAS\SASDeploymentWizard\9.2


• Windows Vista/Windows 7/Windows 2008 Server : %USERPROFILE%\AppData\Local\SAS
\SASDeploymentWizard\9.2
• UNIX and z/OS : $HOME/.SASAppData/SASDeploymentWizard/9.2 (du compte d'installation)

Plus détails sur le site de SAS

- 84 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

Sommaire > SAS STAT

- 85 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

Sommaire > SAS STAT > Général


Comment interpréter les tests en sortie de la procédure UNIVARIATE ?
Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Dans le paragraphe « Statistical computation » section « Goodness-of-Fit Tests », de la documentation de
la procédure UNIVARIATE de la version 8 (p1396 / 1397), une erreur d'interprétation des tests apparaît.

Le paragraphe suivant :
'When the p-value is less than the predetermined critical value (alpha value), you reject the null hypothesis
and conclude that the data came from the theorical distribution'

est à modifier comme ceci :


'When the p-value is less than the predetermined critical value (alpha value), you reject the null hypothesis
and conclude that the data DO NOT come from the theorical distribution'

Ce qui signifie que, en posant les hypothèses suivantes pour un test de normalité :
H0 : les données suivent une loi normale ;
H1 : les données ne suivent pas la loi normale.
- Si la p-value est inférieure à 'a', alors on rejette l'hypothèse nulle c'est-à-dire l'hypothèse que les données
ne suivent pas une loi normale.
- Si la p-value> 'a', alors on ne peut pas refuser l'hypothèse que les données suivent une loi normale.

Qu'est-ce que la procédure PROC FREQ et comment l'utiliser ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
La procédure PROC FREQ permet de faire des calculs de fréquences et produit des statistiques permettant
l'analyse des relations entre variables.
Pour l'utiliser, ajoutez le code suivant à votre programme SAS :

PROC FREQ;
TABLES var1*var2;
RUN;

PROC FREQ calcule dans ce cas le nombre de var1 par le nombre de var2. La fréquence est en pourcentage.
Le programme ci-dessus vous donnera le pourcentage de la variable var1 par rapport à la variable var2.
Bien entendu, diverses options sont possibles en plus de TABLES.

Comment appliquer les calculs statistiques de base à votre programme SAS ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Pour cela ajoutez ceci à votre programme :

PROC MEANS data=votreprogramme;


RUN;

- 86 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

votre programme étant le nom que vous avez donné à votre programme.
PROC MEANS permet d'afficher les variables concernées, calcule le nombre total d'observations pour
chaque variable ainsi que la moyenne, l'écart-type, la valeur minimum et maximum que peuvent avoir vos
variables.

Quels sont les modules prérequis pour le fonctionnement du module SAS/STAT® ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Seul le module SAS/BASE® est prérequis pour l'utilisation de SAS/STAT®.
Les modules SAS/INSIGHT®, SAS/GRAPH®, SAS/LAB®, SAS/ASSIST®, SAS/IML®, SAS/ETS®, SAS/OR®
et SAS/QC® peuvent aussi être intéressants pour intégrer des fonctionnalités spécialisées.

Quelles sont les différentes procédures pour chaque


type d'analyse disponible dans le module SAS/STAT® ?
Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Types d'analyses Procédures
Régression Calis, Catmod, GLM, Lifereg, Logistic, Nlin,
Orthoreg, Probit, Reg, Rsreg, Transreg
Analyse de variance Anova, Catmod, GLM, Nested, Npar1way, Plan,
Ttest, Varcomp
Analyse de données catégorielles Catmod, Corresp, Freq, Logistic, Probit
Analyse multivariée Corresp, Princomp, Prinqual, Factor, Cancorr
Analyse discriminante Discrim, Candisc, Stepdisc
Classification Cluster, Fastclus, Varclus, Tree, Aceclus,
Princomp, Standard
Scoring Rank, Score, Standard, Transreg
Analyse de survie Lifereg, Lifetest, Phreg

Comment exporter en table n'importe quel résultat de votre sortie SAS ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Depuis la version 8, tout résultat de la sortie SAS peut être stocké en table, grâce à l'Output Delivery System
(ODS).
Dans la documentation en ligne, chaque procédure SAS possède une rubrique 'ODS TABLE NAMES', qui
liste les noms de toutes les tables qu'il est possible de générer.
Étapes :

• Repérer le nom du résultat à exporter en table :

encadrer votre procédure avec les instructions "ODS trace on;" et "ODS trace off;", comme ci-après :

ODS TRACE ON;

- 87 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

proc GLM;
...
run;
ODS TRACE OFF;

Après exécution de ce code, les noms des résultats produits successivement par la procédure apparaissent
dans la log.

• Utiliser l'ODS OUTPUT pour exporter le résultat désiré en table :

la syntaxe est : ODS OUTPUT NomDuRésultat = NomTableExportée.


Ainsi, l'exemple suivant génère la table 'mytable', contenant les paramètres estimés du modèle :

ODS OUTPUT ParameterEstimates=mytable;


proc GLM;
...
run;
ODS OUTPUT close;

• Comment exporter plusieurs résultats portant le même nom ? :

dans le cas où plusieurs résultats portent le même nom, l'option MATCH_ALL permet de sauvegarder tous
les résultats dans des tables séparées :

ODS OUTPUT ModelANOVA(MATCH_ALL) = mytable;


proc GLM;
...
run;
ODS OUTPUT close;

Comment réaliser un tirage aléatoire sans remise ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Grâce à la macroprocédure tasr :
Ses paramètres :

• entree : table à fournir en entrée ;


• sortie : table créée en sortie ;
• nb : nombre d'observations à tirer au sort.

%macro tasr(libref=,entree=,sortie=,nb=);
data &libref..&sortie (drop=i j count);
count=0;
array obsnum(&nb) _temporary_;
do i=1 to &nb;
redo:
select=ceil(ranuni(12345)*n);
set &libref..&entree point=select nobs=n;
do j=1 to count;
if obsnum(j)=select then goto redo;
end;
position=select;

- 88 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

count=count+1;
obsnum(count)=select;
output;
end;
stop;
set &libref..&entree;
run;

%mend;

Exemple :
tirage au sort de 300 observations dans une table de 500 observations :

data donnees (drop=var);


do var=1 to 500;
x=round(ranuni(1251)*100);
output;
end;
run;

%tasr(libref=work,entree=donnees,sortie=donnees2,nb=300);

Comment réaliser un tirage aléatoire avec remise ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr

/* Table d'exemple : 100 observations. */


data test;
do a=100 to 200;
output;
end;
run;

/* Tirage au sort de 20 observations dans cette table. */


data ech1 (drop=i);
do i=1 to 20;
select=ceil(ranuni(1564)*n);
set test point=select nobs=n;
position=select;
output;
end;
stop;
run;

La variable position correspond à la position de l'observation dans la table de départ.

Comment générer des données suivant une loi particulière ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Dans tous ces exemples, 20 valeurs sont tirées au sort et stockées dans une table SAS.
Distribution uniforme
Données générées comprises en 1000 et 7863 (Seed=45123)

- 89 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

data select(drop=i);
do i=1 to 20;
x=int(ranuni(45123)*6864)+1000;
output;
end;
run;

Distribution normale
Paramètres : moyenne=10, variance=0.1 (Seed=1515).
Les fonctions rannor et normal sont strictement identiques.

data select(drop=i);
do i=1 to 20;
x=10+sqrt(0.1)*normal(1515);
output;
end;
run;

Distribution lognormale
Paramètres : moyenne=20 et écart-type=5 (seed = 5213).

data select(drop=i);
do i=1 to 20;
x=exp(20+5*rannor(5213);
output;
end;
run;

Distribution normale bivariée


Paramètres : rho=0.3 (moyenne nulle et écart-type égal à 1)

data select(drop=i);
do i=1 to 20;
x=0.3*rannor(456789)+sqrt(1-0.3**2)*rannor(456789);
output;
end;
run;

Trois méthodes, en ordre croissant d'efficacité, dans lesquelles on entre les moyennes et écarts-types des
deux lois normales.

data a;
keep x y;
mu1=10; mu2=20; var1=4; var2=9; rho=.5;
do i = 1 to 20;
x = mu1+sqrt(var1)*rannor(123);
y = (mu2+rho*(sqrt(var2)/sqrt(var1))*(x-mu1))+sqrt(var2*(1-rho**2))*rannor(123);
output;
end;
run;

data b;
keep x y;
mu1=10; mu2=20; var1=4; var2=9; rho=.5;
do i = 1 to 20;
x = rannor(123);
y = rho*x+sqrt(1-rho**2)*rannor(123);
x = mu1 + sqrt(var1)*x;

- 90 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

y = mu2 + sqrt(var2)*y;
output;
end;
run;

data c;
keep x y;
mu1=10; mu2=20; var1=4; var2=9; rho=.5;
std1=sqrt(var1); std2=sqrt(var2);
c=sqrt(1-rho**2);
do i = 1 to 20;
x = rannor(123);
y = rho*x+c*rannor(123);
x = mu1 + sqrt(var1)*x;
y = mu2 + sqrt(var2)*y;
output;
end;
run;

Distribution Gamma
Paramètres : Beta=2 et Alpha=4 (seed = 123154).

data select(drop=i);
do i=1 to 20;
x=2*rangam(123154,4);
output;
end;
run;

Distribution exponentielle
Paramètre : lambda=3 (seed = 4145).

data select(drop=i);
do i=1 to 20;
x=2*ranexp(4145)/3;
output;
end;
run;

Distribution Beta
Paramètres Alpha=5 et Beta=3 (seed = 12345).

data select(drop=i);
do i=1 to 20;
y1=rangam(12345,5);
y2=rangam(12345,3);
x=y1/(y1+y2);
output;
end;
run;

Distribution de Weibull
Paramètres c=2 et lambda=1/75 (seed = 212121).

data select(drop=i);
do i=1 to 20;
x=75*(-log(ranuni(212121)))*(1/2);
output;

- 91 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

end;
run;

Pour plus de détails, un article est consacré à la génération de nombres aléatoires avec le module SAS/
BASE® dans l'Observations 3rd quarter 1992.

Comment générer une loi normale multidimensionnelle sous SAS ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Pour générer une loi normale multidimensionnelle, il suffit de tenir compte des deux points suivants :

• Si toutes les composantes d'un vecteur aléatoire X suivent une loi normale et si toutes sont
indépendantes, alors X est gaussien. Une CNS pour qu'un vecteur gaussien ait ses composantes
indépendantes, est que sa matrice de covariance soit diagonale.
Code SAS dans le cas d'un vecteur bidimensionnel :

Data INDEPNOR (drop = i) ;


Retain seed1 1686174032 seed2 844616116 ;
Do i=1 to 100 ;
call rannor (seed1, stream1) ;
call rannor (seed2, stream2) ;
x = mux + sigmax * stream1 ;
y = muy + sigmay * stream2 ;
output ;
end ;
run ;
proc CORR data = INDEPNOR ;
var x y ;
run ;

• Dans le cas d'un vecteur multidimensionnel (dimension > 2), une MACRO %MVN est disponible
sur notre site internet à l'adresse suivante http://ftp.sas.com/techsup/download/stat dans le fichier
MVN.sas.

Comment traiter des séries appariées avec SAS ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Pour traiter des séries appariées sous SAS, il faut combiner les données, si celles-ci sont normales (tests de
normalité, théorème central limite), afin d'obtenir une seule variable qui pourra être traitée avec la procédure
UNIVARIATE.

- 92 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

Si les données ne sont pas statistiquement assimilables à des données normales, c'est-à-dire si elles
présentent des asymétries extrêmes ou sont ordinales, les méthodes non paramétriques de la procédure
NPAR1WAY sont plus appropriées.

Comment obtenir l'intervalle de confiance d'une


variable aléatoire suivant une distribution de Poisson ?
Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Il n'existe pas sous SAS de procédures permettant d'obtenir directement un intervalle de confiance d'une
distribution de Poisson. Il faut utiliser les fonctions SAS suivantes :

• CDF : retourne le niveau de probabilité cumulée à gauche d'une fonction de distribution donnée ;
• PDF : retourne la valeur de la densité de probabilité d'une fonction de distribution donnée.

Les fonctions de distribution disponibles sont :

• Bernoulli
• F
• Laplace
• Poisson
• Beta
• Gamma
• Logistic
• T
• Binomial
• Gaussian
• Lognormal
• Uniform
• Cauchy
• Geometric
• Negbinomial
• Wald
• Chisquare
• Hypergeometric
• Normal
• Weibull
• Exponential
• Igauss
• Pareto

Comment obtenir le calcul des Odds Ratios avec SAS ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
La procédure LOGISTIC permet de réaliser une régression logistique binaire et d'obtenir les odds ratios
qui expriment le risque moyen de passage entre les différentes modalités de la variable dépendante.

- 93 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

La procédure FREQ dans le cas d'une table d'entrée 2*2, permet également le calcul des odds ratios. Une
note technique SAS intitulée " Some Issues in using PROC LOGISTIC for Binary Logistic Regression" est
disponible sur le site SAS à l'adresse suivante : http://ftp.sas.com/techsup/download/technote/ts274.pdf

Quelle différence existe-t-il entre les tests de Cochran


et de Sattherwaite présents dans la procédure TTEST ?
Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Dans la procédure TTEST, sous l'hypothèse de variances inégales, une statistique T de Student
approximative est calculée. Cette statistique est exploitable de deux façons différentes :

• l'approximation de Cochran et Cox : elle permet d'associer à T une probabilité p qui vérifie une loi
de Student correspondant à des échantillons de tailles similaires, les effectifs des deux échantillons
mis en cause. La probabilité p ainsi associée permet de tester l'égalité des moyennes ;
• l'approximation de Sattherwaite : il est possible d'utiliser l'approximation de Sattherwaite pour
associer à T un nombre df de degrés de liberté. Sous l'hypothèse d'égalité des moyennes, T est
assimilée à une loi de Student à df degrés de liberté.

Le test de Cochran et Cox est plus conservatif que le test de Sattherwaite. Par défaut, le test de Sattherwaite
est privilégié.

Est-il possible d'estimer avec SAS une corrélation intraclasse ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Pour estimer un coefficient de corrélation intraclasse entre deux ou plus de taux dans le cas d'une
variable réponse continue, il suffit d'utiliser la macro %INTRACC, disponible à l'adresse suivante: http://
www.sas.com/techsup/download/stat
Il existe également un programme SAS permettant de tester graphiquement cette corrélation. Ce
programme est présent dans la publication 207 du SUGI 25 :"Using the SAS System to Visualize Inter-rater
Agreement for Continuous Measurements in Medical Studies", visible à l'adresse : http://www2.sas.com/
proceedings/sugi25/25/po/25p207.pdf

Comment calculer le nombre de permutations ou de combinaisons de P objets parmi N ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
À partir de la version 8 de SAS, il existe les fonctions PERM et COMB pour calculer le nombre de
permutations et combinaisons de P objets parmi N.
Exemple:

data essai;
c52=comb(5,2);
p52=perm(5,2);

- 94 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

run;

Comment représenter la fonction de répartition d'une variable aléatoire ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
La fonction de répartition d'une variable peut s'obtenir en utilisant l'instruction CDFPLOT de la proc
CAPABILITY du module SAS/QC. Si vous ne disposez pas de ce module, vous pouvez utiliser une proc
FREQ, suivie d'une étape data et d'une proc GPLOT, comme dans l'exemple suivant :

/* Représenter une fonction de répartition sans le module SAS/QC */

/* Fabrication de données de test */

data one;
drop i;
do i=1 to 50;
y=10+25*ranuni(12345);
output;
end;
run;
proc freq data=one noprint;
table y / out=out;
run;
data final;
set out;
cumpct+percent;
output;
run;
title 'fonction de repartition';
symbol i=steplj v=none;
proc gplot data=final;
plot cumpct*y;
run;

/* Avec le module SAS/QC, utiliser PROC CAPABILITY */

proc capability data=one noprint;


cdfplot y;
run;

Quelle différence y a-t-il entre la fonction CINV


de SAS et la fonction KHI2_INVERSE de Excel ?
Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Ces fonctions renvoient la valeur d'une variable aléatoire suivant une loi du Khi-deux, selon une probabilité
et un degré de liberté donnés.
Syntaxe :
La probabilité qu'une variable x suive une loi du chi2 à df degrés de liberté est définie telle que :
Probabilité=Chi2(x, df).
L'appel des fonctions se fait comme suit :

• CINV (1-probabilite, df) = x


• KHI2_INVERSE (probabilite, df) = x

- 95 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

La fonction CINV attend un percentile de la distribution du Khi-deux alors que la fonction KHI2.INVERSE
attend une probabilité unilatérale.
Remarque
La fonction CINV est l'inverse de la fonction PROBCHI de SAS®.
Exemple

SAS :

X= =CINV (0.95, 3)
X=7.81

Excel :

X=KHIDEUX.INVERSE (0,05, 3)
X=7.81

Comment augmenter la longueur des variables


affichées en sortie des procédures SAS/STAT ?
Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Le nombre maximal de caractères autorisé par défaut est 20 ou 24 selon la procédure utilisée. Pour
augmenter la taille par défaut, il faut utiliser l'option NAMELEN= dans l'appel de la procédure.
Exemple :

proc logistic data=test namelen=40;


...;
run;

Comment générer un intervalle de confiance pour une proportion ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Il faut utiliser l'option BINOMIAL de l'instruction TABLES de la procédure FREQ. Pour générer un intervalle
de confiance sur un niveau précis, il faut le spécifier grâce à l'option LEVEL=.

Exemple :

proc freq data=sashelp.class;


tables sex/binomial;
tables sex/binomial(level='M');

- 96 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

run;

Dans la log j'ai le message : The QUANTREG procedure has expired


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Le 31 Décembre 2008, la procédure QUANTREG du module SAS/ STAT a expiré. Un message d'erreur
apparait à son utilisation dans la log :

ERROR: The QUANTREG procedure has expired. Please contact Lin.Chen@sas.com

Pour corriger cette erreur, suivez les indications de la SAS Note suivante :
http://support.sas.com/kb/24/435.html
Le fichier téléchargé contient la dernière version de la procédure QUANTREG, qui sera mise à jour en
sélectionnant le choix « update ».

- 97 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

Sommaire > SAS STAT > Modélisation


Dans la procédure REG, comment récupérer le R² dans une table ?
Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
En combinant les options outest= (option de la proc REG) et adjrsq (après le / dans l'instruction model).

Dans la procédure REG, comment récupérer la p-value du modèle dans une table ?
Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Cette statistique n'est pas disponible en standard en sortie de la procédure REG. Par contre elle peut être
recalculée dans une étape data, en utilisant la somme des carrés de l'erreur et le R² (disponibles dans la
table créée par l'option outest= de la procédure REG).

data calc;
* la table sortie a été obtenue en sortie
d'une procédure REG, avec les options outest=sortie mse sse ;
set sortie;
* somme des carrés totale ;
SST=_SSE_/(1-_RSQ_);
* somme des carrés du modèle ;
SSM=SST-_SSE_;
* carré moyen du modèle ;
MSM=SSM/_IN_;
* valeur du F et de la pvalue associée ;
F=MSM/_MSE_;
pvalue=1-probf(F,_IN_,_EDF_);

- 98 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

run;

Dans la procédure REG, comment récupérer les


paramètres estimés (T, p-value, etc.) dans une table ?
Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
À partir de la version 6.12, avec les options TABLEOUT et OUTEST= (options de la proc REG). Il existe
également un programme (regci.sas) : Extracting anova data from the reg output dataset, disponible dans
la bibliothèque d'exemples du Système SAS (SAS/STAT®).

Comment récupérer, dans une table SAS, les paramètres estimés dans la procédure GLM ?
Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Ce n'est pas prévu dans la procédure GLM. La solution consiste à passer par la procédure MIXED, avec
une instruction MAKE.

Comment tester l'hypothèse d'égalité des variances dans la procédure GLM ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Il suffit d'utiliser l'option 'hovtest' dans l'instruction 'means' : MEANS effects / HOVTEST; Plusieurs tests
sont disponibles : Keyword = Bartlett, BF, Levene, Obrien. Par défaut, c'est le test de Levene qui est effectué.

Comment choisir la procédure SAS pour l'analyse de variance ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Les procédures suivantes GLM, MIXED et VARCOMP réalisent des comparaisons multiples, toutefois elles
sont optimisées pour les caractéristiques suivantes :

• GLM : cas des effets majoritairement fixes ;


• MIXED : combinaison d'effets fixes et aléatoires ;
• VARCOMP : cas des effets majoritairement aléatoires.

Où est documentée la procédure PLS ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Les deux documents suivants :

• Examples using the PLS procedure ;


• An introduction to the Partial Least Square

- 99 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

sont disponibles à l'adresse


http://support.sas.com/rnd/app/da/new/dapls.html

Quelles sont les différences existant entre les procédures MIXED et GLM ?
Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Il existe deux différences majeures entre les procédures MIXED et GLM :

• MIXED propose uniquement des tests pour les effets fixes qui sont basés sur l'erreur de type 3,
tandis que GLM offre des tests basés sur les erreurs de type 1,2, 3 et 4 ;
• GLM utilise la méthode des moments pour estimer les composantes de la variance tandis que
MIXED utilise le maximum de vraisemblance.

Comment paramétrer la procédure MIXED pour travailler


avec des conditions maximales de convergence ?
Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Par défaut dans la procédure MIXED, le nombre maximum d'itérations est de 150. L'option MAXFUNC permet
à partir de la version 6.08 d'augmenter ce nombre d'itérations.
L'instruction PARMS permet quant à elle de changer la valeur initiale des estimateurs des paramètres à
évaluer. Enfin, l'option METHOD paramètre le type de méthode de lissage à utiliser.

Comment réaliser des tests de parallélisme pour valider une analyse de la covariance ?
Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Une analyse de la covariance se réalise en deux étapes :

• la première consiste à vérifier l'hypothèse de parallélisme des deux groupes d'individus ;


• la seconde teste l'égalité des ordonnées à l'origine.

Pour réaliser le test de parallélisme, c'est-à-dire d'égalité des pentes, il est possible d'utiliser soit la
procédure REG, soit la procédure GLM.
Dans les deux cas, le test est strictement identique.
La syntaxe SAS est la suivante :

proc GLM ;
class GROUPE ;
model QC = GROUPE V02 GROUPE*V02 / e xpx solution ;
lsmeans GROUPE / sterr pdiff cov ;
run ; C'est l'effet GROUPE*V02 qui teste le parallélisme.

proc REG ;
model QC = GROUPE1 GROUPE2 V02_1 V02_2 / noint ;
parallel : mtest V02_1 - V02_2 = 0 / print details ;
run ;

- 100 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

Comment contourner les effets d'hétéroscédasticité du signal ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Il existe dans le Système SAS® deux procédures qui permettent de reconnaître l'hétéroscédasticité du
signal :

• MODEL module SAS/ETS®

Dans la procédure MODEL, l'option 'white' permet de tester l'existence d'hétéroscédasticité en mettant en ?
uvre le test de White.

• REG module SAS/STAT®.

Dans la procédure REG, l'option 'spec' teste la validité des moments d'ordre 1 ou 2. L'option 'acov' permet
d'avoir une estimation de la matrice asymptotique de variance-covariance des régresseurs suivant l'article
de White.
Mais toutes les deux ne proposent pas de correction dans l'estimation du modèle et des paramètres
correspondants.
Pour corriger une régression des effets d'hétéroscédasticité, le Système SAS® propose une
méthode utilisant la régression pondérée. Des informations théoriques concernant la correction de
l'hétéroscédasticité par la régression pondérée sont disponibles dans le manuel SAS suivant :
Univariate and Multivariate General Linear Models Theory and Applications using SAS Software Neil
H.Timm and Tammy A. Mieczkowski.
Le programme qui réalise cette correction est également disponible sur le site de SAS Institute sous la
dénomination suivante : 'WLSE for data with heteroscedasticity' et à l'adresse suivante :
http://www.sas.com/samples/A55809

À quoi correspondent les différentes sommes des carrés des écarts définies sous SAS ?
Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
SS1 :

• Somme des carrés des erreurs séquentielles.


• Chaque effet est ajouté l'un après l'autre au modèle général.

Exemple : Modèle Y fonction de A, B, C et A*B


Terminologie

• A, B, C et A*B constituent les variables explicatrices ou effet.


• A, B et C sont des effets simples issus donc d'un seul terme A, B et C respectivement.
• A*B est un effet composite, c'est-à-dire issu de deux termes A et B.
• La somme des carrés des écarts SS est définie par la formule suivante :
SS(Y) = SS(A, B, C, A*B / constante)
• Alors, les SS1 sont définies comme suit :
SS1(A) = SS(A / constante)

- 101 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

SS1(B) = SS(B / constante, A)


SS1(C) = SS(C / constante, A, B)
SS1(A*B) = SS(A / constante, A, B, C)

Caractéristiques des SS1 :

• SS(Y) = SS1(A) + SS1(B) + SS1(C) + SS1(A*B)


• Les SS1 sont statistiquement indépendantes les unes des autres si les erreurs sont indépendantes
et normalement distribuées.
• Les SS1 dépendent de l'ordre dans lequel les effets sont inclus dans le modèle général.
• Les SS1 sont utiles en particulier dans le cas des modèles polynomiaux pour connaître la
contribution d'un terme de degré (n+1) par rapport au modèle général de degré n.
• Les hypothèses de significativité des SS1 testées diffèrent selon que les données sont équilibrées
ou pas (valeurs manquantes ou non).

SS2 : elle est dérivée de la différence entre les sommes des carrés des écarts des sous-modèles
correspondants.
L'erreur de type 2 d'un effet donné est en fait la différence d'erreur due à l'ajout de cet effet dans le modèle
une fois que tous les autres effets ont été ajoutés au modèle général, excepté les effets composites.
Alors, les SS2 sont définies comme suit :

• SS2(A) = SS(A / constante, B, C)


• SS2(B) = SS(B / constante, A, C)
• SS2(C) = SS(C / constante, A, B)
• SS2(A*B) = SS(A*B / constante, A, B, C)

Caractéristiques des SS2 :

• SS(Y) n'est pas égale à SS2(A) + SS2(B) + SS2(C) + SS2(A*B).


• Les hypothèses de significativité des SS2 testées n'incluent pas nécessairement les paramètres des
autres effets excepté pour les effets composites.
• Les SS2 ne dépendent pas de l'ordre d'introduction des effets dans le modèle général.
• Les hypothèses de significativité des SS2 testées diffèrent selon que les données sont équilibrées
ou pas (valeurs manquantes ou non).

SS3 - 4 : somme des carrés des erreurs partielles.


Chaque effet est testé séparément par rapport au modèle général. Ce sont les sommes des carrés des écarts
les plus intéressantes et les plus exploitées. En l'absence de valeurs manquantes (données équilibrées),
SS3 et SS4 sont égales.
Alors, les SS3-4 sont définies comme suit :

• SS3-4(A) = SS(A / constante, B, C, A*B)


• SS3-4(B) = SS(B / constante, A, C, A*B)
• SS3-4(C) = SS(C / constante, A, B, A*B)
• SS3-4(A*B) = SS(A*B / constante, A, B, C)

Caractéristiques des SS3 - 4 :

• SS(Y) n'est pas égale à SS3-4(A) + SS3-4(B) + SS3-4(C) + SS3-4(A*B).


• Les hypothèses de significativité des SS3-4 testées n'incluent pas nécessairement les paramètres
des autres effets excepté pour les effets composites.
• Les SS3-4 ne dépendent pas de l'ordre d'introduction des effets dans le modèle général.

- 102 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

• Les SS3 et SS4 diffèrent uniquement si les données sont déséquilibrées (valeurs manquantes
présentes). Dans ces cas-là, SS3 conserve l'orthogonalité tandis que SS4 conserve l'équilibre des
données, c'est à dire contrebalance le déséquilibre des données.

Le type de somme des carrés des écarts à considérer dépend de ce que l'on souhaite étudier. Dans le cas
d'une régression linéaire classique, valeurs explicatives continues, SS2, SS3 et SS4 sont identiques. Dans
le cas d'une analyse de variance, valeurs explicatives nominales, SS1, SS2, SS3 et SS4 peuvent être utiles
toutes les quatre.

Comment obtenir des intervalles de confiance sur les


valeurs d'entrée avec les procédures MIXED et GLM ?
Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Il n'existe pas comme dans la procédure REG d'option offrant la possibilité d'obtenir une estimation directe
d'intervalle de confiance sur les valeurs individuelles de la table SAS d'entrée.
Pour les procédures MIXED et GLM, il faut passer par l'option SOLUTION qui donne l'estimation des
paramètres du modèle linéaire ajusté ainsi que la précision associée. Ensuite, il ne reste plus qu'à calculer
la valeur estimée pour chacune des données d'entrée ainsi que l'intervalle de confiance associé.

À quoi correspondent les options PREDICTED et PREDMEANS de la procédure MIXED ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Ces deux options calculent des intervalles de confiance de valeurs prédites moyennes et non pas de valeurs
prédites individuelles. L'option PREDMEANS calcule des intervalles de confiance sans tenir compte des
effets aléatoires tandis que l'option PREDICTED permet de tenir compte des effets aléatoires définis dans
l'instruction RANDOM.
L'option PREDMEANS ne présente donc un intérêt uniquement si vous avez un effet aléatoire dans le
modèle ajusté. Elle permet ainsi la comparaison avec et sans effet aléatoire.

Pourquoi systématiquement dans certains cas d'analyse de variance avec la procédure


GLM, les coefficients associés à la dernière modalité de chaque variable sont nuls ?
Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
S'ils sont nuls, c'est que l'on est en présence d'une matrice XX' singulière. Cela ne signifie nullement que
l'estimation est mauvaise mais simplement qu'il existe une infinité de solutions au modèle à ajuster. Alors,
afin de fournir au moins une solution parmi toutes celles possibles, la procédure ajoute une condition

- 103 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

supplémentaire lors de la résolution du problème inverse. À savoir, elle impose la nullité de la dernière
modalité de chaque variable.

Comment générer des variables indicatrices à partir d'une variable catégorielle ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Il est possible de générer les variables indicatrices relatives à une variable catégorielle grâce à une étape
data, ou encore grâce à la proc TRANSREG.
Un exemple des deux méthodes est présenté ci-dessous dans le cas d'une variable catégorielle, notée
'Trait', à trois modalités 'A', 'B' et 'P'.
1- Avec une étape data, il est dans les habitudes d'utiliser le code synthétique suivant :

title 'Création de variables indicatrices';


data Maladie ;
set Maladie ;
TraitA = (Trait='A') ;
TraitB = (Trait='B') ;
Run ;

2- Avec la proc TRANSREG, il faut utiliser l'option DESIGN et l'instruction MODEL CLASS en précisant la
variable catégorielle :

title 'Création de variables indicatrices';


proc transreg data=Maladie design;
model class(Trait);
id Age Duree Gueri;
output;
run;

Dans ce cas, les variables indicatrices sont générées dans une table Datan.

Comment changer la modalité de référence d'une


variable catégorielle dans la proc LOGISTIC ?
Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Il est possible de choisir la modalité que l'on souhaite pour référence, grâce aux options PARAM= et REF=.
Exemple :

title 'LOGISTIC en V8 - PARAM=REF' ;


proc logistic data=maladie;
class trait(param=ref ref= 'A');
model gueri= trait age duree;
run;

- 104 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

Comment corriger les problèmes d'hétéroscédasticité, sans utiliser la méthode de GARCH ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Cela est possible avec la proc MODEL du module SAS/ETS, qui fournit deux tests :

• le test de White ;
• le test de Breusch-Pagan.

Dans la procédure LOGISTIC, comment imposer les valeurs de certains paramètres ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Il n'est pas possible d'imposer des paramètres de manière directe. Cependant, il existe un contournement,
en utilisant l'option OFFSET= de l'instruction MODEL, comme dans l'exemple ci-dessous.
Soit un modèle à 10 variables indépendantes : X1-X10

proc LOGISTIC DATA=data;


model y=x1-x10;

On souhaite imposer les paramètres comme suit : 1 pour X1, 2 pour X2, 3 pour X3, 4 pour X4 et 5 pour X5.
La solution consiste dans un premier temps à construire à l'aide d'une étape data une variable offset,
combinaison linéaire des variables X1-X5, en utilisant les valeurs imposées comme des constantes.

data newdata;
set data;
offstvar=1*x1+2*x2+3*x3+4*x4+5*x5;

Il faut ensuite lancer une régression logistique, utilisant la variable offset et les variables explicatives
restantes :

proc LOGISTIC data=datanew;


model y=x6-x10 / offset=offstvar;
run;

À noter que la totalité des paramètres peut être imposée facilement de la manière suivante :

• il faut tout d'abord créer une table d'une seule observation, avec comme variables les variables
explicatives (chacune de ces variables sera affectée de la valeur que l'on souhaite imposer à son
estimateur) ;

- 105 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

• spécifier ensuite cette table dans l'option INEST=, au niveau de l'instruction de la procédure
LOGISTIC. Spécifier également l'option MAXITER=0 dans l'instruction MODEL.

Dans la procédure GENMOD, comment augmenter le nombre de décimales des résultats ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Il n'y a pas d'options permettant de modifier le nombre de décimales des résultats.
Cependant, un contournement existe. Il s'agit de sauvegarder les résultats dans une table SAS, grâce à
l'ODS OUTPUT, et d'appliquer ensuite le format à la variable concernée, comme dans l'exemple ci-dessous :

Data Neural;
input Treat $ Sex $ Age Dur Pain $ @@;
datalines;
P F 68 1 No B M 74 16 No P F 67 30 No
P M 66 26 Yes B F 67 28 No B F 77 16 No
A F 71 12 No B F 72 50 No B F 76 9 Yes
A M 71 17 Yes A F 63 27 No A F 69 18 Yes
B F 66 12 No A M 62 42 No P F 64 1 Yes
A F 64 17 No P M 74 4 No A F 72 25 No
P M 70 1 Yes B M 66 19 No B M 59 29 No
A F 64 30 No A M 70 28 No A M 69 1 No
B F 78 1 No P M 83 1 Yes B F 69 42 No
B M 75 30 Yes P M 77 29 Yes P F 79 20 Yes
A M 70 12 No A F 69 12 No B F 65 14 No
B M 70 1 No B M 67 23 No A M 76 25 Yes
P M 78 12 Yes B M 77 1 Yes B F 69 24 No
P M 66 4 Yes P F 65 29 No P M 60 26 Yes
A M 78 15 Yes B M 75 21 Yes A F 67 11 No
P F 72 27 No P F 70 13 Yes A M 75 6 Yes
B F 65 7 No P F 68 27 Yes P M 68 11 Yes
P M 67 17 Yes B M 70 22 No A M 65 15 No
P F 67 1 Yes A M 67 10 No P F 72 11 Yes
A F 74 1 No B M 80 21 Yes A F 69 3 No
;

ods output parameterestimates=parms; /* création de la table parms */

proc genmod data=Neural;


class Treat Sex;
model Pain= Treat Sex Treat*Sex Age Dur/d=bin link=logit;
run;

data parms;
set parms;
format estimate 12.6; /* application d'un format */
run;

proc print;
run;

Comment obtenir le R2 (R-square) ajusté, à partir des résultats d'une procédure GLM ?
Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Le R² ajusté n'est pas fourni en standard.

- 106 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

Vous pouvez l'obtenir, à partir des résultats de la procédure GLM en utilisant l'ODS et une étape data comme
dans l'exemple suivant :

data iron;
input fe loss @@;
datalines;
0.01 127.6 0.48 124.0 0.71 110.8 0.95 103.9
1.19 101.5 0.01 130.1 0.48 122.0 1.44 92.3
0.71 113.1 1.96 83.7 0.01 128.0 1.44 91.4
1.96 86.2
;

ods output fitstatistics=fit_ds(keep=dependent rsquare) /*création de la table fit_ds */


overallanova=anova(where=(source='Model')) /* création de la table anova */
nobs=nobs(keep=nvalue1); /* création de la table nobs */

proc glm data=iron;


model loss=fe;
run;

data rsq;
merge fit_ds anova nobs;
m=df+1;
adj_rsq=1-(1-rsquare)*((nvalue1-1)/(nvalue1-m)); /* calcul du R2 ajusté */
keep dependent rsquare adj_rsq;
proc print;
run;

- 107 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

Sommaire > SAS STAT > Analyse de données


Quelle procédure SAS faut-il utiliser pour réaliser une analyse en composantes principales ?
Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Il faut utiliser la procédure PRINCOMP.

Quelle procédure SAS faut-il utiliser pour réaliser une


analyse des correspondances (simple ou multiple) ?
Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Il faut utiliser la proc CORRESP.

Comment calculer la statistique du chi2 sur un tableau de contingence ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Il faut retravailler la table en entrée.

Exemple :

DATA yeux;
INPUT couleur $ sexe poids @@;
CARDS;
bleu 1 10 bleu 2 20
vert 1 50 vert 2 60
marron 1 25 marron 2 40
;
RUN;

PROC FREQ data=yeux;


TABLES couleur*sexe / chisq;
WEIGHT poids;
RUN;

Comment créer un tableau disjonctif complet à partir d'une table individus*variables ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Pour créer un tel tableau, il faut utiliser les procédures Corresp et Transpose.

La table de départ 'essai' est de type individus(id)*variables (voit, prof, situ, age), avec des variables
alphanumériques.

/* créer la table des fréquences des modalités des variables par individu (0 ou 1)*/
proc corresp data=essai outf=freqs noprint;
tables id, voit prof situ age;

- 108 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

run;

/* créer le tableau disjonctif complet */


proc transpose data=freqs out=rfreqs;
where _type_ eq 'OBSERVED';
var count;
id column;
by row;
run;

Quelles sont les études réalisées par la procédure CORRESP ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
La procédure CORRESP permet de réaliser une analyse factorielle des correspondances (AFC), c'est-à-dire
une étude de la liaison entre deux variables qualitatives, ou une analyse des correspondances multiples
(ACM), c'est-à-dire une étude de la liaison entre plusieurs variables qualitatives.

Format des données d'entrée :

• 1. pour une AFC : deux formes de données d'entrée possibles :

a une table de contingence : en ligne, les modalités de la variable A ; en colonne, les modalités de la
variable B ;
b une table individus * variables : la procédure construit elle-même la table de contingence.

Dans les deux cas, il n'y a pas de résultats sur les individus.

• 2. pour une ACM : trois formes de données d'entrée possibles :

a un tableau disjonctif complet : option MCA inutile ; résultats relatifs aux individus ;
b une table de Burt : option MCA nécessaire ; pas de résultat relatif aux individus ;
c une table individus * variables : option MCA : la procédure construit la table de Burt (cas 2) ; pas
d'option MCA : la procédure construit un tableau disjonctif (cas 1).

Remarque :

L'option MCA indique une ACM, le tableau analysé doit être une table de Burt. Si cette option est absente
et que l'analyse est effectuée sur une table de Burt, la procédure n'indiquera pas d'erreur mais les valeurs

- 109 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

propres et les coordonnées seront celles de l'AFC du tableau de Burt (Les valeurs propres sont élevées au
carré et les coordonnées sont multipliées par la racine des valeurs propres).

Avec le système SAS, comment peut-on faire


une classification sur des variables qualitatives ?
Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Les procédures Cluster et Fastclus ne fonctionnant qu'avec des variables quantitatives, la solution la plus
simple consiste à effectuer tout d'abord une Analyse des Correspondances Multiples (ACM) à l'aide de la
proc Corresp, puis à réaliser la classification sur les coordonnées des individus sur les axes.

Comment peut-on faire une analyse discriminante


sur des variables qualitatives avec le système SAS ?
Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Pour ce faire, vous devez tout d'abord transformer vos variables qualitatives en variables quantitatives.

La méthode consiste à faire une analyse des correspondances multiples (ACM) sur le tableau disjonctif
complet des variables nominales (à l'aide de la procédure Corresp).

Ceci afin d'obtenir des variables continues (les facteurs de l'ACM).

Cette méthode est connue sous le nom de méthode Disqual (Saporta, 1977).

Il ne reste plus qu'à utiliser ces variables quantitatives avec l'une des procédures du Système SAS® qui
permet de faire de l'analyse discriminante (procédure Discrim ou procédure Candisc).

Comment obtenir les résultats sur les individus avec la procédure


CORRESP sans passer par un tableau disjonctif complet ?
Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
L' Analyse des Correspondances Multiples est souvent réalisée sur un grand ensemble de données. Le
nombre d'observations et de variables peut être très important. Il arrive fréquemment que les résultats
concernant les individus soient intéressants. La réalisation d'une segmentation passe souvent par une
analyse des correspondances puis par une classification sur les coordonnées des individus sur les axes.

Cette méthode requiert donc la réalisation de l'Analyse des Correspondances Multiples sur tableau
disjonctif complet. Or, l'analyse sur tableau disjonctif complet est très coûteuse, voire parfois impossible
à cause de limitations des capacités informatiques.

Alors, la meilleure solution est de tirer parti de la formule de reconstitution des données : il s'agit dans un
premier temps d'effectuer l'analyse sur le tableau de Burt, ce qui a pour inconvénient de ne pas restituer les
coordonnées des individus sur les axes. Puis de calculer ces coordonnées à l'aide de la formule suivante : à

- 110 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

un facteur 1/racine (valeur propre de l'axe concerné) près, la coordonnée d'un individu sur un axe est égale
à la somme arithmétique simple des coordonnées des catégories auxquelles il appartient sur ce même axe.

Comment affecter des pondérations aux variables dans la procédure FACTOR ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Dans un premier temps, il faut savoir qu'il est possible avec l'option WEIGHT d'affecter des poids aux
variables dans la procédure FACTOR mais uniquement dans les conditions suivantes :

METHOD = PRINCIPAL, PRINIT, ULS et IMAGE.

Les données d'entrée sont soit une matrice de corrélation (TYPE = CORR,UCORR), soit une matrice de
variances-covariances (TYPE = COV, UCOV).

La syntaxe du code SAS correspondant est la suivante :

Data CORREL (type = corr) ;


Input _type_ $ _name_ $ var1 var2 --- varn ;
Cards ;
CORR var1 1.0
CORR var2 cor(var2, var1) 1.0
CORR vari cor(vari, var1) --- cor(vari, var(i-1)) 1.0
CORR varn cor(varn, var1) --- cor(vari, var(i-1)) 1.0
WEIGHT W(var1) W(var2) --- W(vari) W(varn);

proc FACTOR data = CORREL method = principal


rotate = varimax outstat = RESUL weight ;
run ;

Exemple:

data correl(type=corr);
input _TYPE_ $ 1-6 _NAME_ $ @11 x y z;
datalines;
CORR x 1.0 . .
CORR y .7 1.0 .
CORR z .5 .4 1.0
WEIGHT 5 3 1
;
proc factor weight;
run;

- 111 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

Attention à ne pas confondre l'option WEIGHT qui permet de pondérer les variables avec l'instruction
WEIGHT qui permet de pondérer les individus.

Comment exploiter les résultats de la procédure DISCRIM ?


Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Pour appliquer les règles de l'analyse discriminante obtenue par la procédure DISCRIM sur des données
différentes des données d'analyse, il faut utiliser les options suivantes :

a TESTDATA = Table_SAS - identification de la table SAS contenant les données à classer ;


b TESTLIST - résultats statistiques de la classification pour les observations de la table TESTDATA ;
c TESTLISTERR - liste les observations mal classées de la table TESTDATA ;
d TESTOUT = Table_SAS - résultats de la classification des observations de la table ;
e TESTOUTD = Table_SAS - TESTDATA.

- 112 -
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation
constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Developpez LLC. Tous droits réservés Developpez LLC.
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation
expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette
page est déposée à la SACD.
La FAQ SAS

Sommaire > SAS STAT > Analyse de survie


Comment obtenir l'intervalle de confiance de la
fonction de survie avec la procédure LIFETEST ?
Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
L'intervalle de confiance de la fonction de survie S(t) est obtenue par l'option OUTSURV= qui crée une table
contenant les variables suivantes :

• SDF_LCL : borne inférieure de l'intervalle de confiance de la fonction de survie ;


• SDF_UCL : borne supérieure de l'intervalle de confiance de la fonction de survie.

Proc LIFETEST data=survival OUTSURV=estimates ;


... ;
... ;
run;

Comment obtenir une estimation de Kaplan-Meier de la fonction


de survie dans le cas de données censurées et tronquées ?
Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
La procédure PHREG permet d'obtenir une estimation de Kaplan-Meier de la fonction de survie dans le cas
de données censurées et tronquées. Il suffit pour cela de ne pas préciser de variables explicatives dans
l'instruction MODEL.
La syntaxe de la procédure est la suivante :

PROC PHREG ;
MODEL t2*c(1) = / ENTRYTIME = t1 ;
OUTPUT OUT = out1 SURVIVAL = sdf ;
RUN ;

t2 est le temps de survie, t1 est le temps de troncature et c est l'indicateur de censure (une valeur de 1
indique les observations censurées). La variable sdf de la table OUT1 contient les estimateurs souhaités.

Est-il possible d'inclure des variables catégorielles


dans la modélisation de données de survie ?
Auteurs : steelspirit - datametric - oncle_pete - oncle_pete - rastoix - bahraoui - raf64flo - fafabzh6 - Fleur
Anne Blain - ash_rmy - SAS - green_fr
Oui, grâce à l'instruction CLASS de la nouvelle procédure TPHREG (expérimentale en SAS 9.1.3).

Vous trouverez plus d'informations sur cette procédure dans l'aide en ligne, à l&#