IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SAS Base Discussion :

Pourcentage de variation : LAG, RETAIN, SYMPUTX => problème avec array [DATA]


Sujet :

SAS Base

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    315
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 315
    Points : 202
    Points
    202
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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!

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    747
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 747
    Points : 978
    Points
    978
    Par défaut
    /*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.

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    315
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 315
    Points : 202
    Points
    202
    Par défaut
    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 ?

  4. #4
    Expert confirmé
    Avatar de olivier.decourt
    Homme Profil pro
    Formateur R/SAS/statistiques
    Inscrit en
    Avril 2008
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Formateur R/SAS/statistiques
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 064
    Points : 4 478
    Points
    4 478
    Par défaut
    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.
    Bon courage.
    Olivier

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    315
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 315
    Points : 202
    Points
    202
    Par défaut
    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!

  6. #6
    Expert confirmé
    Avatar de olivier.decourt
    Homme Profil pro
    Formateur R/SAS/statistiques
    Inscrit en
    Avril 2008
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Formateur R/SAS/statistiques
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 064
    Points : 4 478
    Points
    4 478
    Par défaut
    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.
    Bon courage.
    Olivier

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    315
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 315
    Points : 202
    Points
    202
    Par défaut
    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_ ?

  8. #8
    Expert confirmé
    Avatar de olivier.decourt
    Homme Profil pro
    Formateur R/SAS/statistiques
    Inscrit en
    Avril 2008
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Formateur R/SAS/statistiques
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 064
    Points : 4 478
    Points
    4 478
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.
    Bon courage.
    Olivier

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    315
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 315
    Points : 202
    Points
    202
    Par défaut
    Parfait, j'ai compris, merci!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. problème avec array Notice: Undefined variable:
    Par seksaki dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 3
    Dernier message: 10/11/2009, 18h01
  2. Problème avec Array + Form
    Par GoodWear dans le forum Langage
    Réponses: 16
    Dernier message: 22/10/2009, 13h45
  3. [Tableaux] Problème avec array
    Par tremeur53 dans le forum Langage
    Réponses: 9
    Dernier message: 17/01/2009, 00h44
  4. Problème avec array
    Par mariak dans le forum ActionScript 1 & ActionScript 2
    Réponses: 1
    Dernier message: 28/11/2007, 07h58
  5. [MySQL] Problème avec array
    Par Dantahoua dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 19/03/2007, 22h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo