Précédent   Forum des professionnels en informatique > Logiciels > Solutions d'entreprise > Business Intelligence > SAS > Macro
Macro Forum d'entraide sur le langage Macro de SAS
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 19/01/2011, 21h10   #1
Invité régulier
 
Inscription : août 2008
Messages : 16
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 16
Points : 7
Points : 7
Par défaut Indice de Gini explication !

Bonjour,
je dois calculer l'indice de Gini et je viens de télécharger la macro "SAS Lorenz" crée par Jacquot de l'ENSAE dont je trouve très pratique si elle marche . Mon problème est que je ne sais pas comment doit être ma table d'entrée et je ne comprend pas non plus certaines lignes de commande de la macro, par exemple que fait cette ligne de commande?
Code :
 _GINI_   + &FREQ/&TOTFREQ*(Y&V+F&V)/2;
Quelqu'un pourrait t-il m'eclaircir?
Merci d'avance!
adbary est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/01/2011, 08h23   #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
Citation:
Envoyé par adbary Voir le message
Bonjour,
je dois calculer l'indice de Gini et je viens de télécharger la macro "SAS Lorenz" crée par Jacquot de l'ENSAE dont je trouve très pratique si elle marche . Mon problème est que je ne sais pas comment doit être ma table d'entrée et je ne comprend pas non plus certaines lignes de commande de la macro, par exemple que fait cette ligne de commande?
Code :
 _GINI_   + &FREQ/&TOTFREQ*(Y&V+F&V)/2;
Quelqu'un pourrait t-il m'eclaircir?
Merci d'avance!
Il faudrait peut être la macro en entier pour pouvoir t'aider (perso)!
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/01/2011, 10h08   #3
Rédacteur
 
Homme Stéphane
Consultant et formateur SAS et Cognos
Inscription : avril 2009
Messages : 1 791
Détails du profil
Informations personnelles :
Nom : Homme Stéphane
Localisation : France, Yvelines (Île de France)

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

Informations forums :
Inscription : avril 2009
Messages : 1 791
Points : 4 012
Points : 4 012
Il n'y a pas une doc avec ?
__________________
N'oubliez pas de cliquer sur lorsque votre problème est réglé !

Moteur de recherche dans les papiers SAS
datametric est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/01/2011, 19h10   #4
Invité régulier
 
Inscription : août 2008
Messages : 16
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 16
Points : 7
Points : 7
Voici le code; merci d'avance!
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
%MACRO CALCUL(NUM);
  %LET V= _V&NUM._;
  %LET VVV=&&V#
PROC SUMMARY DATA=_VV_;
  VAR &V &FREQ;
  OUTPUT OUT=_TOTAL_(DROP=_TYPE_) SUM= ;
DATA _NULL_;SET _TOTAL_;
  CALL SYMPUT('TOTVAR',&V);
  CALL SYMPUT('TOTFREQ',&FREQ);
  CALL SYMPUT('NOBS',_FREQ_);
 
DATA _ZZ_;SET _VV_(KEEP=&V &FREQ);
      Z&V=(&V/&FREQ)/(&TOTVAR/&TOTFREQ);
      IF Z&V NE 0 THEN L&V=LOG(Z&V);ELSE L&V=0;
      R&V=SQRT(Z&V);
PROC SORT DATA=_ZZ_;BY Z&V;
PROC SUMMARY DATA=_ZZ_;
     VAR Z&V;
     OUTPUT OUT=_TOTAL_(DROP=_TYPE_) MEAN= ;
DATA _NULL_;SET _TOTAL_;
     CALL SYMPUT('MASP',Z&V);
PROC SUMMARY DATA=_ZZ_;
     VAR L&V R&V;WEIGHT &FREQ;
     OUTPUT OUT=_TOTAL_(DROP=_TYPE_) MEAN= ;
DATA _NULL_;SET _TOTAL_;W&V=EXP(L&V);J&V=(R&V)**2;
     CALL SYMPUT('MRSP',J&V);
     CALL SYMPUT('MGSP',W&V);
DATA _ZZ_;SET _ZZ_;
      X&V+100*(&FREQ/&TOTFREQ);
      Y&V+100*(&V/&TOTVAR);
      E&V=LAG(X&V);
      F&V=LAG(Y&V);
      IF _N_=1 THEN DO;
        E&V=0;
        F&V=0;
      END;
      _GINI_   + &FREQ/&TOTFREQ*(Y&V+F&V)/2;
      _ISARD_  + &FREQ/&TOTFREQ*ABS(Z&V-1);
      _QUADR_  + (&FREQ/&TOTFREQ*(Z&V-1))**2;
      _CV_     + &FREQ/&TOTFREQ*(Z&V-1)**2;
      _DISP_   + ABS(Z&V-1);
      _EALOG_  + &FREQ/&TOTFREQ*ABS(L&V);
      _EQLOG_  + &FREQ/&TOTFREQ*(L&V)**2;
      _HELL_   + &FREQ/&TOTFREQ*(SQRT(Z&V)-1)**2;
      _LOGLIN_ + &FREQ/&TOTFREQ*(Z&V-1)*L&V;
      _THEIL_  + &FREQ/&TOTFREQ*Z&V*L&V;
      _ECLOG_  + -&FREQ/&TOTFREQ*L&V;
      _ECQNP_  + (Z&V-1)**2;
      _ECTYNP_ + (Z&V-&MASP)**2;
      _VARLOG_ + &FREQ/&TOTFREQ*(L&V-LOG(&MGSP))**2;
      _VARRAD_ + &FREQ/&TOTFREQ*(SQRT(Z&V)-SQRT(&MRSP))**2;
 
DATA _CALC_;SET _ZZ_(FIRSTOBS=&NOBS);LENGTH _NOM_ $ 8;
     _GINI_=(50-_GINI_)/50;
     _QUADR_=SQRT(_QUADR_);
     _CV_=SQRT(_CV_);
     _DISP_=_DISP_/&NOBS;
     _EQLOG_=SQRT(_EQLOG_);
     _ECQNP_=SQRT(_ECQNP_/&NOBS);
     _ECTYNP_=SQRT(_ECTYNP_/&NOBS);
     _CHAMP_=1-&MGSP;
     _NOM_="&VVV";
KEEP _NOM_ _GINI_ _ISARD_ _QUADR_ _CV_ _DISP_ _EALOG_ _EQLOG_
     _HELL_ _LOGLIN_ _THEIL_ _ECLOG_ _ECQNP_ _ECTYNP_
     _VARLOG_ _VARRAD_ _CHAMP_;
 
      LABEL _GINI_='INDICE DE GINI'
            _ISARD_='INDICE D''ISARD'
            _QUADR_='INDICE QUADRATIQUE'
            _DISP_='INDICATEUR DE DISPARIT‚S'
            _CV_='COEFFT DE VARIATION'
            _EALOG_='ECART ABSOLU DES LOGARITHMES'
            _EQLOG_='ECART QUADRATIQUE DES LOGARITHMES'
            _HELL_='INDICE DE HELLINGER'
            _LOGLIN_='INDICE LOGLINEAIRE'
            _THEIL_='INDICE DE THEIL'
            _ECLOG_='ECART LOGARITHMIQUE'
            _ECQNP_='ECART QUADRATIQUE NON PONDERE'
            _ECTYNP_='ECART TYPE NON PONDERE'
            _VARLOG_='VARIANCE LOGARITHMIQUE'
            _VARRAD_='VARIANCE RADICALE'
            _CHAMP_='INDICE DE CHAMPERNOWNE'
                 ;
 
DATA _OUT_;
IF _N_=1 THEN DO;
  X&V=0;Y&V=0;OUTPUT;
END;
SET _ZZ_(KEEP=X&V Y&V);
 OUTPUT;RUN;
%MEND CALCUL;
 
%MACRO LORENZ(DATA=_LAST_,VAR=,FREQ=,OUT=_COEF_,OUTP=_LORENZ_,
              PRINT=1,TITRE=TEST,LEG=,XLABEL=,YLABEL=,
              POST=c:\temp\tmp.ps,
              GRAPH=0,GOUT=PC.LORENZ,NOM=LORENZ);
 
 
PROC DATASETS NOLIST;DELETE  &OUT;
PROC CONTENTS DATA=&DATA(KEEP=&VAR) NOPRINT
     OUT=_CTS_;
DATA _NULL_;
 SET _CTS_(WHERE=(NAME NE "&FREQ" AND TYPE=1)) END=FIN;
 CALL SYMPUT ('V'!!LEFT(_N_),NAME);
 CALL SYMPUT ('L'!!LEFT(_N_),LABEL);
 IF FIN THEN CALL SYMPUT ('NBVAR',_N_);
 RUN;
%PUT NOMBRE DE VARIABLES : &NBVAR;
%PUT VARIABLES :;
%DO I=1 %TO &NBVAR;
 %PUT &&V&I;
%END;
DATA _VV_;
  SET &DATA(KEEP=&VAR &FREQ
            WHERE=(
  %DO I=1 %TO &NBVAR;
    &&V&I >=0 AND
  %END;
            1)
);
RENAME
  %DO I=1 %TO &NBVAR;
    &&V&I = _V&I._
  %END;
;
  %IF &FREQ = %THEN %DO;
    %LET FREQ = _UN_;
    _UN_=1;
  %END;
  %ELSE IF &FREQ > 0;
;
%DO I = 1 %TO &NBVAR;
  %CALCUL(&I);
  PROC APPEND BASE=&OUT DATA=_CALC_;
  %IF &I = 1 %THEN %DO;
    DATA &OUTP;SET _OUT_;
    %END;%ELSE %DO;
    DATA &OUTP;MERGE &OUTP _OUT_;
  %END;
%END;
 
%IF 0 %THEN %DO;
  PROC PRINT DATA=&OUT;ID _NOM_;
  TITLE2 "COEFFICIENTS DE CONCENTRATION";
%END;
 
PROC TRANSPOSE DATA=&OUT OUT=&OUT(RENAME=(_NAME_=INDIC));
  ID _NOM_;
 
%IF &PRINT = 1 %THEN %DO;
  PROC PRINT DATA=&OUT;
  TITLE2 "COEFFICIENTS DE CONCENTRATION";
%END;
RUN;
%MEND;
 
DATA W1;
 DO X1=1 TO 100;
 X2=X1**2;
 X3=LOG(X1);
 OUTPUT;
 END;
RUN;
%LORENZ(DATA=W1,VAR=_NUMERIC_)
adbary est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/01/2011, 09h48   #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
tu trouveras des explications sur les variables entrée sur son site

http://jacquot.ensae.net/Lorenz.html

Je n'ai pas regardé tout le code mais il semble que la ligne que tu évoque soit une somme implicite

_GINI_ + &FREQ/&TOTFREQ*(Y&V+F&V)/2; peut se lire comme

_GINI_ = _GINI_ + &FREQ/&TOTFREQ*(Y&V+F&V)/2; si je saisis bien l'idée du codage
Manoutz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/01/2011, 16h02   #6
Invité régulier
 
Inscription : août 2008
Messages : 16
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 16
Points : 7
Points : 7
Merci pour l'explication de la ligne de commande et du lien. Cependant les informations présentent dans son site ne sont pas suffisantes pour connaître comment doit être la table en entrée. Par exemple pour calculer l'indice de Gini du revenu, je ne sais pas si je dois fournir un tableau avec une colonne pour le revenu moyen et une autre colonne avec le nombre de personne ayant ce revenu moyen ou s'il faut plus de détail. Aussi je ne sais pas combien de classes il me faut crée. En résumé si je veux calculer l'indice de Gini du revenu avec cette macro, comment je dois disposer ma table, quelle sont les variables nécessaire?
Merci!
adbary est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/01/2011, 16h39   #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
effectivement ca aurait été pas mal qu'il commente un peu plus sa macro (rmq également valable à titre personnel).

Bon je pense avoir compris le principe de calcul grace à http://www.danielmartin.eu/Cours/Gini.htm

Je crois comprendre qu'il calcule indépendemment une courbe de lorentz et indice de gini pour chacune des variable présentes dans le paramètre var=, donc je mettrai le revenu la. Chaque ligne du jeu de données est un individu, et sa variable revenu indique son revenu. c'est comme ca que je vois les choses.

Je ne me suis pas plongé assidument dans le code, tu peux également essayer de contacter l'auteur (et nous donner la solution). Par contre je ne vois pas comment il fait pour tracer la courbe de lorentz.

Bon courage,

Manoutz
Manoutz est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 01h35.


 
 
 
 
Partenaires

Hébergement Web