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 18/05/2011, 13h17   #1
Candidat au titre de Membre du Club
 
Homme
Étudiant
Inscription : avril 2011
Messages : 75
Détails du profil
Informations personnelles :
Sexe : Homme

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

Informations forums :
Inscription : avril 2011
Messages : 75
Points : 11
Points : 11
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
antoine2933 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/05/2011, 13h57   #2
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 956
Détails du profil
Informations personnelles :
Nom : Homme Brice Beare
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Paris

Informations forums :
Inscription : janvier 2011
Messages : 956
Points : 1 366
Points : 1 366
Salut Antoine,
Cet exemple pourrait solutionner ton problème

Code :
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.
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/05/2011, 14h09   #3
Membre Expert
 
Homme
Biostatisticien
Inscription : juin 2009
Messages : 1 143
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Irlande

Informations professionnelles :
Activité : Biostatisticien
Secteur : Industrie Pharmaceutique

Informations forums :
Inscription : juin 2009
Messages : 1 143
Points : 1 760
Points : 1 760
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
Manoutz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/05/2011, 14h32   #4
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 956
Détails du profil
Informations personnelles :
Nom : Homme Brice Beare
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Paris

Informations forums :
Inscription : janvier 2011
Messages : 956
Points : 1 366
Points : 1 366
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.
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/05/2011, 14h43   #5
Membre Expert
 
Homme
Biostatisticien
Inscription : juin 2009
Messages : 1 143
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Irlande

Informations professionnelles :
Activité : Biostatisticien
Secteur : Industrie Pharmaceutique

Informations forums :
Inscription : juin 2009
Messages : 1 143
Points : 1 760
Points : 1 760
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é.
Manoutz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/05/2011, 14h44   #6
Modérateur
 
Homme Samir SELMANE
Consultant en Business Intelligence
Inscription : février 2011
Messages : 1 006
Détails du profil
Informations personnelles :
Nom : Homme Samir SELMANE
Localisation : France

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

Informations forums :
Inscription : février 2011
Messages : 1 006
Points : 1 703
Points : 1 703
peut être avec un array dans une étape DATA, en remplaçant les valeurs 0 par manquantes?
s_a_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/05/2011, 14h49   #7
Membre Expert
 
Homme
Biostatisticien
Inscription : juin 2009
Messages : 1 143
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Irlande

Informations professionnelles :
Activité : Biostatisticien
Secteur : Industrie Pharmaceutique

Informations forums :
Inscription : juin 2009
Messages : 1 143
Points : 1 760
Points : 1 760
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.
Manoutz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/05/2011, 14h55   #8
Modérateur
 
Homme Samir SELMANE
Consultant en Business Intelligence
Inscription : février 2011
Messages : 1 006
Détails du profil
Informations personnelles :
Nom : Homme Samir SELMANE
Localisation : France

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

Informations forums :
Inscription : février 2011
Messages : 1 006
Points : 1 703
Points : 1 703
Oui mais si on a plusieurs variables, vaut mieux passer par un array numeric ?
s_a_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/05/2011, 15h00   #9
Candidat au titre de Membre du Club
 
Homme
Étudiant
Inscription : avril 2011
Messages : 75
Détails du profil
Informations personnelles :
Sexe : Homme

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

Informations forums :
Inscription : avril 2011
Messages : 75
Points : 11
Points : 11
merci je vais essayer de passer par une étape data en remplaçant les 0 par des valeurs manquantes.
antoine2933 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/05/2011, 15h09   #10
Membre Expert
 
Homme
Biostatisticien
Inscription : juin 2009
Messages : 1 143
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Irlande

Informations professionnelles :
Activité : Biostatisticien
Secteur : Industrie Pharmaceutique

Informations forums :
Inscription : juin 2009
Messages : 1 143
Points : 1 760
Points : 1 760
@ 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".
Manoutz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/05/2011, 15h19   #11
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 956
Détails du profil
Informations personnelles :
Nom : Homme Brice Beare
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Paris

Informations forums :
Inscription : janvier 2011
Messages : 956
Points : 1 366
Points : 1 366
C'est plus pratique avec les arrays


Code :
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;
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/05/2011, 15h35   #12
Modérateur
 
Homme Samir SELMANE
Consultant en Business Intelligence
Inscription : février 2011
Messages : 1 006
Détails du profil
Informations personnelles :
Nom : Homme Samir SELMANE
Localisation : France

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

Informations forums :
Inscription : février 2011
Messages : 1 006
Points : 1 703
Points : 1 703
Je propose:



Code :
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;
s_a_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/05/2011, 15h37   #13
Candidat au titre de Membre du Club
 
Homme
Étudiant
Inscription : avril 2011
Messages : 75
Détails du profil
Informations personnelles :
Sexe : Homme

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

Informations forums :
Inscription : avril 2011
Messages : 75
Points : 11
Points : 11
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
antoine2933 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/05/2011, 15h46   #14
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 956
Détails du profil
Informations personnelles :
Nom : Homme Brice Beare
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Paris

Informations forums :
Inscription : janvier 2011
Messages : 956
Points : 1 366
Points : 1 366
Pas mal Sam, ça m'évite deux proc à la c...
MEGAMIND2 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 14h38.


 
 
 
 
Partenaires

Hébergement Web