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 23/11/2011, 11h03   #1
Futur Membre du Club
 
Inscription : mars 2007
Messages : 101
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 101
Points : 15
Points : 15
Par défaut Pourcentage de variation : LAG, RETAIN, SYMPUTX => problème avec array

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 :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
DATA test;
input t m1 m2 m3 m4 m5;
cards;
0 1 1 1 1 1
1 2 2 2 2 2
2 3 3 3 3 3
3 4 4 4 4 4
;
run;
 
DATA _null_;
SET test;
/*stockage des valeurs au temps initial (t=0)*/
IF t=0 then do;    
    put 'Mes valeurs initiales (t=0) :' m1 m2 m3 m3 m5;
    array Minit m:; /*on stocke dans le tableau Minit les m1 à m5*/
end;
/*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?*/
do i= 1 TO dim(Minit);
    put "Minit" i " " Minit(i);
end;
run;
Merci pour votre aide précieuse!
cladoo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/11/2011, 16h12   #2
Membre expérimenté
 
Inscription : avril 2009
Messages : 538
Détails du profil
Informations forums :
Inscription : avril 2009
Messages : 538
Points : 541
Points : 541
/*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.
xav2229 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/11/2011, 16h22   #3
Futur Membre du Club
 
Inscription : mars 2007
Messages : 101
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 101
Points : 15
Points : 15
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 ?
cladoo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/11/2011, 16h53   #4
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 828
Points : 2 828
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.
olivier.decourt est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 23/11/2011, 17h38   #5
Futur Membre du Club
 
Inscription : mars 2007
Messages : 101
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 101
Points : 15
Points : 15
Bonsoir,

donc si je comprends bien (attention je paraphrase pour être sûr de bien comprendre ): la déclaration de l'array induit implicitement une affectation du contenu des variables qu'il stocke, et ce, à chaque ligne lue de l'étape DATA.
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!
cladoo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/11/2011, 17h52   #6
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 828
Points : 2 828
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.
olivier.decourt est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/11/2011, 18h06   #7
Futur Membre du Club
 
Inscription : mars 2007
Messages : 101
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 101
Points : 15
Points : 15
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_ ?
cladoo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/11/2011, 18h17   #8
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 828
Points : 2 828
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 :
1
2
3
RETAIN minit1 minit2 minit3 ;
RETAIN minit1-minit3 ;
RETAIN minit: ;
Pour le DROP implicite, je veux juste dire que _TEMPORARY_ n'a pour seule conséquence qu'on ne retrouvera pas les variables créées par l'ARRAY dans la table en sortie de l'étape DATA. Sans _TEMPORARY_, il faudrait faire un DROP de ces variables pour ne pas les avoir dans la table en sortie.
olivier.decourt est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/11/2011, 14h48   #9
Futur Membre du Club
 
Inscription : mars 2007
Messages : 101
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 101
Points : 15
Points : 15
Parfait, j'ai compris, merci!
cladoo 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 14h35.


 
 
 
 
Partenaires

Hébergement Web