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 :

Calcul de plusieurs moyenne sans prendre en compte les zéro


Sujet :

SAS Base

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2011
    Messages : 85
    Points : 45
    Points
    45
    Par défaut Calcul de plusieurs moyenne sans prendre en compte les zéro
    Bonjour à tous,

    dans le cadre de mon programme, je voudrais réussir à sortir les moyennes de plusieurs variables sans prendre en compte les zéros qu'elles contiennent.
    je n'arrive pas à avoir ses résultats dans une seule proc.

    je voudrais au final réunir l'ensemble des moyennes trouvé dans une seule et même table.

    merci pour votre aide

  2. #2
    Membre expérimenté
    Avatar de MEGAMIND2
    Homme Profil pro
    Paris
    Inscrit en
    Janvier 2011
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paris

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 029
    Points : 1 489
    Points
    1 489
    Par défaut
    Salut Antoine,
    Cet exemple pourrait solutionner ton problème

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    DATA test;
    	SET Sashelp.Class;
    	if ranuni(123)>0.7 then weight=.;
    	if ranuni(12) >0.6 then height=.;
    RUN;
     
    proc means data=test;
    	var weight height;
    	output out=out(drop=_type_ _freq_) mean=;
    	where not missing(weight) OR not missing(height);;
    run;
    mais si tu à plusieurs variables avec des valeurs manquantes, lister tout les no missing devient fastidieux.

  3. #3
    Membre chevronné
    Homme Profil pro
    Biostatisticien
    Inscrit en
    Juin 2009
    Messages
    1 206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Biostatisticien
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 206
    Points : 1 868
    Points
    1 868
    Par défaut
    salut,

    la proc means ci dessus retire les valeurs manquantes mais pas les 0 (qui n'est pas une valeur manquante). Il faut faire la même chose pour les 0 (et de toute facon, les valeurs manquantes n'interviennent pas dans le calcul d'une moyenne. A contrôler pour l'écart-type).

    Un problème peut se poser lorsque, en reprenant l'exemple ci dessus, le poids est manquant mais pas la taille. Avec cette syntaxe, cette observation avec une taille non manquante ne sera pas prise en compte.

    Vu que le but est uniquement de calculer les moyenne, je pencherais plutôt vers une étape data pour réaffecter les valeurs égales à 0 vers manquant. La proc means est alors directe. C'est une solution, mais il y a peut être des options qui gèrent bien ce pb.

    Manoutz

  4. #4
    Membre expérimenté
    Avatar de MEGAMIND2
    Homme Profil pro
    Paris
    Inscrit en
    Janvier 2011
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paris

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 029
    Points : 1 489
    Points
    1 489
    Par défaut
    Tu as raison Manoutz, ma solution ne traite pas son problème.
    Je pense qu'il va falloir créér une table par variable en calculant la moyenne et tout fusionnet à la fin.

  5. #5
    Membre chevronné
    Homme Profil pro
    Biostatisticien
    Inscrit en
    Juin 2009
    Messages
    1 206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Biostatisticien
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 206
    Points : 1 868
    Points
    1 868
    Par défaut
    Pas forcément, c'est ce que je disais au dessus. Vu qu'il calcule que les moyenne, il peut juste remplacer les 0 par des valeurs mq dans une étape data, et c'est plié.

  6. #6
    Modérateur

    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Février 2011
    Messages
    1 625
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2011
    Messages : 1 625
    Points : 3 403
    Points
    3 403
    Par défaut
    peut être avec un array dans une étape DATA, en remplaçant les valeurs 0 par manquantes?
    N'oubliez pas de consulter les FAQ SAS et les cours et tutoriels SAS
    N'oubliez pas de mettre votre message à si la solution donnée résout votre problème

  7. #7
    Membre chevronné
    Homme Profil pro
    Biostatisticien
    Inscrit en
    Juin 2009
    Messages
    1 206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Biostatisticien
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 206
    Points : 1 868
    Points
    1 868
    Par défaut
    Passer par des array, c'est un peu faire compliqué pour faire simple je pense. Un if then tout bête (par variable) devrait faire l'affaire.

  8. #8
    Modérateur

    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Février 2011
    Messages
    1 625
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2011
    Messages : 1 625
    Points : 3 403
    Points
    3 403
    Par défaut
    Oui mais si on a plusieurs variables, vaut mieux passer par un array numeric ?
    N'oubliez pas de consulter les FAQ SAS et les cours et tutoriels SAS
    N'oubliez pas de mettre votre message à si la solution donnée résout votre problème

  9. #9
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2011
    Messages : 85
    Points : 45
    Points
    45
    Par défaut
    merci je vais essayer de passer par une étape data en remplaçant les 0 par des valeurs manquantes.

  10. #10
    Membre chevronné
    Homme Profil pro
    Biostatisticien
    Inscrit en
    Juin 2009
    Messages
    1 206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Biostatisticien
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 206
    Points : 1 868
    Points
    1 868
    Par défaut
    @ SAM: les array numériques est une solution tout à fait viable. Et en terme "d'harmonie de code", c'est peut être mieux d'ailleurs, surtout s'il y a 1500 variables... Mais bon, c'est pas dit que la méthode if then soit plus lente à coder, grâce à la magie du copier coller (et puis je dois reconnaître, je ne suis pas un très grand utilisateur des array).. Tu peux toujours proposer à Antoine..

    @Antoine: Juste une précision: en remplacant tes 0 par des points, tu changes tes données, il faut en être conscient. Donc c'est mieux de créer un nouveau jeu de données dans l'étape data ou tu fais tes remplacements. Si tu veux rester sur ton jeu de données de base il faudra traiter variable par variable si tu rencontres des problèmes valeurs manquantes que pour certaines variables. Ou chercher s'il existe "l'option qui tue".

  11. #11
    Membre expérimenté
    Avatar de MEGAMIND2
    Homme Profil pro
    Paris
    Inscrit en
    Janvier 2011
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paris

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 029
    Points : 1 489
    Points
    1 489
    Par défaut
    C'est plus pratique avec les arrays


    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
    24
    25
    26
    27
    DATA test;
    	SET Sashelp.Class;
    	IF ranuni(123)>0.7 then weight=0;
    	IF ranuni(12) >0.5 then height=0;
    	IF ranuni(92) >0.4 then age=0;
    RUN;
     
    PROC CONTENTS DATA=test out=out(where=(type=1));
    RUN;
     
    PROC SQL;
    SELECT NAME INTO:NAME SEPARATED BY " " FROM OUT;
    QUIT;
     
    DATA test2;
    SET test;
    array origine[*] &NAME.;
    DO i=1 TO DIM(origine);
    IF origine[i]=0 THEN origine[i]=.;
    END;
    DROP i;
    RUN;
     
    PROC MEANS data=TEST2;
    	VAR &NAME.;
    	OUTPUT OUT=_moyenne(drop=_type_ _freq_) mean=;
    RUN;

  12. #12
    Modérateur

    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Février 2011
    Messages
    1 625
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2011
    Messages : 1 625
    Points : 3 403
    Points
    3 403
    Par défaut
    Je propose:



    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
    24
    25
    26
     
     
    DATA test;
    	SET Sashelp.Class;
    	IF ranuni(123)>0.7 then weight=0;
    	IF ranuni(12) >0.5 then height=0;
    	IF ranuni(92) >0.4 then age=0;
    RUN;
     
     
    DATA test2;
    SET test;
    array origine{*} _numeric_;
    DO i=1 TO DIM(origine);
    IF origine {i}=0 THEN origine{i}=.;
    END;
    DROP i;
    RUN;
     
     
     
     
    PROC MEANS DATA=TEST2;
    	VAR _numeric_; /*ici je ne suis pas sur de ce que  antoine2933 veut garder */
    	OUTPUT OUT=_moyenne(DROP=_type_ _freq_) mean=;
    RUN;
    N'oubliez pas de consulter les FAQ SAS et les cours et tutoriels SAS
    N'oubliez pas de mettre votre message à si la solution donnée résout votre problème

  13. #13
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2011
    Messages : 85
    Points : 45
    Points
    45
    Par défaut
    j'ai coder en utilisant une étape data, je vais essayé avec les array pour voir, mais je vous dit déja merci à tous les 3

  14. #14
    Membre expérimenté
    Avatar de MEGAMIND2
    Homme Profil pro
    Paris
    Inscrit en
    Janvier 2011
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paris

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 029
    Points : 1 489
    Points
    1 489
    Par défaut
    Pas mal Sam, ça m'évite deux proc à la c...

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

Discussions similaires

  1. Order by sans prendre en compte les majuscules minuscules
    Par skulled dans le forum Hibernate
    Réponses: 2
    Dernier message: 16/08/2011, 12h17
  2. Réponses: 3
    Dernier message: 16/12/2010, 09h03
  3. Réponses: 1
    Dernier message: 22/12/2008, 17h15
  4. Réponses: 1
    Dernier message: 06/08/2008, 12h04
  5. Réponses: 4
    Dernier message: 13/04/2007, 17h32

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