Précédent   Forum des professionnels en informatique > Logiciels > Solutions d'entreprise > Business Intelligence > SAS > SAS Base
SAS Base Forum d'entraide sur SAS base : étape data, procédures non statistiques, procédures non graphiques, SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 06/10/2011, 14h36   #1
Invité régulier
 
Inscription : mars 2008
Messages : 10
Détails du profil
Informations forums :
Inscription : mars 2008
Messages : 10
Points : 5
Points : 5
Par défaut Mode sous SAS

Bonjour,
je cherche a récupérer le mode dans une table SAS.
Je ne cherche pas a trouver le mode d'une variable (donc pas de proc univariate) mais pour chaque ligne le mode parmi plusieurs variables.

Par transposition, si je voulais récupérer le max je ferais :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
DATA test;
input a b c;
cards;
1 1 2
1 2 3
3 3 3
;
run;
 
 
DATA test;
SET test;
r = max(of a b c);
run;
Est ce qu'il y a un truc simple existant ou je vais devoir m'amuser à le programmer?


Merci d'avance
n3mrod est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/10/2011, 14h58   #2
Membre éclairé
 
Homme
statisticien
Inscription : mai 2011
Messages : 212
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : statisticien
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : mai 2011
Messages : 212
Points : 319
Points : 319
Bonjour,

Pour ma part il va être difficile de t'aider, je ne comprend pas ce que tu cherche a calculer.

Le "mode" est un terme attaché à la distribution d'une variable.

Or tu dis "Je ne cherche pas a trouver le mode d'une variable "

Il faudrait donc définir ce que tu entend précisément par "mode".
jerome_pdv2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/10/2011, 15h20   #3
Invité régulier
 
Inscription : mars 2008
Messages : 10
Détails du profil
Informations forums :
Inscription : mars 2008
Messages : 10
Points : 5
Points : 5
Salut,
Je cherche a trouver la modalité la plus fréquente parmi les variables a, b et c.
(J'ai utilisé le mot mode parce qu'a l'origine a, b et c sont trois modalités de la distribution d'une même variable).

Après si tu comprends ce que fait mon max, en fait je veux faire exactement pareil mais avec la modalité la plus présente.

Voila j'espère que c'est plus clair.
n3mrod est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/10/2011, 15h45   #4
Membre habitué
 
Sébastien Ringuedé
Inscription : janvier 2011
Messages : 61
Détails du profil
Informations personnelles :
Nom : Sébastien Ringuedé
Localisation : France, Loiret (Centre)

Informations forums :
Inscription : janvier 2011
Messages : 61
Points : 114
Points : 114
et bien tu transposes ta table et ensuite si tu as SAS 9.2, proc means ou proc univariate pour déterminer le mode

(il n'existe pas de fonction mode "en ligne")

a+

Sébastien Ringuedé
z6c3po est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/10/2011, 17h07   #5
Rédacteur
 
Homme Stéphane
Consultant et formateur SAS et Cognos
Inscription : avril 2009
Messages : 1 791
Détails du profil
Informations personnelles :
Nom : Homme Stéphane
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Consultant et formateur SAS et Cognos
Secteur : Conseil

Informations forums :
Inscription : avril 2009
Messages : 1 791
Points : 4 012
Points : 4 012
hop

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
DATA test;
input a b c;
cards;
1 1 2
1 2 3
3 3 3
;
run;
 
DATA test;
 SET test;
 
 array var[1:3] a b c ;
 DROP i j k nMode;
 nMode = 0;
 mode = 0;
 do i = 0 TO 9;
   k = 0;
   do j = 1 TO 3;
     k + (var[j]=i);
   end;
   IF k>=3 then do; 
     mode = i;
     goto done;
   end; else IF k > nMode then do;
     mode = i;
     nMode = k;
   end;
 end;
 done:
run;
__________________
N'oubliez pas de cliquer sur lorsque votre problème est réglé !

Moteur de recherche dans les papiers SAS
datametric est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/10/2011, 10h53   #6
Membre habitué
 
Sébastien Ringuedé
Inscription : janvier 2011
Messages : 61
Détails du profil
Informations personnelles :
Nom : Sébastien Ringuedé
Localisation : France, Loiret (Centre)

Informations forums :
Inscription : janvier 2011
Messages : 61
Points : 114
Points : 114
s'il s'agit de trouver le mode dans le cas de la table test proposée ici, ce n'est peut être pas la peine de faire aussi compliqué...

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
DATA test;
input a b c;
cards;
1 1 2
1 2 3
3 3 3
;
run;
 
DATA test;
   SET test;
   IF a=b | a=c then mode=a;
   IF b=c then mode=b;
run;
avec trois variables, le mode, c'est la modalité qu'on observe au moins deux fois.

a+

Sébastien Ringuedé
z6c3po est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/10/2011, 16h55   #7
Rédacteur
 
Homme Stéphane
Consultant et formateur SAS et Cognos
Inscription : avril 2009
Messages : 1 791
Détails du profil
Informations personnelles :
Nom : Homme Stéphane
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Consultant et formateur SAS et Cognos
Secteur : Conseil

Informations forums :
Inscription : avril 2009
Messages : 1 791
Points : 4 012
Points : 4 012
oui. mon truc était initialement pour 10 variables. je n'ai changé que la dimension de l'array.
__________________
N'oubliez pas de cliquer sur lorsque votre problème est réglé !

Moteur de recherche dans les papiers SAS
datametric est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/10/2011, 10h28   #8
Invité régulier
 
Inscription : mars 2008
Messages : 10
Détails du profil
Informations forums :
Inscription : mars 2008
Messages : 10
Points : 5
Points : 5
Bonjour,

Merci pour vos réponses,

Alors j'ai la confirmation que la fonction mode n'existe pas en ligne, c'est dommage ça aurait énormément améliorer mon temps de calcul.

Pour répondre à datametric et z6c3po, merci pour vos codes malheureusement ils vont mettre inutile, je dois calculer les mode parmi 8 variables et il s'agit de prix pouvant aller de 10 a 1000 euros (incluant des centimes).

Je crois donc que la seule solution qui me reste est effectivement de transposer mes données et de faire un proc univariate (ce que je voulais éviter depuis le début)
n3mrod est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/10/2011, 10h54   #9
Rédacteur
 
Homme Stéphane
Consultant et formateur SAS et Cognos
Inscription : avril 2009
Messages : 1 791
Détails du profil
Informations personnelles :
Nom : Homme Stéphane
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Consultant et formateur SAS et Cognos
Secteur : Conseil

Informations forums :
Inscription : avril 2009
Messages : 1 791
Points : 4 012
Points : 4 012


Et pourquoi mon ARRAY ne te convient pas alors ?
__________________
N'oubliez pas de cliquer sur lorsque votre problème est réglé !

Moteur de recherche dans les papiers SAS
datametric est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/10/2011, 10h58   #10
Invité régulier
 
Inscription : mars 2008
Messages : 10
Détails du profil
Informations forums :
Inscription : mars 2008
Messages : 10
Points : 5
Points : 5
En fait après reflexion, datametrics je me suis rendu compte que je pouvais utiliser ton code et en l'adaptant juste un tout petit peu le faire marché avec mes données.

J'ai aussi rajouté une étape, si j'ai deux modalités qui ont le même nombre d’occurrences je conserve la plus grande.

Mais bon je ne sais pas si ça pourra servir à d'autre personnes.


En tout cas merci beaucoup.



Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
 
DATA test;
 SET test;
 array var[1:3] a b c;
 DROP i j k nMode;
 nMode = 0;
 mode = 0;
 do i = 1 TO 3;
   k = 0;
   do j = 1 TO 3;
     k + (var[j]=var[i]);
   end;
   IF k>=3 then do; 
     mode = var[i];
     goto done;
   end; else IF k > nMode then do;
     mode = var[i];
     nMode = k;
   end;
   else IF k= nMode AND var[i]>mode then do;
     mode = var[i];
     nMode = k;
	end;
 end;
 done:
run;
n3mrod est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/10/2011, 11h21   #11
Rédacteur
 
Homme Stéphane
Consultant et formateur SAS et Cognos
Inscription : avril 2009
Messages : 1 791
Détails du profil
Informations personnelles :
Nom : Homme Stéphane
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Consultant et formateur SAS et Cognos
Secteur : Conseil

Informations forums :
Inscription : avril 2009
Messages : 1 791
Points : 4 012
Points : 4 012
J'ai essayé avec cela et c'est OK. Ca répond à ta question ?

Code :
1
2
3
4
5
6
7
8
9
DATA test;
input a b c;
cards;
-1 -1 2
-1 -1 .3
1 -2 .3
.3 .3 -.3
;
run;
__________________
N'oubliez pas de cliquer sur lorsque votre problème est réglé !

Moteur de recherche dans les papiers SAS
datametric est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/10/2011, 15h32   #12
Invité régulier
 
Inscription : mars 2008
Messages : 10
Détails du profil
Informations forums :
Inscription : mars 2008
Messages : 10
Points : 5
Points : 5
Oui parfaitement,

je l'ai intégré dans mon code et ça marche parfaitement.

Merci encore
n3mrod est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 00h59.


 
 
 
 
Partenaires

Hébergement Web