|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Invité régulier
![]() Inscription : avril 2009 Messages : 60 ![]() |
Bonjour à tous!
Je cherche une procédure qui donne le produit d'une variable en fonction d'un certain critère. C'est-à-dire, un genre de proc means by mais pour le produit. Cela existe en somme, moyenne et tout autre type de calculs statistiques mais est-ce que pour le produit cela existe? J'aimerais éviter de passer par des étapes data. J'ai aussi pensé à tout transformer ma variable en logarithme, puis faire une proc means by avec la somme puis repasser par l'exponentielle... Mais si on pouvait éviter cela par une simple procédure ce serait cool ![]() Merci beaucoup!!!! |
|
|
00
|
|
|
#2 |
|
Membre Expert
![]() ![]() Brice BeareParis Inscription : janvier 2011 Messages : 956 ![]() |
Bonjour,
C'est quoi le rapport entre produit et la log? Je n'ai pas trop compris |
|
|
01
|
|
|
#3 | ||
|
Expert Confirmé
![]() ![]() Olivier DecourtFormateur en informatique Inscription : avril 2008 Messages : 1 467 ![]() |
Bonjour.
Tu peux tout faire d'un coup en SQL, à condition de n'avoir pas de zéros ni de nombres négatifs pour pouvoir passer aux logarithmes. Code :
|
||
|
|
00
|
|
|
#4 |
|
Invité régulier
![]() Inscription : avril 2009 Messages : 60 ![]() |
Coucou!
Si je créée une nouvelle variable contenant le logarithme de la variable sur laquelle je veux faire mon produit, puis je somme avec une proc means en fonction de mon critère ("by monCritere") (par exemple le sexe) puis récupère la table de l'output out contenant les sommes pour y créer une nouvelle variable contenant l'exponentielle de la variable somme, j'aurais obtenu le produit de ma variable de départ! Je crois que je ne suis pas très claire... Exemple : Si on a un modèle sans critère et si ma variable y contient deux observations numériques ya=3 et yb=2. Je veux le produit de ya et yb : ya*yb. On sait que : ln(ya)+ln(yb)=ln(ya*yb) Ce qui donne quand on passe à l'exponentielle : exp(ln(ya)+ln(yb))=exp(ln(ya*yb)) Donc, exp(somme(ya,yb))=ya*yb=6. Dans ce que je veux faire, j'inclus un critère qui est le sexe. J'aurais plusieurs observations : sexe y f 3 m 4 m 2 f 5 m 2 f 1 Je souhaiterais donc avoir dans une table deux lignes (car il ya deux sexe sexe y f 15 m 16 Pour avoir cela, je créée une variable lny qui correspond au logarithme de y (désolée, j'avais la flemme de calculer les logarithmes...) : sexe y lny f 3 ln(3) m 4 ln(4) m 2 ln(2) f 5 ln(5) m 2 ln(2) f 1 0 Ensuite, je fais une proc means by sexe pour avoir la somme. Et j'obtiens (là aussi, je n'ai pas donné les valeurs calculées....) : sexe somme_lny f ln(3)+ln(5) m ln(4)+ln(2)+ln(2) Et donc on passe à l'exponentielle en créant une nouvelle variable, et on a : sexe somme_lny exp_somme_lny f ln(3)+ln(5) exp(ln(3)+ln(5)) m ln(4)+ln(2)+ln(2) exp(ln(4)+ln(2)+ln(2)) Et donc, comme je le disais dans l'exemple : exp(somme(ya,yb))=ya*yb, on déduit donc : exp(ln(3)+ln(5)) = 3*5 =15 exp(ln(4)+ln(2)+ln(2)) = 4*2*2 =16 Soit la table : sexe somme_lny exp_somme_lny f ln(3)+ln(5) 15 m ln(4)+ln(2)+ln(2) 16 Voilà! Mais bon, j'aimerais juste éviter de passer par tout ça... Juste pour savoir si une procédure existait... Merci beaucoup |
|
|
00
|
|
|
#5 |
|
Invité régulier
![]() Inscription : avril 2009 Messages : 60 ![]() |
Merci beaucoup olivier.decourt!
Je n'avais pas pensé au SQL! |
|
|
00
|
|
|
#6 |
|
Invité régulier
![]() Inscription : avril 2009 Messages : 60 ![]() |
Bonjour, que faire lorsque ma variable est égale à 0 ou est négative? :/
|
|
|
00
|
|
|
#7 |
![]() ![]() Stéphane Consultant et formateur SAS et Cognos Inscription : avril 2009 Messages : 1 791 ![]() |
Si j'ai suivi (c'est pas dit) alors le produit est fourni dans la proc EXPAND (CUPROD cumulative product).
http://support.sas.com/documentation...nd_sect026.htm
__________________
N'oubliez pas de cliquer sur lorsque votre problème est réglé !Moteur de recherche dans les papiers SAS |
|
10
|
|
|
#8 | ||
|
Expert Confirmé
![]() ![]() Olivier DecourtFormateur en informatique Inscription : avril 2008 Messages : 1 467 ![]() |
Effectivement, la proc EXPAND est géniale... à condition d'avoir un module SAS/ETS sous licence.
Sinon, on continue la foire aux maths en SQL (attention ça tache) : Code :
|
||
|
|
00
|
|
|
#9 |
![]() ![]() Stéphane Consultant et formateur SAS et Cognos Inscription : avril 2009 Messages : 1 791 ![]() |
la proc FCMP ne serait pas plus simple ?
__________________
N'oubliez pas de cliquer sur lorsque votre problème est réglé !Moteur de recherche dans les papiers SAS |
|
00
|
|
|
#10 |
|
Expert Confirmé
![]() ![]() Olivier DecourtFormateur en informatique Inscription : avril 2008 Messages : 1 467 ![]() |
La question (je n'ai rien testé, je pose des questions philosophiques) serait : est-ce que FCMP produirait une fonction "en ligne" (qui s'applique par observation) ou "en colonne" ? En SQL, pas de souci, on peut faire les 2. Mais comme FCMP génère des fonctions qu'on peut utiliser dans une étape DATA, un WHERE, du SQL, ..., je ne sais pas comment on se ferait comprendre.
Je teste ce soir, sauf si une bonne âme s'y colle avant. |
|
|
00
|
|
|
#11 | ||||||
|
Invité régulier
![]() Inscription : avril 2009 Messages : 60 ![]() |
ReCoucou!
Alors, j'ai effectué la Proc Expand : Code :
J'ai donc opté pour du SQL avec : Code :
J'ai pensé à une jointure : Code :
Est-ce que vous avez une solution? Merci beaucoup!!!! |
||||||
|
|
00
|
|
|
#12 | ||
|
Expert Confirmé
![]() ![]() Olivier DecourtFormateur en informatique Inscription : avril 2008 Messages : 1 467 ![]() |
@MissPatate pour le SQL : pas besoin de rappeler le nom de la bibliothèque dans les préfixes de variables. Pour éviter de se mélanger entre les deux allusions à la même table, il faudrait leur donner des alias (AS alias après le nom de la table dans les FROM) et préfixer avec l'alias.
Cela dit, la jointure imbriquée corrélée c'est aussi très consommateur de ressources. @MissPatate pour la proc EXPAND : ça ne me semble pas très long (en regard de toutes les autres solutions) de faire à la suite de ton exemple Code :
@Datametric pour la proc FCMP : comme je le craignais, FCMP est une productrice de fonctions "en ligne" et ne supporte pas les fonctions statistiques de la proc SQL. Enfin à ce que j'ai trouvé jusqu'à présent. |
||
|
|
00
|
|
|
#13 |
|
Invité régulier
![]() Inscription : avril 2009 Messages : 60 ![]() |
Coucou!
Un grand Merci à tous pour votre aide! Je n'avais pas vu les posts après mon avant dernier message, donc je n'avais pas vu le programme en SQL! Je vais donc plutôt récupérer ton code Olivier qui est largement mieux que le mien! Merci pour tes conseils! Effectivement, pour l'après proc expand, il aurait fallu faire une data de ce type |
|
|
00
|
|
|
#14 | ||
|
Invité régulier
![]() Inscription : avril 2009 Messages : 60 ![]() |
Re
J'ai pas trop compris cette partie de ton code : Code :
|
||
|
|
00
|
|
|
#15 |
|
Expert Confirmé
![]() ![]() Olivier DecourtFormateur en informatique Inscription : avril 2008 Messages : 1 467 ![]() |
SIGN(x) renvoie 1, -1 ou 0 selon le signe de la valeur de X (positif, négatif ou nul respectivement).
SIGN(x)=-1 est une condition, donc évaluée par SAS à vrai (1) ou faux (0) selon la valeur de X. Si on somme ces 0 et ces 1, on obtient le nombre de fois où X est négatif. MOD(x,2) est le résultat de la division euclidienne (c'est à dire sans décimales, comme en CM2) de x par 2 : on obtient 0 ou 1 selon que x est pair ou impair respectivement. Donc MOD(SUM(SIGN(x)=-1),2)=1 est vrai quand on a un nombre impair de valeurs négatives de x. Dans ce cas le produit est négatif, d'où la multiplication par -1. |
|
|
00
|
|
|
#16 |
|
Invité régulier
![]() Inscription : avril 2009 Messages : 60 ![]() |
Merci beaucoup, je n'avais pas du tout pensé aux signes!!
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com