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 14/06/2011, 02h34   #1
Invité de passage
 
Femme
statisticien
Inscription : juin 2011
Messages : 3
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : Nouvelle-Calédonie

Informations professionnelles :
Activité : statisticien
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : juin 2011
Messages : 3
Points : 0
Points : 0
Par défaut Calcul taux de croissance "complexe"

Bonjour,

Depuis peu je dois utiliser SAS enterprise guide, mais parfois je retourne en programmation car je n'arrive pas à manipuler les données comme je le voudrais.
J'ai une table un peu complexe que j'ai trié comme suit :

ID (période)Commune VarA VARB …etc
1 A a l
2 A b m
3 A c n
4 A d o
1 B e p
2 B f q
3 B g r
4 B h s
…etc …etc …etc …etc …etc

Je veux calculer un taux de croissance pour chaque variable (VARA, puis VARB, ...etc), entre chaque période (ici de 1 à 4), qui correspond en fait à des dates (2009/07, 2009/08, 2009/09, ...etc) et dans chaque commune.
Les données des VARA et VARB sont numériques.

J'ai trouvé sur ce site une procédure qui a été écrite sur le forum SAS Base en 2008 :

Code :
1
2
3
4
5
6
proc sql;
CREATE TABLE PERF AS
  SELECT a.ID, (b.VAR - a.VAR) / a.VAR AS VAR_PERF
  FROM DATA a
    INNER JOIN DATA b ON a.ID = b.ID - 1;
quit;
Sans maîtriser totalement le langage, j'ai pu l'adapter à ma table mais uniquement pour une commune à la fois.
Avez-vous une solution ? Ou sur SAS entreprise guide ou sur un programme, pour que je puisse obtenir le résultat suivant :

ID (période)Commune VARA TxVARA VARB TxVARB
1 A a (b-a)/a l (m-l)/l
2 A b (c-b)/b m (n-m)/m
3 A c (d-c)/c n (o-n)/n
4 A d o
1 B e (f-e)/e p (q-p)/p
2 B f (g-f)/f q (r-q)/q
3 B g (h-g)/g r (s-r)/r
4 B h s


J'espère que vous avez une solution.
Merci d'avance pour votre géni.
laeticiagooding est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/06/2011, 07h42   #2
Expert Confirmé
 
Avatar de olivier.decourt
 
Homme Olivier Decourt
Formateur en informatique
Inscription : avril 2008
Messages : 1 467
Détails du profil
Informations personnelles :
Nom : Homme Olivier Decourt
Âge : 34
Localisation : France

Informations professionnelles :
Activité : Formateur en informatique
Secteur : Conseil

Informations forums :
Inscription : avril 2008
Messages : 1 467
Points : 2 823
Points : 2 823
Bonjour Laeticia.
Vu l'ordre de calcul de tes taux de croissance, il faudrait commencer par trier la table en ordre inverse : pour chaque commune, les périodes iraient de 4 à 1.
Ensuite, la fonction DIF te permet de faire la soustraction entre la valeur lue à l'observation précédente et la valeur courante.
Pour éviter de calculer des taux entre 2 communes différentes, on ajoutera une condition indiquant que rien n'est calculé si on aborde une nouvelle commune.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
DATA work.brut ; /* simulation de données */
 DO id=1 TO 4 ;
  DO commune="A","B" ;
    varA = FLOOR(RANUNI(1)*40+1) ;
	OUTPUT ;
  END ;
 END ;
RUN ;
PROC SORT DATA=work.brut ;
 BY commune 
    DESCENDING id ;
RUN ;
DATA work.evol ;
 SET work.brut ;
 BY commune ;
 txA = DIF(varA)/varA ;
 IF FIRST.commune THEN txA=. ;
RUN ;
PROC SORT DATA=work.evol ;
 BY commune id ;
RUN ;
Bon courage.
Olivier
olivier.decourt est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/06/2011, 04h18   #3
Invité de passage
 
Femme
statisticien
Inscription : juin 2011
Messages : 3
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : Nouvelle-Calédonie

Informations professionnelles :
Activité : statisticien
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : juin 2011
Messages : 3
Points : 0
Points : 0
Bonjour Olivier,

J'ai essayé d'apater le programme à mes données mais je n'ai pas réussi car je n'ai pas compris la première partie. Peux-tu me l'expliquer?
Code :
1
2
3
4
5
6
7
8
9
 
DATA work.brut ; /* simulation de données */
 DO id=1 TO 4 ;
  DO commune="A","B" ;
    varA = FLOOR(RANUNI(1)*40+1) ; /* c'est surtout ici...*/
	OUTPUT ;
  END ;
 END ;
RUN ;
Par contre j'ai appliqué le programme à partir d'ici et tu t'en doutes, j'ai les bonnes réponses mais dans le signe contraire. Au lieu de trouver -4% j'ai +4% par exemple.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
PROC SORT DATA=work.brut ;
 BY commune 
    DESCENDING id ;
RUN ;
DATA work.evol ;
 SET work.brut ;
 BY commune ;
 txA = DIF(varA)/varA ;
 IF FIRST.commune THEN txA=. ;
RUN ;
PROC SORT DATA=work.evol ;
 BY commune id ;
RUN ;
Je te remercie beaucoup pour ce programme qui me rend un énorme service.
A+

Laeticia.
laeticiagooding est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/06/2011, 07h14   #4
Expert Confirmé
 
Avatar de olivier.decourt
 
Homme Olivier Decourt
Formateur en informatique
Inscription : avril 2008
Messages : 1 467
Détails du profil
Informations personnelles :
Nom : Homme Olivier Decourt
Âge : 34
Localisation : France

Informations professionnelles :
Activité : Formateur en informatique
Secteur : Conseil

Informations forums :
Inscription : avril 2008
Messages : 1 467
Points : 2 823
Points : 2 823
Bonjour.
Comme tu ne proposais pas de valeurs dans ton exemple, la première étape DATA en simule. La ligne qui te dérange, avec la fonction RANUNI, ne sert qu'à produire des valeurs aléatoires pour remplir la table et remplacer les A, B, C, ... de ton exemple. Comme toi tu as les vraies données, cette étape est inutile.

Quant au signe, c'est la faute de DIF, qui fait "valeur courante - valeur précédente" alors qu'en général on veut le contraire. Il suffit donc de multiplier par -1 ton résultat pour retomber sur tes pieds.

Bonne journée.
Olivier
olivier.decourt est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/06/2011, 00h37   #5
Invité de passage
 
Femme
statisticien
Inscription : juin 2011
Messages : 3
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : Nouvelle-Calédonie

Informations professionnelles :
Activité : statisticien
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : juin 2011
Messages : 3
Points : 0
Points : 0
Merci beaucoup Olivier,
je ne connaissais pas du tout RANUNI, j'étais perdue.

Merci encore !!!

A+
laeticiagooding 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 01h06.


 
 
 
 
Partenaires

Hébergement Web