|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Futur Membre du Club
![]() Inscription : mars 2007 Messages : 101 ![]() |
Bonjour,
Pourcentages de variation Je cherche à calculer un pourcentage de variation de plusieurs manières, j'ai réussi avec LAG, avec RETAIN et encore avec SYMPUTX. L'idée est simple, j'ai plusieurs paramètres m1 à m5 à différents temps et je cherche à calculer leur pourcentage de variation aux différents temps (t = 1 à 3) par rapport à une baseline (t=0). Rien de bien compliqué (surtout que je ne prends pas en compte ici l'éventuel ID concerné). Mais quand j'essaye de faire ce calcul via des arrays, je n'arrive pas à mes fins : dans l'exemple ci-dessous je souhaite conserver dans Minit les valeurs initiales (t=0), mais en affichant le contenu du tableau, SAS a lu et conservé successivement toutes les valeurs de m1 à m5 (pas seulement celles de t=0) et je ne comprends pas cela... Pouvez-vous m'aider ? Code :
|
||
|
|
00
|
|
|
#2 |
|
Membre expérimenté
![]() Inscription : avril 2009 Messages : 538 ![]() |
/*en parcourant le tableau à chaque ligne j'obtiens les valeurs
successives de m1-m5 et pas les valeurs initiales que j'ai stockées à t=0 : POURQUOI?*/ Parce que tu n'as pas réassigné d'autres valeurs. Pour assigner des valeurs tu dois par exemple faire: l'instruction elle ne se fait qu'une fois. |
|
|
00
|
|
|
#3 |
|
Futur Membre du Club
![]() Inscription : mars 2007 Messages : 101 ![]() |
J'ai du mal... Justement comme je n'assigne qu'une fois mes valeurs (à t=0) je devrais les conserver tant que l'objet Minit existe. Je veux dire, à partir du moment où j'assigne au tableau les valeurs m1 à m5 à t=0 (et uniquement à ce temps) pourquoi SAS assigne par la suite de nouveau m1 à m5 à Minit avec les valeurs de t=1, puis de t=2 etc... ?
C'est comme si l'assignation était implicite à chaque ligne (alors que je fais cette affectation dans un bloc conditionnel). Je ne comprends pas bien la logique, pouvez-vous m'éclairer ? |
|
|
00
|
|
|
#4 |
|
Expert Confirmé
![]() ![]() Olivier DecourtFormateur en informatique Inscription : avril 2008 Messages : 1 467 ![]() |
Tu raisonnes comme si ARRAY était une instruction agissant à un niveau physique : on stocke dans les cases du tableau ce qui se trouve dans les variables. Mais c'est une instruction plutôt à effet logique : le nom de l'array n'est qu'une commodité pour désigner la réalité physique, toujours la même, de certaines variables.
Tu ne peux pas rendre l'instruction ARRAY elle-même conditionnelle. Elle est réalisée au démarrage de l'étape DATA, au niveau du PDV, avant même de commencer à lire des données. Ce qu'il te faudrait, ce serait un ARRAY avec des variables nouvelles à l'intérieur, et protégées par un RETAIN. Et à t=0 tu alimentes cet array avec les valeurs de tes variables M1-M5. |
|
|
10
|
|
|
#5 |
|
Futur Membre du Club
![]() Inscription : mars 2007 Messages : 101 ![]() |
Bonsoir,
donc si je comprends bien (attention je paraphrase pour être sûr de bien comprendre Donc le seul moyen de passer outre est de créer un array qui stocke de nouvelles variables (non contenues dans le fichier à l'origine), dans ce cas il ne fait "que" réserver de la place à ces variables. Et je peux alors assigner manuellement les valeurs d'une ligne en particulier aux cellules de ce tableau de manière conditionnelle (exemple : if _N_ = 1), c'est bien ça ? Le tableau se ré-initialise à chaque ligne ? Si non je ne comprends pas pourquoi utiliser RETAIN ? Qu'en est-il des tableaux _temporary_ ? Merci! PS : je fais de la pub, mais j'ai votre bouquin SAS l'essentiel et il m'aide beaucoup! |
|
|
00
|
|
|
#6 |
|
Expert Confirmé
![]() ![]() Olivier DecourtFormateur en informatique Inscription : avril 2008 Messages : 1 467 ![]() |
Oui, c'est bien ça.
L'Array pointant vers des variables "inédites" va effectivement les créer dans le vecteur de travail (PDV). Si on les initialise à t=0 / à _N_=1, elles ne seront pas modifiées ensuite au fil des observations... à condition de protéger les variables en question de la réinitialisation automatique qui touche le PDV avant chaque nouvelle observation lue. Cette protection, c'est ce qu'accorde l'instruction RETAIN. Les array _TEMPORARY_ fonctionnent à l'identique mais font l'objet d'un DROP implicite au moment d'écrire le PDV dans la table en sortie. PS : merci pour la pub. |
|
|
00
|
|
|
#7 |
|
Futur Membre du Club
![]() Inscription : mars 2007 Messages : 101 ![]() |
Dans ce cas, je peux faire un RETAIN directement sur mon array ? (genre RETAIN Minit) Ou je dois spécifier dans l'instruction RETAIN toutes les variables contenue par l'array ?
Qu'entendez-vous par DROP implicite sur les array _temporary_ ? |
|
|
00
|
|
|
#8 | ||
|
Expert Confirmé
![]() ![]() Olivier DecourtFormateur en informatique Inscription : avril 2008 Messages : 1 467 ![]() |
Non, pas d'écriture avec RETAIN et le nom de l'array. Il faut lister les éléments de l'array dans le RETAIN par leurs noms de variables. Ca peut se faire avec des écritures abrégées :
Code :
|
||
|
|
00
|
|
|
#9 |
|
Futur Membre du Club
![]() Inscription : mars 2007 Messages : 101 ![]() |
Parfait, j'ai compris, merci!
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com