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 STAT Discussion :

Remplacer des valeurs manquante par la moyenne des valeurs encadrantes


Sujet :

SAS STAT

  1. #1
    Membre à l'essai
    Inscrit en
    Novembre 2010
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 43
    Points : 23
    Points
    23
    Par défaut Remplacer des valeurs manquante par la moyenne des valeurs encadrantes
    Bonjour,

    J'ai un fichier contenant des mesures de température au pas quotidien. Hors certaines mesures sont manquantes et je souhaiterai les remplacer par la moyenne des valeurs encadrantes, c'est à dire faire la moyenne des mesures du jour d'avant et du jour d'aprés dans la case manquante. Lorsque deux (ou plus) jours manquent de façon consécutive, je voudrai mettre dans toutes les cases la même valeur qui serait la moyenne des températures encadrantes.

    Ca me parait bien compliqué à réaliser. Il faut vraisemblablement partir sur une boucle de type:
    "if temperature="" then do..."
    mais je sèche sur la syntaxe de la moyenne des valeurs encadrantes, d'autant plus que dans certains cas on a plusieurs valeurs manquantes consécutives.
    Ou alors une proc means, mais je ne vois absolument pas non plus la syntaxe qui me permettrait de faire ça.

    Merci!

    Astrid

  2. #2
    Membre éclairé
    Homme Profil pro
    responsable adjoint service stat
    Inscrit en
    Mars 2009
    Messages
    448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : responsable adjoint service stat
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2009
    Messages : 448
    Points : 823
    Points
    823
    Par défaut
    Voici une table qui correspond je pense à ton problème :
    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
    data table ;
    input jour temp ;
    format jour ddmmyy10. ;
    cards ;
    18263 1
    18264 2
    18265 .
    18266 4
    18267 .
    18268 .
    18269 .
    18270 8
    18271 .
    ;
    run ;
    La difficulté de ton problème vient de ce que l'on fasse appel à des lignes avant et des lignes après la ligne sur laquelle tu fais ton calcul, ce que SAS ne peut pas gérer. (lag() permet d'utiliser les lignes d'avant, mais pas celles d'après). Il faut donc procéder en plusieurs étapes.

    Et voici une solution à ton problème, basée sur deux tris successifs, l'utilisation d'un retain, de la fonction missing() et de la fonction mean()

    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
     
    proc sort data = table ; by descending jour ; run ;
    data table ;
        set table ;
        retain temp_sup ;
        if not missing(temp)
            then temp_sup = temp ;
    run ;
    proc sort data = table ; by jour ; run ;
    data table ;
        set table ;
        retain temp_inf ;
        if not missing(temp)
            then temp_inf = temp ;
    run ;
    data table ;
        set table ;
        if missing(temp)
            then temp_retraite = mean(temp_inf, temp_sup)  ;
            else temp_retraite = temp ;
        drop temp_inf temp_sup ;
    run ;
    La fonction mean permet de gérer simplement le cas où la première et/ou la dernière température est manquante. C'est plus propre que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    temp_retraite = (temp_inf + temp_sup) /2 ;

  3. #3
    Rédacteur

    Homme Profil pro
    SAS ALLIANCE SILVER. Consultant et formateur SAS et Cognos.
    Inscrit en
    Avril 2009
    Messages
    2 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : SAS ALLIANCE SILVER. Consultant et formateur SAS et Cognos.
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2009
    Messages : 2 497
    Points : 6 064
    Points
    6 064
    Par défaut
    ca à l'air bien mais tu peux regarder la proc Expand pour voir si elle ne te simplifierai pas ce travail ?
    N'oubliez pas de cliquer sur lorsque votre problème est réglé !

  4. #4
    Membre à l'essai
    Inscrit en
    Novembre 2010
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 43
    Points : 23
    Points
    23
    Par défaut
    Cette solution marche bien, merci beaucoup de vous être penchés sur la question!

    Astrid

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

Discussions similaires

  1. [Sources/Macros] Imputation des valeurs manquantes par la méthode des K plus proches voisins
    Par Haache dans le forum Contribuez
    Réponses: 0
    Dernier message: 14/04/2015, 11h07
  2. Remplacer les données manquantes par des zéro
    Par cococmoi dans le forum SAS Base
    Réponses: 1
    Dernier message: 20/05/2014, 12h06
  3. [Débutant] Remplacement de NaN par la moyenne des plus proches voisins
    Par mylia04 dans le forum MATLAB
    Réponses: 4
    Dernier message: 30/07/2013, 11h08
  4. Tri par la moyenne des valeurs de champs ?
    Par rozwel dans le forum Requêtes
    Réponses: 8
    Dernier message: 28/01/2005, 18h35
  5. Réponses: 3
    Dernier message: 18/05/2003, 00h16

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