Archive for the ‘Statistiques’ Category

h1

Combien de nouveaux cas par an ? Une mesure d’incidence

juillet 25, 2010

L’incidence est une mesure statistique utilisée couramment dans les études cliniques, en cancérologie notamment. Vous trouverez sur Wikipédia une explication en termes simples de ce concept. Voici quelques extraits: définition et exemple de base.

1. Le principe de base

Wikipedia, définition : « En général, l’incidence (ou le taux d’incidence) est le nombre de nouveaux cas d’une pathologie observés pendant une période et pour une population déterminée. »

Taux d’incidence=nombre de nouveaux cas/durée totale du suivi

Wikipedia, exemple : « Par exemple, si 100 personnes à risque ont été étudiées pendant 2 ans, la durée totale de suivi est de 200 personnes-années.Dans ce même exemple, s’il a eu 5 nouveaux cas de la maladie à l’étude, le taux d’incidence sera de 5 cas par 200 personnes-années, ou plus simplement de 2,5 cas par 100 personnes-années (ou encore 0,025 cas par personne-année). »

Taux d’incidence=5/200

2. Le vrai taux d’incidence

Wikipedia, définition : « En général, on s’intéresse à la première occurrence d’une maladie donnée chez une personne (au premier cancer et pas à ses récidives chez un même patient par exemple). »

Wikipedia, l’exemple: « Dans l’exemple précédent, les cinq cas diagnostiqués pendant l’étude ne sont plus à risque à partir du moment où ils sont diagnostiqués. S’ils ont contracté la maladie après six mois d’observation, ils n’ont été à risque que pendant six mois. La durée totale de suivi pour cette étude est donc

  • de 190 personnes-années pour les personnes qui n’ont pas la maladie (95 personnes fois 2 ans) et
  • de 2,5 personnes-années pour les cas (6 mois fois 5 cas).

Le vrai taux d’incidence est donc de 5 cas sur 192,5 personnes-années (ou 2,6 cas par 100 personnes-années). »

Taux d’incidence=5/192.5

L’éventail d’application de cette mesure s’étant au delà de la pharmaceutique. Nombre de personnes ayant retrouvé un emploi, nombre de clients ayant effectué un nouvel achat dans l’année après être passé au statuts de client perdu, etc.

Complétez cet article

N’hésitez pas à ajouter des précisions tant sur le calcul avec SAS, que sur la gestion des valeurs manquantes, identifier une différence significative entre deux taux d’incidence ou la représentation graphique de ce type de données.

h1

Combien ai-je de contrats au total ? (4/5) PROC FREQ

novembre 17, 2008

Dans les précédents articles sur cette série traitant du calcul de totaux, la procédure PROC SQL, le RETAIN dans une étape DATA et la procédure PROC MEANS nous on montré qu’elles pouvaient retrouver le nombre total de contrats pour chaque type (contrats téléphoniques, contrats d’habitation). La procédure PROC FREQ mérite également votre attention . Comme PROC MEANS, cette procédure utilise la notion de coefficient/poid (weight).

Rappel : Vous pouvez retrouver l’étape data créant le data set pour ce sujet en fin d’article. Les données contiennent l’identifiant du client CLIENT, le nombre de contrats NB_CNTR et deux variables binaires TEL et HABITAT indiquant si oui ou non les fréquences s’appliquent. Au total, on compte 9 contrats téléphoniques et 5 contrats d’habitation.

client nb_cntr tel habitat;
   a      5     1     0
   b      1     1     0
   c      2     0     1
   d      1     1     0
   e      3     0     1
   f      2     1     0

1. Deux approches possibles

Avec la procédure PROC FREQ, deux options s’offrent à vous :

  • D’abord générer un data set par type de contrat avec PROC FREQ et ensuite combiner les données.
  • D’abord changer la structure des données et ensuite obtenir un seul data set avec PROC FREQ.

Par soucis de simplicité, je vous propose d’aborder la seconde méthode qui me semble de loin la plus logique pour nos données.

Etape 1 : Changer la structure des données revient à avoir d’un côté le nom des différents types de contrats et de l’autre si oui ou non une fréquence s’applique pour eux. Il n’y a alors plus qu’une seule variable binaire.

Pour changer cette structure des données, deux solutions sont possibles :

  • une étape data ou
  • la procédure PROC TRANSPOSE.

La première approche servira à comprendre la manipulation. La seconde approche est facilement généralisable à un plus grand nombre de variable et a donc ma préférence.

Etape 2 : Pour extraire le data set avec PROC FREQ, il existe l’ancienne méthode avec l’option OUT= et la nouvelle beaucoup plus standard ODS OUTPUT. Le raisonnement appliqué par cette méthode est applicable à de nombreuses procédure. La syntaxe est donc beaucoup facile de la retenir.

2. Etape 1 – Changer la structure des données en utilisant une étape data

Il s’agit de créer une variable unique indiquant si oui ou non les coefficients (weight) données dans la variable NB_CNTR s’appliquent.

data contrats_update ;
   length contrat $7;
   set contrats (in=a keep=nb_cntr tel     rename=(tel=tmp)     )
       contrats (     keep=nb_cntr habitat rename=(habitat=tmp) );
    if a then contrat='tel';
    else contrat='habitat';
run;

Les 6 premières lignes sont consacrées au contrat de téléphone et les 6 dernières concernent les contrats d’habitation.

Seules les données où la variable binaire est oui (NO_YES=1) seront au final intéressante. Il est possible de supprimer les données où NO_YES=0 en ajoutant dans l’étape data un WHERE (where=(no_yes=1)) et en supprimant ensuite la variable NO_YES avec DROP (data contrats_update (drop=no_yes)). Voulant vous montrer les différentes étapes, je n’ai pas supprimé les lignes ou NO_YES=0.

nb_cntr  no_yes    contrat

   5        1        tel
   1        1        tel
   2        0        tel
   1        1        tel
   3        0        tel
   2        1        tel
   5        0        habitat
   1        0        habitat
   2        1        habitat
   1        0        habitat
   3        1        habitat
   2        0        habitat

3. Etape 1 alternative – chpour regrouper les contrats dans une seule variable : PROC TRANSPOSE

Pourquoi un PROC SORT ? Dans cette section, il est fait usage de la procédure PROC TRANSPOSE pour modifier la structure du data set de départ. Comme une instruction BY est nécessaire, il est obligatoire d’avoir au préalable les données triées dans ce même ordre. Ceci explique la présence actuelle de la procédure PROC SORT.

Pourquoi une option OUT= ? une Ne souhaitant pas ajouter ces changement dans le fichier d’origine, j’ai donné le nom CONTRATS_UPDATE au nouveau data set. C’est un choix personnel pour cet article en particulier. Il n’y a aucune raison pour immiter obligatoirement ce choix.

proc sort data=contrats out=contrats_update;
   by client nb_cntr;
run;

L’objectif est d’avoir à présent autant de lignes que de type de contrats (2 lignes par client dans notre exemple). Pour chaque ligne est donné le nombre de contrats pouvant s’appliquer (variable NB_CONTR) et si oui ou nom ce nombre s’applique (variable NO_YES).

proc transpose data=contrats_transp
               out=contrats_transp (drop=client
                                    rename=(_name_=contrat col1=no_yes));
   by client nb_cntr;
   var tel habitat;
run;

Après avoir renommé les variables _NAME_ et COL1, nous retrouvons le même résultat que précédemment à l’exception de l’ordre dans lequel sont triées les données. Mais cela n’a pas d’effet dans notre PROC FREQ à venir.

    nb_cntr    contrat    no_yes

       5       tel         1
       5       habitat     0
       1       tel         1
       1       habitat     0
       2       tel         0
       2       habitat     1
       1       tel         1
       1       habitat     0
       3       tel         0
       3       habitat     1
       2       tel         1
       2       habitat     0

4. Etape 2 – Exécuter un PROC FREQ

ODS EXCLUDE ? Je souhaite créer un data set et seulement un data set. Hors par défaut le résultat (la sortie) est envoyé dans la fenêtre OUTPUT. L’instruction ODS EXCLUDE de début empêche cet envoi et celle de fin rétablit le statut initial.

ONEWAYFREQS ? Dans le cadre d’un tableau à une dimension, la sortie s’appelle ONEWAYFREQS. Un ODS TRACE ON/LISTING permet de retrouver lors d’une première exécution ce nom si vous avez oublié dans la fenêtre output (ODS TRACE OFF pour arrêter le processus).

ODS OUTPUT ? La sortie est envoyée dans le data set SOLUTION4 en se servant de l’instruction ODS OUTPUT et du nom de la sortie. Seules les variables CONTRAT et FREQUENCY sont conservées.

L’ancienne méthode ? En commentaire, vous trouverez l’option OUT= de l’instruction TAB qui vous fournira les mêmes statistiques. A noter que le nom de la variable pour les fréquences s’appelle cette fois COUNT et non plus FREQUENCY.

ods exclude onewayfreqs;
proc freq data=contrats_update (where=(no_yes=1));
   weight nb_cntr;
   by contrat;
   table no_yes;
   ods output onewayfreqs=solution4 (keep=contrat frequency);
   *table tmp/out=solution4 (keep=contrat count);
run;
ods exclude none;

Au final, on retrouve bien 9 contrats téléphoniques et 5 contrats d’habitation.

contrat Frequency

tel         9
habitat     5

Annexe : entrer les données dans un tableau SAS

data contrats;
   input client $ nb_cntr tel habitat;
   datalines;
a 5 1 0
b 1 1 0
c 2 0 1
d 1 1 0
e 3 0 1
f 2 1 0
;
run;
h1

Combien de contrats ai-je au total ? (3/5) PROC MEANS

novembre 10, 2008

Dans nos précédents articles du lundi, nous avons vu avec PROC SQL et RETAIN deux approches pour calculer le nombre total de contrats à partir du nombre de contrats par client. Il s’agit alors de résoudre une question posée sur le forum commentcamarche.net. Les données ont qu’en à elle une structure très particulière. La procédure PROC MEANS offre une troisième réponse possible comme nous le verrons ici.

Les données : Vous trouverez en fin d’article un rappel des données.

  • CLIENT : l’identifiant du client,
  • NB_CNTR : le nombre de contrats,
  • TEL: variable binaire (0/1) indiquant si oui ou non le nombre de contrat s’applique aux contrats téléphoniques du client
  • HABITAT : variable binaire (0/1) indiquant si oui ou non le nombre de contrat s’applique aux contrats habitation du client

1. La notion de coefficient (WEIGHT)

Les coefficient au bac : Les bacheliers français se souviendront d’avoir appliqué des coefficients à leur notes pour savoir combien de points ils leur fallait pour avoir le fameux sésam du bac. Il fallatt ainsi compter 5 fois la note d’histoire-géographie si le coefficient est de 5, etc.

La même notion de coefficient concerne aussi les bases de données. Il faut compter 5 fois une observation lorsqu’un coefficient de 5 est appliqué. En effet de manière générale, les données à disposition du programmeur contient soit toutes les informations ou un résumé de ces informations.

Traduction : En anglais, on parle de weight pour désigner les coefficient. En effet, le poids de chaque observation est mesuré.

Pourquoi utiliser des coefficients : Dans le cas d’un data set contenant des informations sur les contrats de cliens, une table pourrait avoir :

  • une ligne pour chaque contrat de chaque client ou
  • une ligne par client et le nombre de contrats qu’il a.

Dans le second cas, il y a une perte d’information pour les autres variables du data set mais le data set est moins volumineux.

Le mot-clé WEIGHT en SAS : De son côté, SAS utilise dans plusieurs procédures statistiques (PROC MEANS, PROC FREQ, etc.) le mot WEIGHT en tant que :

  • instruction,
  • option dans une instruction.

2. La notion de coefficient appliquée à nos données

WEIGHT=NB_CNTR : Dans notre exemple, la variable NB_CNTR indique combien de contrats un client a. Il s’agit de la variable servant de coefficient (weight).

client nb_contr tel habitat
   a       5     1     0
   b       1     1     0
   c       2     0     1
   d       1     1     0
   e       3     0     1
   f       2     1     0

Lister les variables concernées par le coefficient : SAS applique ce poids aux deux variables binaires TEL et HABITAT.

La variable TEL sera interprétée de la manière suivante :

client tel
   a    5
   b    1
   c    0
   d    1
   e    0
   f    2

Et la variable HABITAT sera interprétée ainsi :

client habitat
   a     0
   b     0
   c     2
   d     0
   e     3
   f     0

La syntaxe minimale du PROC MEANS : La procédure PROC MEANS listera dans un premier temps les variables binaires. Puis en option, désignera la variable weight afin de savoir par combien chaque valeur doit être multipliée.

proc means data=contrats sum;
   var tel habitat / weight=nb_cntr;
run;

L’option statistique SUM : pour ne voir que la somme des contrats il faut précise la statistique SUM en option de l’instruction PROC MEANS. Sinon, seont affichés les statistiques par défaut que sont

  • le nombre de contrat (N),
  • le plus petit/grand nombre de contrats (MIN/MAX),
  • la moyenne (MEAN) et
  • l’écart type (STD).

Résultats : Les premiers résultats dans la fenêtre OUTPUT confirme qu’il y a 9 contrats téléphoniques et 5 contrats d’habitation au total.

The MEANS Procedure
Variable            Sum
------------------------
tel            9.0000000
habitat        5.0000000
------------------------

2. Gérer les sorties de l’ODS

Par défaut les résultats sont redirigés vers la fenêtre OUTPUT de SAS.

Ajouter une destination avec ODS OUTPUT : Afin d’extraire le résultat dans un data set, il est possible d’ajouter une instruction ODS OUTPUT. Pour connaître le nom désignant la sortie générée par un PROC MEANS, utilisez au préalable ODS TRACE ON/LISTING et ODS TRACE OFF.

Stopper la destination OUTPUT avec ODS EXCLUDE : Si, de plus, le programmeur souhaite empêcher l’affichage de la sortie PROC MEANS dans la fenêtre OUTPUT, l’instruction ODS EXCLUDE doit être exécutée (ODS SELECT ALL annulera l’opération).

*ods trace on/listing;
proc means data=contrats sum;
   var tel habitat / weight=nb_cntr;
   ods exclude summary;
   ods output summary=solution3;
run;
*ods trace off;

Une version de base des statistiques sauvegardées dans un data set : Après un PROC PRINT sur le data set nouvellement créé (SOLUTION3), la sortie se présente sous une forme différente que dans la fenêtre OUTPUT.

VName_           VName_
 tel    tel_Sum  habitat  habitat_Sum

 tel       9     habitat      5

Pour modifier cette présentation, il est possible d’utiliser un PROC TRANSPOSE.

proc transpose data=solution3 out=solution3 (drop=_LABEL_);
   var tel habitat;
run;

Une version améliorée des statistiques sauvegardées dans un data set : Reste à vous le choix de renommer le nom des variables selon vos préférences.

  _NAME_    COL1
tel_Sum       7
habitat_Sum   5

Annexe :

data contrats;
   input client $ nb_cntr tel habitat;
   datalines;
a 5 1 0
b 1 1 0
c 2 0 1
d 1 1 0
e 3 0 1
f 2 1 0
;
run;

Plus de précisions sur la procédure PROC MEANS sont disponibles en ligne : SAS Online Doc : The MEANS Procedure.

A dans huit jours, pour une présentation de l’approche avec PROC FREQ. D’ici là je vous retrouve d’ici quelques jours pour le second article de la semaine.

h1

Combien de contrats ai-je au total ? (1/5) PROC SQL

octobre 27, 2008

Sur le forum www.commentcamarche.net, j’ai rencontré une question pour laquelle une série d’articles seront rédigés et ainsi pour présenter différentes solutions. Je commence aujourd’hui avec une procédure SQL précédée d’une introduction sur les données. Les quatre prochains articles utiliseront les compteurs, les procédures PROC MEANS, PROC FREQ et PROC TABULATE.

1. Les données

On part d’un fichier contenant une liste de clients et deux types de contrats : téléphone (tel) et habitation (habitat).

  • Une variable TEL indique si oui ou non le client a un contrat de téléphone peu importe qu’il s’agisse d’une ligne fixe, d’un téléphone portable personnel. Une variable NB_CNTR précise le nombre de contrats de ce type le client a signé.
  • Une variable HABITAT indique si oui ou non le client a un contrat en relation avec son habitat qu’il s’agisse de sa maison principale, sa maison secondaire ou d’un contrat de location pour ses enfants partis étudiés, etc. La variable NB_CNTR précise comme précédemment le nombre de contrats de ce type souscrit par le client.
data contrats;
   input client $ nb_cntr tel habitat;
   datalines;
a 5 1 0
b 1 1 0
c 2 0 1
d 1 1 0
e 3 0 1
f 2 1 0
;
run;

Objectif : Le but du jeu est de retrouver le nombre total de contrats téléphoniques et de contrats d’habitation, soit 9 dans le premier cas (5+1+1+2) et 5 dans le second cas (2+3).

2. La procédure SQL

Dans cet exemple, un data set, appelé SOLUTION1, est créé à partir du fichier CONTRATS.

Créer une nouvelle variable TEL : SAS créé une nouvelle variable TEL.

  • Nombre de contrats par client : Pour chaque ligne d’observation, SAS multiplie le nombre de contrat par la variable binaire TEL pour retrouver le nombre de contrats téléphonique par client.
a 5 1 0 => 5*1 = 5
b 1 1 0 => 1*1 = 1
c 2 0 1 => 2*0 = 0
d 1 1 0 => 1*1 = 1
e 3 0 1 => 3*0 = 0
f 2 1 0 => 2*1 = 2
  • Puis, il fait la somme de tous les nombres (5+1+0+1+0+2) pour connaître le nombre total de contrats téléphoniques. Ce nombre est répété pour chaque observation.
a 5 1 0 => 9
b 1 1 0 => 9
c 2 0 1 => 9
d 1 1 0 => 9
e 3 1 0 => 9
f 2 0 1 => 9

Créer une nouvelle variable HABITAT : De la même manière, une nouvelle variable HABITAT est créée.

  • Nombre de contrat par client : Pour chaque ligne d’observation, SAS multiplie le nombre de contrats par la variable binaire HABITAT pour retrouver le nombre de contrats liés à l’habitation par client.
a 5 1 0 => 5*0 = 0
b 1 1 0 => 1*0 = 0
c 2 0 1 => 2*1 = 2
d 1 1 0 => 1*0 = 0
e 3 0 1 => 3*1 = 3
f 2 1 0 => 2*0 = 0
  • Nombre total de contrats : Puis, il fait la somme de tous les nombres (0+0+2+0+3+0) pour connaître le nombre total de contrats d’habitation. Ce nombre est répété pour chaque observation.
a 5 1 0 => 5
b 1 1 0 => 5
c 2 0 1 => 5
d 1 1 0 => 5
e 3 0 1 => 5
f 2 1 0 => 5

Ne souhaitant pas afficher le nom des clients (variable CLIENT), il est possible d’extraire une seule ligne pour les nouvelles variables TEL et HABITAT en ajoutant le mot-clé DISTINCT. Comme toutes les lignes ont les valeurs 9 et 5, une seule sera conservée.

proc sql;
   create table solution1 as
      select distinct sum(nb_cntr*tel) as tel,
                      sum(nb_cntr*habitat) as habitat
      from contrats;
quit;

Je vous donne rendez-vous tous les lundi pour présenter une nouvelle solution à commencer par lundi prochain dans une étape data, basée sur la notion de variable compteur générée à partir d’un RETAIN.

h1

Un tableau à une dimension avec PROC FREQ et ODS OUTPUT

juillet 31, 2008

Pour personnaliser une sortie statistique générée par une procédure SAS, il faut parfois convertir ses résultats en tableau (SAS data set). Dans un précédent article, la procédure PROC MEANS a été mise à l’honneur (Diriger la sortie d’un PROC MEANS dans un dataset SAS). Maintenant nous abordons la procédure PROC FREQ dans le cadre d’un tableau à une dimension en combinaison avec l’instruction ODS OUTPUT.

1. Identifier le nom des sorties : un exemple avec une variable

ods trace on/listing;

*Exemple 1 : Proc Freq, une variable;
proc freq data=sashelp.class;
   table age;
run;

ods trace off;

On obtient deux types de tables selon qu’il s’agisse d’un tableau à une dimension ou à plusieurs dimensions.

  • OneWayFreqs: Dans le cas d’un PROC FREQ avec une seule variable, on parle de OneWayFreqs.
  • CrossTabFreqs: Dans le cas d’un tableau croisé, la sortie se nomme CrossTabFreqs.

Output Added:
————-
Name: OneWayFreqs
Label: One-Way Frequencies
Template: Base.Freq.OneWayFreqs
Path: Freq.Table1.OneWayFreqs
————-

1. Identifier le nom des sorties : un exemple avec 2 variables

Dans ce second exemple, deux variables (AGE et SEX)  sont listées. Les statistiques de l’une seront indépendantes des statistiques de l’autre.

ods trace on/listing;

*Exemple 2 : Proc Freq, deux variables;
proc freq data=sashelp.class;
   table age sex;
run;

ods trace off;

Pour distinguer les statistiques de la table SEX de celles de la table AGE, deux outputs sont créés dans la fenêtre OUTPUT. Leur nom (NAME) est identique mais leur chemin d’accès (PATH) varie. On parle de TABLE1 et TABLE2.

Output Added:
————-
Name: OneWayFreqs
Label: One-Way Frequencies
Template: Base.Freq.OneWayFreqs
Path: Freq.Table1.OneWayFreqs
————-

Output Added:
————-
Name: OneWayFreqs
Label: One-Way Frequencies
Template: Base.Freq.OneWayFreqs
Path: Freq.Table2.OneWayFreqs
————-

3. Identifier le nom des sorties : un exemple avec une instruction BY

Avant de se servir d’une instruction BY, les données doivent être triées. La procédure PROC SORT le fait. 

Le data set source est un data set non modifiable. C’est un data set de la bibliothèque SASHELP fournit avec le logiciel SAS.

La version triée est sauvegardée de manière temporaire dans la bibliothèque WORK (bibliothèque par défaut quand son nom n’est pas cité). Ce nouveau dataset s’appelle CLASS.

proc sort data=sashelp.class out=class;
   by sex;
run;

ods trace on/listing;

*Exemple 3 : Proc Freq, une variable et une instruction BY;
proc freq data=class;
   by sex;
   table age;
run;

ods trace off;

Avec une instruction BY, il y a plusieurs outputs pour une seule procédure dans la fenêtre OUTPUT. Les deux sorties ont le même nom (NAME) mais le chemin d’accès (PATH) est différent. On parle de TABLE1 dans les deux cas et de BYGROUP1 et BYGROUP2 pour les distinguer.

Output Added:
————-
Name: OneWayFreqs
Label: One-Way Frequencies
Template: Base.Freq.OneWayFreqs
Path: Freq.ByGroup1.Table1.OneWayFreqs
————-

Output Added:
————-
Name: OneWayFreqs
Label: One-Way Frequencies
Template: Base.Freq.OneWayFreqs
Path: Freq.ByGroup2.Table1.OneWayFreqs
————-

4. ODS OUTPUT et PROC FREQ

L’instruction ODS OUTPUT convertit les sorties dans un data set SAS. Voici donc le résultat de trois PROC PRINT sur les data sets créés avec l’instruction ODS OUTPUT.

4.1 Exemple 1, tableau avec une variable

Dans ce premier exemple, on note, d’une part, la présence de la variable caractère TABLE ; d’autre part, deux variables listent les différentes valeurs prises par la variable AGE : l’une est caractère, l’autre est numérique.

*Exemple 1 : Proc Freq, une variable;
proc freq data=sashelp.class;
   table age;
   ods output onewayfreqs=exemple1;
run;

                                         Cum      Cum
Table     F_Age Age Frequency Percent Frequency Percent

Table Age   11   11     2      10.53       2      10.53
Table Age   12   12     5      26.32       7      36.84
Table Age   13   13     3      15.79      10      52.63
Table Age   14   14     4      21.05      14      73.68
Table Age   15   15     4      21.05      18      94.74
Table Age   16   16     1       5.26      19     100.00

4.2 Exemple 2, tableau avec deux variables

En ajoutant une deuxième variable SEX, des variables supplémentaires sont ajoutées dans la table de sortie. Elles listent les valeurs prises par la variable supplémentaire. Comme précédemment avec la variable AGE, il y a deux variables pour accéder à la fois à l’information sous forme caractère et sous forme numérique a priori. Mais comme ici la variable d’origine est caractère, les deux sont de type caractère.

*Exemple 2 : Proc Freq, deux variables;
proc freq data=sashelp.class;
   table age sex;
   ods output onewayfreqs=exemple2;
run;

                                        Cum      Cum
Table    F_Age Age Frequency Percent Frequency Percent F_Sex Sex

Table Age  11   11     2      10.53        2     10.53
Table Age  12   12     5      26.32        7     36.84
Table Age  13   13     3      15.79       10     52.63
Table Age  14   14     4      21.05       14     73.68
Table Age  15   15     4      21.05       18     94.74
Table Age  16   16     1       5.26       19    100.00
Table Sex        .     9      47.37        9     47.37    F   F
Table Sex        .    10      52.63       19    100.00    M   M

4.3 Exemple 3, tableau avec une instruction BY

Avec l’instruction BY, une seule variable est créée pour distinguer les âges des hommes de ceux des femmes.

*Exemple 3 : Proc Freq, une variable et une instruction BY;
proc freq data=class;
  
by sex;
  
table age;
run;

                                             Cum      Cum
Sex   Table   F_Age Age Frequency Percent Frequency Percent

  Table Age   11   11     1      11.11      1      11.11
 F  Table Age   12   12     2      22.22      3      33.33
 F  Table Age   13   13     2      22.22      5      55.56
 F  Table Age   14   14     2      22.22      7      77.78
 F  Table Age   15   15     2      22.22      9     100.00
 M  Table Age   11   11     1      10.00      1      10.00
 M  Table Age   12   12     3      30.00      4      40.00
 M  Table Age   13   13     1      10.00      5      50.00
 M  Table Age   14   14     2      20.00      7      70.00
 M  Table Age   15   15     2      20.00      9      90.00
 M  Table Age   16   16     1      10.00     10     100.00

NOTE : Dans le cas de l’utilisation de plusieurs PROC FREQ se servant du même OUTPUT (onewayfreqs par exemple), il est conseillé de nettoyer l’ODS OUTPUT avec l’option CLEAR.

ods output clear;

h1

Des souvenirs de lycée, les logarithmes

juillet 2, 2008

Une des notations mathématiques qui est abordée au lycée en algèbre sont les logarithmes. Les propriétés de cette notation la rendent très attrayante pour exprimer et résoudre des équations. Mais vous souvenez vous du raisonnement qui se cache derrière ce nom ? Et savez-vous comment retrouver cette information en SAS ?

Cet article intéressera plus particulièrement ceux qui veulent replonger dans leur cours de statistique. En effet, les distributions statistiques, par exemple, sont formulées avec des équations contenant souvent des logarithmes. D’un point de vue professionnel, je n’ai jamais eu besoin de calculer un logarithme sous SAS pour l’industrie pharmaceutique.

1. Définition

Combien de fois faut-il multiplier 10 pour obtenir 1000 ? ou encore combien de fois faut-il multiplier 2 pour obtenir 32 ? Si vous avez la réponse à ces questions, vous êtes capable de résoudre des logarithmes.

Un logarithme est défini par une base. 10 et 2 sont les plus simples à comprendre dans un premier temps. Une base « e » rend les calculs plus simples. On parle alors de logarithme népérien ou logarithme naturel.

Dans le cas général, log symbolise le logarithme de manière général. Dans le cas particulier du logarithme népérien, log base e, le symbole est ln.

Les mathématiciens emploient plus facilement la base e dans la vie de tous les jours pour les raisons de facilité de calcul. Mais on a l’ordinateur de nos jours, me direz-vous. Alors il faut pensez au temps d’exécution de calculs complexes. Et là, même l’ordinateur sera content d’avoir des options pour résoudre le problème plus rapidement !

2. Exemples

Dans ce premier exemple, le logarithme de 1000 est défini par une base 10. Ainsi le but est de retrouver le nombre de fois 10 doit être multiplié pour obtenir le chiffre 1000. Sachant que 10x10x10=1000 ou de manière plus condensée 103=1000, la réponse est 3 fois.

log10 1000 = 3 car pour résoudre 10x=1000, on note x=3, soit 10x10x10=1000.

Dans ce second exemple, une base 2 est choisie. Il faut trouver le nombre de fois le nombre 2 est multiplié pour obtenir 32. La réponse est 5 fois.

log2 32 = 5 car pour résoudre 2x=32, on note x=5 soit 2x2x2x2x2=32.

Dans ce dernier exemple, une base e est choisie. Il s’agit du logarithme naturel ou logarithme népérien noté en langage courant ln. Pour retrouver la valeur approximative de e, on résout e1 sur son ordinateur ou sa calculatrice et on obtient une valeur de l’ordre de 2,71828.

loge 1 = ln 1 = 0 car pour résoudre ex =  1, on note x=0.

3. Calculer un logarithme en SAS

En SAS, il existe plusieurs types de fonctions LOG. Ainsi, notre log base 10 de 1000 devient LOG10 (1000) et notre log base 2 de 32 devient LOG2(32). Pour ce qui est du logarithme népérien, il suffit de ne pas préciser de chiffre LOG(1).

data _null_;
   log10_1000 = log10(1000);
   log2_32    = log2(32);
   loge_1     = log(1);
   loge_0     = log(0);
   put log10_1000 =;
   put log2_32    =;
   put loge_1     =   loge_0 = ;
run;

Dans l’exemple ci-dessus, j’ai arbitrairement choisi de ne pas créer de data set SAS en utilisant le mot _null_. Vous pouvez choisir de créer un data set et de l’afficher avec PROC PRINT.

Pour afficher les valeurs je me sers des instructions PUT. En choisissant d’ajouter le signe égal après le nom de la variable, non seulement la valeur des variables apparaîtront, mais aussi le nom des variables et le signe égal. Cela rend la lecture de l’information affichée dans la LOG plus facile. Faites le test sans le signe égal et vous verrez la différence dans la LOG.

Pour plus de précisions sur les fonctions logarithmiques, vous pouvez vous reporter à la documentation en ligne (SAS Online Doc. : LOG Function,  LOG10 Function, LOG2 Function). Sachez par ailleurs qu’il existe d’autres fonctions log sous SAS : LOGBETA, LOGCDC, LOGPDF et LOGSDF.

h1

Mes valeurs sont t’elles proches de la moyenne ? (écart-type)

juin 17, 2008

Pour résumer une série de mesures, il est courant de proposer la moyenne. Mais avoir une moyenne de 11 n’a pas le même sens selon que les valeurs soient dispersées entre 10 et 13, ou entre 0 et 20. Dans le premier cas, toutes les valeurs sont plus proches de la moyenne que dans le second cas. L’écart-type (ou standard deviation en anglais) reflète cette subtilité. Le statisticien aura pour rôle d’interpréter cette valeur. En comprenant le sens d’un écart-type,  le programmeur trouvera un outil supplémentaire pour vérifier la cohérence de ses résultats.

1. Des variables continues

La moyenne et l’écart-type sont des outils s’appliquant uniquement aux données numériques, suivant un ordre donné où l’écart entre chacune des valeurs potentielles est toujours le même. On peut donc parler de valeurs continues au sens large du terme.

Ainsi, l’âge d’une personne est une donnée continue qu’elle soit arrondie en années, en mois, en jours, en heure. La moyenne et l’écart-type auront une précision similaire.

2. Définition l’écart-type d’une population

L’écart-type ayant pour but de chiffrer l’écart entre les valeurs  et la moyenne. Il est donc logique de calculer la différence entre chaque valeur et la moyenne. Dans un premier temps, on a autant de différences que de valeurs. Dans un second temps, une valeur moyenne est extraite de ces différences.

1. Mettre au carré les différences : qui dit moyenne, dit somme des valeurs divisé par le nombre de valeur. Hors, la somme de valeurs positives et négatives s’annulent. Et dans notre cas, on a bien des valeurs inférieures et des valeurs supérieures à la moyenne. Dans le cas de l’écart-type, toutes les différences sont rendues positives en les multipliant par elles-mêmes (mises au carré).

C’est probablement pour des faciliter la résolution de calculs mathématiques que la mise au carré est préféré à la prise des valeurs absolu. Si vous avez une autre hypothèse, n’hésitez pas à en faire part.

2. Extraire la moyenne : on souhaite une moyenne. Donc la somme des différences (mises au carré) sont divisées par le nombre de différences. Si on s’arrête là, la statistique s’appelle la variance.

3. Exprimer la dispersion dans la même unité que la moyenne : A présent la somme des différences n’est plus dans la même unité que la moyenne. Pour parler dans la même unité, on prend la racine de l’ensemble du calcul.

3. Estimer l’écart-type d’une population à partir d’un échantillon

Contexte : il est fréquent de ne pas travailler sur la population qui nous intéresse mais sur un échantillon. Par exemple, si on mesure la pression artérielle systolique des patients d’une étude clinique pour savoir si la drogue a permis de la réduire, le statisticien n’est pas intéressé par la moyenne de ces patients mais bien celle de tous les personnes pouvant à l’avenir faire appel à cette drogue.

Le problème : De plus, les recherches statistiques ont permis de démontrer qu’en moyenne, la moyenne de tous les échantillons possibles est la même que celle de la population. Pour l’écart-type, c’est un peu moins simple, puisqu’il la moyenne des écarts-types de tous les échantillons n’est pas exactement égale à celle de la population.

La solution : Mais les chercheurs en statistique sont là ! Ils ont réussi à montrer qu’en enlevant 1 au nombre total de valeurs dans chacun des échantillons, on pouvait retrouver l’écart-type de la population (cf. des cours d’inférence qui semble si théorique au prime abord mais qui permettent d’accéder à l’arrière de la scène).

Vocabulaire : Et pour enrichir votre vocabulaire et surtout comprendre ces spécialistes sachez que si l’écart-type sera appelé un estimateur biaisé si le 1 n’est pas enlevé.

L’écart-type le plus utilisé est donc le second, celui où on divise les différences non pas par le nombre de différences mais le nombre de différences moins 1.

4. Comprendre la différence entre l’écart-type et l’erreur-type

Pour ceux qui auront une formation à composante statistique, vous pourrez être amené à expliquer en entretien ou à vos collègues la différence entre l’écart-type (standard deviation) et l’erreur-type (standard error). 

La première différence, c’est que l’écart-type s’applique à des données, alors que l’erreur-type s’applique à la statistique de la moyenne. 

A chaque fois, qu’un échantillon est pris, sa moyenne va servir à estimer la moyenne de la population. Bien-sûr, toutes les moyennes des échantillons ne sont pas identiques. Il existe une variabilité. Certains sont plus proches de la réalité que d’autre. Cette variabilité des résultats entre les échantillons est donnée par l’erreur-type. Ainsi un intervalle à l’intérieur duquel la moyenne de la population se tient pourra être estimé.

5. En langage mathématique, l’écart-type donne quoi ?

Pour désigner nos valeurs, le mathématicien utilise la lettre X.

  • Xi représente la ième valeur de l’échantillon. Si on a 15 valeurs alors i prend les valeurs de 1 à 15 ou plus généralement les valeurs de 1 à n.
  • La moyenne de ces Xi est symbolisée par un X avec une barre au dessus.

Pour calculer l’écart-type, on a parlé de trois étapes :

  1. sum(Xi-Xbar)2 Tout d’abord la différence entre chaque Xi et la moyenne X barre est calculée. Elles sont mises au carré. Puis, la somme de ces valeurs en est faite. On en profite pour préciser que les valeurs de i vont de 1 à n.
  2. sum(Xi-Xbar)2 / (n-1) Après, il s’agit de calculer la moyenne de ces valeurs
  3. racine(sum(Xi-Xbar)2 / (n-1)) Enfin, la statistique est convertie en une unité comparable à celle de la moyenne via la racine carré.

6. Et en langage SAS, comment trouver la valeur d’un écart-type ?

Dans tous les cas suivant, le dénominateur est n-1.

6.1 Fonction STD : La fonction STD (standard deviation) retourne la valeur de l’écart-type.

proc sql;
   select std(age) as std_age
   from sashelp.class;
quit;

6.2 Calcul manuel : dans un premier temps, la différence avec l’âge moyen est calculée pour chaque record. Chaque différence est mise au carré. Dans un deuxième temps, la somme de ces différences est divisée par le nombre de records moins 1. Enfin, la racine carrée du tout est prise.

proc sql;
   create table step1 as
      select (age-mean(age))**2 as step1
      from sashelp.class;
   select sqrt(sum(step1)/(count(*)-1)) as step2_3
      from step1;
quit;

6.3 Les procédures PROC MEANS et PROC SUMMARY : dans les exemples ci-dessous, j’ai volontairement choisi l’instruction ODS OUTPUT pour extraire les statistiques dans un data set.

proc means data=sashelp.class;
var age;
ods output Summary=proc_means;
run;

proc summary data=sashelp.class print;
   var age;
   ods output Summary=proc_summary;
run;

6.4 La procédure PROC UNIVARIATE : deux sorties fournies par la procédure UNIVARIATE sont indifféremment disponible.

proc univariate data=sashelp.class;
   var age;
   ods output Moments=proc_univ_opt1;
   ods output BasicMeasures=proc_univ_opt2;
run;