Précédent   Forum des professionnels en informatique > Logiciels > Solutions d'entreprise > Business Intelligence > SAS > Macro
Macro Forum d'entraide sur le langage Macro de SAS
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 03/08/2011, 11h48   #1
Invité de passage
 
jawed dridi
Inscription : juin 2010
Messages : 8
Détails du profil
Informations personnelles :
Nom : jawed dridi

Informations forums :
Inscription : juin 2010
Messages : 8
Points : 0
Points : 0
Par défaut Combinaison aléatoire sous SAS

Bonjour, je me permets de poster ce message car je suis dans une impasse dans une étape de programmation SAS :

J'ai une table de la forme suivante :

Variable Y | Var X1 | Var X2 | Var X3 | Var X4 | Var X5 |

avec pour chacune des variable un certain nombre de modalités (disons 1000).

J'aimerais trouver un moyen de faire la chose suivante :

Calculer les ratio entre Y et la moyenne d'une combinaison des Xi i.e :

Ratio1=Y/MEAN(X1,X2)
Ratio2=Y/MEAN(X1,X4,X5)...ect

pour au final obtenir le ratio de Y sur la moyenne de toutes les combinaisons possibles des Xi.

Je suis totalement bloqué sur ce point depuis plus de 3 semaines et je n'ai aucune idée de comment faire.

Si vous avez une idée, n'hésitez pas !

Merci d'avance.
funkymam69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/08/2011, 13h37   #2
Expert Confirmé
 
Avatar de olivier.decourt
 
Homme Olivier Decourt
Formateur en informatique
Inscription : avril 2008
Messages : 1 467
Détails du profil
Informations personnelles :
Nom : Homme Olivier Decourt
Âge : 34
Localisation : France

Informations professionnelles :
Activité : Formateur en informatique
Secteur : Conseil

Informations forums :
Inscription : avril 2008
Messages : 1 467
Points : 2 823
Points : 2 823
Bonjour.
Je crois que tu trouveras du matériau pour construire une solution dans ce topic.
Olivier
olivier.decourt est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/08/2011, 14h32   #3
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
salut

Olivier, bien vu la fonction ALLCOMB je ne savais même pas que ça existait

Comme je ne savais pas que ça existait, du coup je me suis essayé à faire ça en macro

Ca fait un excellent exercice de programmation macro

Hmm , enfin je suis arrivé a un code hideux mais qui marche mais moins souple que ce qui est proposé dans le lien, mon code marche uniquement avec une table qui a les noms de variable énoncés dans la question

X1 X2 X3 ...

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
32
33
34
35
36
37
38
39
40
41
42
 
DATA a;
do i=1 TO 100;
y=ranuni(45);
x1=ranuni(85);
x2=ranuni(86);
x3=ranuni(87);
x4=ranuni(88);
x5=ranuni(89);
output;
end;
run;
 
options mprint;
%macro combine(n=);
DATA a; SET a;
%do i=1 %TO %eval(2**&n.-1);
%put i &i.;
%let num=&i.;
%let motif=@;
%let impression=O;
%let moyenne=mean(;
%do j=%eval(&n-1) %TO 0 %BY -1;
%IF %eval((&impression.=O AND %eval((&i.=%eval(2**&j.))))=1) %then %let impression=N;
%IF %eval(&num.>=%eval(2**%eval(&j.+0))) %then 
				%do;
				%let num=%eval(&num.-%eval(2**%eval(&j.));
                %let motif=&motif.X%eval(&j.+1);
				%let moyenne=&moyenne.X%eval(&j.+1),;
                %end;
%end;
%let fin=%eval(%length(%bquote(&motif.))-1);
%let motif=%qsubstr(%bquote(&motif.),2,&fin.);
%let fin=%eval(%length(%bquote(&moyenne.))-1);
%let moyenne=%qsubstr(%bquote(&moyenne.),1,&fin.));
%IF %eval(&impression=O) %then %do;var&i.=&moyenne.;%end;
/*%if &impression=O %then %do;&motif.=&moyenne;%end;*/
%end;
run;
%mend;
 
%combine(n=5);

jerome_pdv2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/08/2011, 10h07   #4
Invité de passage
 
jawed dridi
Inscription : juin 2010
Messages : 8
Détails du profil
Informations personnelles :
Nom : jawed dridi

Informations forums :
Inscription : juin 2010
Messages : 8
Points : 0
Points : 0
Merci pour vos réponses si rapides !

Je suis vraiment impréssionné par vos réponses qui correspondent exactement à ce qu'il me fallait, je vous remercie car vous m'avez vraiment aidé.

Les var1,var2 ... qui sont construites par ta macro sont celles qu'il me fallait. Il me reste plus qu'a y integer que je veux faire le ratio entre la variable Y et toutes les combinaisons représentés par les var1, var2 ...

Puis-je revenir vers vous en cas de problème ?

Merci encore !!!
funkymam69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/08/2011, 10h39   #5
Invité de passage
 
jawed dridi
Inscription : juin 2010
Messages : 8
Détails du profil
Informations personnelles :
Nom : jawed dridi

Informations forums :
Inscription : juin 2010
Messages : 8
Points : 0
Points : 0
Bon ben c'est bon j'ai le résultat souhaité !

Je vous remercie une nouvelle fois !

En vous souhaitant une bonne journée,

Cordialement
funkymam69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/08/2011, 11h31   #6
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
Voici à ta demande le code simplifié et sans commentaires pour ratio=y/min(combinaison de variables) + les labels

Néanmoins regarde la proposition d'Olivier, elle te permettra sans nul de doute de produire un code bien plus élégant.

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
 
DATA a;
do i=1 TO 100;
y=ranuni(45);
x1=ranuni(85);
x2=ranuni(86);
x3=ranuni(87);
x4=ranuni(88);
x5=ranuni(89);
 
x6=ranuni(90);
x7=ranuni(91);
 
x8=ranuni(92);
x9=ranuni(93);
 
x10=ranuni(94);
x11=ranuni(95);
output;
end;
DROP i;
run;
 
options mprint;
 
%macro combine(n=);
DATA a; SET a;
%do i=1 %TO %eval(2**&n.-1);
%let num=&i.;
%let ratio=ratio&i.=Y/min(.,;
%do j=%eval(&n-1) %TO 0 %BY -1;
%IF %eval(&num.>=2**&j.) %then 
				%do;
				%let num=%eval(&num.-2**&j.);
				%let ratio=&ratio.X%eval(&j.+1),;
				 %end;
%end;
%let fin=%eval(%length(%bquote(&ratio.))-1);
%let ratio=%qsubstr(%bquote(&ratio.),1,&fin.));
&ratio.;
label ratio&i.="&ratio.";
%end;
run;
%mend;
 
%combine(n=5);
jerome_pdv2 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 12h23.


 
 
 
 
Partenaires

Hébergement Web