Conseils de programmation SAS pour les utilisateurs de l’ADTR

Solution de remplacement pour le mot interdit PUT

Le mot PUT est un mot interdit dans l’ADTR parce que l’énoncé PUT permet à l’utilisateur d’écrire des valeurs à partir des microdonnées vers le journal de SAS. Toutefois, les utilisateurs peuvent vouloir utiliser la fonction PUT pour créer des valeurs de type caractère en appliquant un format (habituellement utilisé pour convertir des valeurs numériques en caractères). Comme le mot PUT est interdit, les utilisateurs peuvent plutôt utiliser les fonctions PUTC ou PUTN, qui sont semblables à la fonction PUT. PUTC crée une valeur de type caractère en appliquant un format de type caractère. PUTN crée une valeur de type caractère en appliquant un format numérique.

Nota : Contrairement à la fonction PUT, le format à appliquer (le deuxième argument) pour les fonctions PUTC et PUTN doit être entre guillemets. Par exemple :

AgeChar = PUTN(Age, "3.");

Conversion des valeurs de type caractère en valeurs numériques

Dans certains cas, l’utilisateur peut vouloir convertir des valeurs de microdonnées de type caractère en valeurs numériques. Par exemple, la variable de microdonnées SP_WEARN de l’EPA est une variable de type caractère. Pour cette raison, SP_WEARN ne peut pas être utilisée comme variable d’analyse dans l’ADTR (dans RTRAMean, par exemple). Elle doit d’abord être convertie en variable numérique. Cette conversion peut être effectuée en utilisant la fonction INPUT.

Par exemple, dans l’étape de données ci-dessous, une nouvelle variable numérique SP_WEARN_NUM est créée en appliquant la fonction INPUT à SP_WEARN. On suppose que les valeurs dans SP_WEARN incluent deux places décimales implicites.

data work.LFS;

    set RTRAData.LFS200005;

    length SP_WEARN_NUM 8;

    SP_WEARN_NUM = INPUT(SP_WEARN,7.2);

run;

La nouvelle variable SP_WEARN_NUM peut alors être utilisée comme variable d’analyse dans les procédures d’ADTR.

Application de l’option KEEP à l’ensemble de données RTRAData

L’application de l’option KEEP à l’ensemble de données RTRAData peut rendre l’étape de données plus efficace, car SAS n’extraira que les variables dans la liste KEEP. Elle est utile lorsque seul un petit nombre de variables sont nécessaires. Veuillez prendre note que si KEEP est précisé, la variable nommée ID doit être incluse dans la liste de variables.

Par exemple :

data work.CSDDis;

    set RTRAData.csd2012_disab(keep=DDIS_FL REF_AGE SEX DCLASS DLFS ID);

run;

Nota : Même si KEEP peut rendre l’étape de données plus efficace lorsque seul un petit nombre de variables sont nécessaires, KEEP n’est pas une exigence. S’il faut garder un grand nombre de variables, il est plus facile d’omettre KEEP. SAS gardera automatiquement toutes les variables (y compris la variable ID).

Définition de nouvelles variables avec un énoncé LENGTH

L’exemple ci-dessous montre comment les valeurs d’une nouvelle variable de type caractère peuvent être tronquées par inadvertance lorsque la variable n’est pas définie avec un énoncé LENGTH.

data work.CSDDis;

    set RTRAData.csd2012_disab;

    if (REF_AGE < 10) then AgeGroup = "Under10";

    else if (10 <= REF_AGE <= 30) then AgeGroup = "Between10and30";

    else if (31 <= REF_AGE <= 90) then AgeGroup = "Between31and90";

    else if (REF_AGE > 90) then AgeGroup = "OlderThan90";

    else AgeGroup = "AgeUnknown";

run;

Comme la variable AgeGroup n’est pas définie avec un énoncé LENGTH, SAS utilise la première occurrence de AgeGroup dans l’étape de données pour déterminer la longueur à attribuer à la variable. La première occurrence est l’endroit où AgeGroup se voit attribuer la valeur Under10. Par conséquent, SAS attribue une longueur de 7 à AgeGroup. Le problème avec cela est que la longueur 7 n’est pas suffisante pour contenir les valeurs attribuées plus tard à AgeGroup à l’étape des données.

Voici les valeurs de AgeGroup à l’étape des données de sortie pour les différents groupes d’âge. Veuillez noter la troncature qui a eu lieu :

Définition de nouvelles variables avec un énoncé LENGTH
REF_AGE AgeGroup [char(7)]
< 10 Under10
10 - 30 Between
31 - 90 Between
> 90 OlderTh
Any other value AgeUnkn

Si AgeGroup est une variable de classe, les valeurs dans les résultats totalisés seront tronquées, comme indiqué ci-dessus. En outre, ce qui est encore pire, c’est que toutes les valeurs REF_AGE de 10 à 90 se retrouveront dans la même catégorie, à savoir Between.

Pour éviter ce problème, utilisez un énoncé LENGTH pour attribuer une longueur suffisante à AgeGroup avant de lui attribuer une valeur :

data work.CSDDis;

    set RTRAData.csd2012_disab;

    length AgeGroup $ 15;

    if (REF_AGE < 10) then AgeGroup = "Under10";

    else if (10 <= REF_AGE <= 30) then AgeGroup = "Between10and30";

    else if (31 <= REF_AGE <= 90) then AgeGroup = "Between31and90";

    else if (REF_AGE > 90) then AgeGroup = "OlderThan90";

    else AgeGroup = "AgeUnknown";

run;

Définition de nouvelles variables avec un énoncé LENGTH
REF_AGE AgeGroup [char(15)]
< 10 Under10
10 - 30 Between10and30
31 - 90 Between31and90
> 90 OlderThan90
Any other value AgeUnknown

Énoncé ELSE manquant lors de la définition d’une variable dérivée

Lors de la définition d’une variable dérivée dans une étape de données, les énoncés IF/ELSE sont habituellement utilisés.

Par exemple :

data work.CSDDis;

    set RTRAData.csd2012_disab;

    length AgeGroup $ 15;

    if (0 <= REF_AGE < 10) then AgeGroup = "Under10";

    else if (10 <= REF_AGE <= 30)  then AgeGroup = "Between10and30";

    else if (31 <= REF_AGE <= 90)  then AgeGroup = "Between31and90";

    else if (91 <= REF_AGE <=120) then AgeGroup = "Between91and120";

run;

Le problème potentiel avec ce code est qu’il ignore toute valeur spéciale de REF_AGE qui peut exister dans les données. Par exemple, l’ensemble de données csd2012_disab peut contenir des valeurs manquantes REF_AGE (.) ou une valeur comme 999 peut représenter “Not Stated”. Pour les observations où REF_AGE n’est pas de 0 à 120, AgeGroup restera en blanc. Si AgeGroup est utilisé comme variable de classe dans l’ADTR, l’ADTR produira un message d’erreur puisqu’une variable de classe ne peut pas avoir de valeurs manquantes.

Pour éviter ce problème, un énoncé ELSE additionnel devrait être utilisé comme “catch all”. Cela permet de s’assurer que AgeGroup ne sera pas en blanc dans les observations dans l’ensemble de données de sortie.

data work.CSDDis;

    set RTRAData.csd2012_disab;

    length AgeGroup $ 15;

    if (0 <= REF_AGE < 10) then AgeGroup = "Under10";

    else if (10 <= REF_AGE <= 30)  then AgeGroup = "Between10and30";

    else if (31 <= REF_AGE <= 90)  then AgeGroup = "Between31and90";

    else if (91 <= REF_AGE <=120) then AgeGroup = "Between91and120";

    else AgeGroup = "Other";

run;

Date de modification :