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

Débutez Discussion :

Problème avec lag


Sujet :

Débutez

  1. #1
    Nouveau membre du Club

    Inscrit en
    Octobre 2007
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 33
    Points : 36
    Points
    36
    Par défaut Problème avec lag
    Bonjour,

    Je débute et j'ai un code de ce type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    DATA MaLib.MaTable (KEEP=Var Var1 Var2 N);
    SET MaLib.MaTable;
    Var1=lag30(Var);
    if _N_>30 then Var2=lag30(Var);
    N=_N_;
    RUN;
    Pour N compris entre 31 et 60 inclus, j'ai une valeur pour Var1 et pas pour Var2 et je ne comprend pas pourquoi.
    (Par N<=30 les deux variables sont vides, pour N>=61 elles sont remplies avec la bonne valeur)

    Qui peut m'expliquer ?

    Pierre.

  2. #2
    Membre éprouvé
    Avatar de Haache
    Homme Profil pro
    Doctorant & Ingénieur Statiaticien Economiste
    Inscrit en
    Mars 2014
    Messages
    349
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Canada

    Informations professionnelles :
    Activité : Doctorant & Ingénieur Statiaticien Economiste

    Informations forums :
    Inscription : Mars 2014
    Messages : 349
    Points : 1 009
    Points
    1 009
    Billets dans le blog
    8
    Par défaut
    Bonjour,
    Oui c'est tout à fait normal. C'est de cette façon que le If fonctionne. En réalité, lorsque vous avez dit :
    si _n_ >=30 Sas supprime implicitement les lignes qui ne vérifient pas la condition. Donc une nouvelle table virtuelle sera créée à partir de _n_=31. C'est à cette table qu'il va appliquer Var2=log30(Var). Evidemment à la ligne 31 (qui représente ligne 1 dans la table virtuelle) l'opération ne sera pas possible. Il va falloir qu'il atteigne ligne 61 (qui représente ligne 31 dans la table virtuelle) pour effectuer l'opération.

    Je vais vous donner un exemple plus étrange avec les if.
    Supposons cette table
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    data test;input X @@;
    cards;
    59 19 97 13 7 19 1 7 8 1 6  1 79 1 7 891 7 91 7 91 79 9 79 1 
     8917 98 91 7 91 79 179 78 1897 1
    ; run;
    je soumets ce code sur la table
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    data test1;set test;
    if X > 10 then X1=lag5(X);
    run;
    Analysons ensemble le rendu
    Nom : Capture.PNG
Affichages : 227
Taille : 11,4 Ko

    En d'autres termes, une table virtuelle a été créée en utilisant la consition X>10. Cette table sera :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    data virtuel;set test;
    if X>10;
    run;
    Nom : Capture.PNG
Affichages : 207
Taille : 6,5 Ko

    C'est sur cette table que la requête X1=lag5(X) sera exécutée. Donc c'est la 6eme ligne de la table virtuelle (où X=79) qui aura la première valeur pour X1. Ceci correspond exactement au résultat obtenu dans la table test1. La ligne qui a X=79 correspond à la 13eme ligne qui a la première valeur. C'est de cette façon que SAS traite les if clauses. Votre résultat est tout à fait normal.
    • Faites un tour sur mon siteweb professionnel www.aristideelysee.16mb.com Des codes dans la section "media et code" pouvant vous aider que vous pouvez aussi partager sur les réseaux sociaux.
    • Visiter mon blog en cliquant ici! Des techniques, astuces et macros pour l'analyse quantitative.

  3. #3
    Nouveau membre du Club

    Inscrit en
    Octobre 2007
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 33
    Points : 36
    Points
    36
    Par défaut
    Et bien merci pour cet exposé complet.

    Pour résumé, Lag5 ne va pas chercher 5 lignes avant, mais
    1) stocke la valeur actuelle,
    2) si on est passé au moins 5 fois sur la ligne, on va chercher la valeur d'il y a 5 passages,
    3) le stockage de la valeur est propre à la ligne, donc si on appel plusieurs fois la fonction lag sur la même variable, on a des résultats indépendants.

    Pierre

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 24/11/2011, 15h48
  2. [PRO*C] probléme avec la fonction Lead | Lag
    Par Sixclopes dans le forum Interfaces de programmation
    Réponses: 1
    Dernier message: 28/05/2010, 12h52
  3. [AC-2003] Problème de lag sur formulaire avec table liée
    Par benjamin002 dans le forum IHM
    Réponses: 0
    Dernier message: 04/02/2010, 10h42
  4. Problème avec la fonction LAG
    Par CélineM dans le forum SAS Base
    Réponses: 8
    Dernier message: 01/07/2008, 16h00
  5. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 17h10

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