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 11/04/2007, 16h45   #1
Invité de passage
 
Inscription : avril 2007
Messages : 4
Détails du profil
Informations forums :
Inscription : avril 2007
Messages : 4
Points : 1
Points : 1
Par défaut Régression logistique sur une variable de consommation

Bonjour, desolé de commencer ma visite sur votre forum par une question mais j'ai desesperement besoin d'aide. Ca fait 2 jour que je me bat avec une macro du logiciel SAS(logiciel statistique) et sans succes!

Le programme a pour but de réaliser une regression logistique sur une variable de consommation (ex : produits d'entretien, nourriture, ...) pour determiner une typologie des clients consommant le plus ses produits (clients caractérisés par des variables telles la CSP, le revenu, le nombre de pieces de leur habitation...).

Suivant la proportion de consommateurs dans la base (ex : pour une variable de consommation X il peut y avoir que 21% de consommateurs, les autres n'ayant jamais recours a ce service ou n'ont pas encore consommé de ce produit) on fait une regression logistique avec un seuil différent (3 seuils en tout) -> plus de 25% de consommateurs = cas1, entre 10 et 25% = cas2, moins de 10% = cas3.

le bug vient principalement je pense des conditions (IF THEN...), donc je pense que vous pourrez peut etre m'aider car au lieu de me faire une regression et de laisser tomber les autres, il me les executent toutes les 3, ou il commence par le cas2 alors qu'il aurait fallu qu'il fasse le cas1....bref m'enerv!

Je vous met le programme ainsi que la fenetre de LOG :

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
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
 
/*"conso" est la macro-variable à caractériser, on la remplace par le nom de la variable souhaitée dans l'appel de la macro, à la fin du programme */
 
%macro main (conso) ;
 
proc freq DATA=hc.budget_fam_men;
TABLE &conso / out = hc.distribution;
run;
 
DATA hc.Pourcentage0;
SET hc.distribution;
IF &conso=0; keep percent;
run;
 
DATA _NULL_; /* creation d'une table virtuelle */
SET hc.Pourcentage0; 
call symput ('percent', percent);  /* call symput ('nom de la variable globale a créer', nom de la var dans le fichier source) */
run;
 
%IF &percent > 90.0 %then %goto cas3;
 
DATA _NULL_; /* creation d'une table virtuelle */
SET hc.Pourcentage0; 
call symput ('percent', percent);  /* call symput ('nom de la variable globale a créer', nom de la var dans le fichier source) */
run;
 
%IF 75.0 <= &percent <= 90.0 %then %goto cas2;
 
DATA _NULL_; /* creation d'une table virtuelle */
SET hc.Pourcentage0; 
call symput ('percent', percent);  /* call symput ('nom de la variable globale a créer', nom de la var dans le fichier source) */
run;
 
%IF &percent < 75.0 %then %goto cas1;
 
%cas1 :
/*****************************************************************************************************************************/
/* debut de la macro pour le cas ou les consommateurs representent plus de 25% du total de la base. */
	proc means DATA=hc.budget_fam_men Q3;
	var &conso; 
	output out = hc.ProcMeansResults Q3=Q3;
	run;
	DATA hc.Q3;
	SET hc.ProcMeansResults;
	keep Q3;
	run;
 
/* création d'une variable globale prenant la valeur du q3 dans la table hc.q3 */
	DATA _NULL_; /* creation d'une table virtuelle */
	SET hc.q3; 
	call symput ('quart3', q3);  /* call symput ('nom de la variable globale a créer', nom de la var dans le fichier source) */
	run;
 
	DATA hc.budget_fam_men;
	SET hc.budget_fam_men;
	ATTRIB VarBin label="Variable Binarisée";
	IF &conso < &quart3 then do; VarBin = 0;
	end;
	else do; VarBin = 1;
	end;
	run;
 
 
	ods rtf body="C:\Docs Alex\sortiesMacro"; /* balise de sortie des resultats au format word */
	proc logistic DATA=hc.budget_fam_men DESCENDING;
	class TAGEPR SEXEPR GCS2PR SITLOG STALOG TYPMEN1 CC NBPHAB;
	model VarBin =  REVACT2 TAGEPR SEXEPR GCS2PR SITLOG STALOG TYPMEN1 CC NBPHAB / pprob=0.25 selection=backward;
	run;
	quit;
	ods rtf close; /* fin de balise de sortie des résultats au format word */
 
%goto fin;
 
%cas2 : 	
/*****************************************************************************************************************************/
/* progr pour le cas ou il y a entre 10% et 25% de consommateurs */
/* attribue varbin=0 si la consommation est de 0, et 1 sinon. Ainsi on binarise la variable en attribuant "1" aux consommateurs et "0" aux non consommateurs */
 
		DATA _NULL_; /* creation d'une table virtuelle */
		SET hc.pourcentage0; 
		call symput ('pprob', (100-percent));  /* call symput ('nom de la variable globale a créer', nom de la var dans le fichier source) */
		run;
 
		DATA hc.budget_fam_men; 
		SET hc.budget_fam_men;
		ATTRIB VarBin label="Variable Binarisée";
		IF &conso = 0 then do; VarBin = "0";end;
		else do; VarBin = "1";end;
		run;
 
		ods rtf body="C:\Docs Alex\sortiesMacro"; /* balise de sortie des resultats au format word */
		proc logistic DATA=hc.budget_fam_men DESCENDING;
		class TAGEPR SEXEPR GCS2PR SITLOG STALOG TYPMEN1 CC NBPHAB;
		model VarBin =  REVACT2 TAGEPR SEXEPR GCS2PR SITLOG STALOG TYPMEN1 CC NBPHAB / pprob= &pprob selection=backward;
		run;
		quit;
		ods rtf close; /* fin de balise de sortie des résultats au format word */
 
%goto fin;
 
%cas3 :
/****************************************************************************************************************************/
/* programme pour le cas ou les consommateurs representent moins de 10% du total de la base */
 
			DATA hc.tablebinaire2;
			SET hc.pourcentage0;
			attrib Consos label="total des consommateurs" format=12.2;
			Consos = 10305 * (100-percent) / 100;
			run;
 
			DATA hc.tablebinaire3;
			SET hc.tablebinaire2;
			attrib newtotal label="total individus virtuels avec la pondération" format=12.2;
			attrib ConsosPond label="Total des consommateurs avec la pondération" format=12.2;
			attrib coeff label="pondération" format=12.5;
			newtotal = 10305 / (100-percent)* 10;
			ConsosPond = newtotal / 10;
			coeff = ConsosPond / Consos;
			run;
 
			DATA hc.budget_fam_men; 
			SET hc.budget_fam_men;
			ATTRIB VarBin label="Variable Binarisée";
			IF &conso = 0 then do; VarBin = "0";end;
			else do; VarBin = "1";end;
			run;
 
			ods rtf body="C:\Docs Alex\sortiesMacro"; /* balise de sortie des resultats au format word */
			proc logistic DATA=hc.budget_fam_men DESCENDING;
			class TAGEPR SEXEPR GCS2PR SITLOG STALOG TYPMEN1 CC NBPHAB;
			model VarBin =  REVACT2 TAGEPR SEXEPR GCS2PR SITLOG STALOG TYPMEN1 CC NBPHAB / pprob=.10 selection=backward;
			run;
			quit;
			ods rtf close; /* fin de balise de sortie des résultats au format word */
 
%fin :
%mend main;
%main(c03);[/COLOR]
 
 
 
[COLOR="Blue"]
6891
6892
6893  /*"conso" est la macro-variable à caractériser, on la remplace par le nom de la variable
6893! souhaitée dans l'appel de la macro, à la fin du programme */
6894
6895  %macro main (conso) ;
6896
6897  proc freq DATA=hc.budget_fam_men;
6898  TABLE &conso / out = hc.distribution;
6899  run;
6900
6901  DATA hc.Pourcentage0;
6902  SET hc.distribution;
6903  IF &conso=0; keep percent;
6904  run;
6905
6906  DATA _NULL_; /* creation d'une table virtuelle */
6907  SET hc.Pourcentage0;
6908  call symput ('percent', percent);  /* call symput ('nom de la variable globale a créer', nom de
6908! la var dans le fichier source) */
6909  run;
6910
6911  %IF &percent > 90.0 %then %goto cas3;
6912
6913  DATA _NULL_; /* creation d'une table virtuelle */
6914  SET hc.Pourcentage0;
6915  call symput ('percent', percent);  /* call symput ('nom de la variable globale a créer', nom de
6915! la var dans le fichier source) */
6916  run;
6917
6918  %IF 75.0 <= &percent <= 90.0 %then %goto cas2;
6919
6920  DATA _NULL_; /* creation d'une table virtuelle */
6921  SET hc.Pourcentage0;
6922  call symput ('percent', percent);  /* call symput ('nom de la variable globale a créer', nom de
6922! la var dans le fichier source) */
6923  run;
6924
6925  %IF &percent < 75.0 %then %goto cas1;
6926
6927  %cas1 :
6928  /***********************************************************************************************
6928! ******************************/
6929  /* debut de la macro pour le cas ou les consommateurs representent plus de 25% du total de la
6929! base. */
6930      proc means DATA=hc.budget_fam_men Q3;
6931      var &conso;
6932      output out = hc.ProcMeansResults Q3=Q3;
6933      run;
6934      DATA hc.Q3;
6935      SET hc.ProcMeansResults;
6936      keep Q3;
6937      run;
6938
6939  /* création d'une variable globale prenant la valeur du q3 dans la table hc.q3 */
 
6940      DATA _NULL_; /* creation d'une table virtuelle */
6941      SET hc.q3;
6942      call symput ('quart3', q3);  /* call symput ('nom de la variable globale a créer', nom de la
6942!  var dans le fichier source) */
6943      run;
6944
6945      DATA hc.budget_fam_men;
6946      SET hc.budget_fam_men;
6947      ATTRIB VarBin label="Variable Binarisée";
6948      IF &conso < &quart3 then do; VarBin = 0;
6949      end;
6950      else do; VarBin = 1;
6951      end;
6952      run;
6953
6954
6955      ods rtf body="C:\Docs Alex\sortiesMacro"; /* balise de sortie des resultats au format word
6955! */
6956      proc logistic DATA=hc.budget_fam_men DESCENDING;
6957      class TAGEPR SEXEPR GCS2PR SITLOG STALOG TYPMEN1 CC NBPHAB;
6958      model VarBin =  REVACT2 TAGEPR SEXEPR GCS2PR SITLOG STALOG TYPMEN1 CC NBPHAB / pprob=0.25
6958! selection=backward;
6959      run;
6960      quit;
6961      ods rtf close; /* fin de balise de sortie des résultats au format word */
 
6962
6963  %goto fin;
6964
6965  %cas2 :
6966  /***********************************************************************************************
6966! ******************************/
6967  /* progr pour le cas ou il y a entre 10% et 25% de consommateurs */
6968  /* attribue varbin=0 si la consommation est de 0, et 1 sinon. Ainsi on binarise la variable en
6968! attribuant "1" aux consommateurs et "0" aux non consommateurs */
6969
6970          DATA _NULL_; /* creation d'une table virtuelle */
6971          SET hc.pourcentage0;
6972          call symput ('pprob', (100-percent));  /* call symput ('nom de la variable globale a
6972! créer', nom de la var dans le fichier source) */
6973          run;
6974
6975          DATA hc.budget_fam_men;
6976          SET hc.budget_fam_men;
6977          ATTRIB VarBin label="Variable Binarisée";
6978          IF &conso = 0 then do; VarBin = "0";end;
6979          else do; VarBin = "1";end;
6980          run;
6981
6982          ods rtf body="C:\Docs Alex\sortiesMacro"; /* balise de sortie des resultats au format
6982! word */
6983          proc logistic DATA=hc.budget_fam_men DESCENDING;
6984          class TAGEPR SEXEPR GCS2PR SITLOG STALOG TYPMEN1 CC NBPHAB;
6985          model VarBin =  REVACT2 TAGEPR SEXEPR GCS2PR SITLOG STALOG TYPMEN1 CC NBPHAB / pprob=
6985! &pprob selection=backward;
6986          run;
6987          quit;
6988          ods rtf close; /* fin de balise de sortie des résultats au format word */
 
6989
6990  %goto fin;
6991
6992  %cas3 :
6993  /***********************************************************************************************
6993! *****************************/
6994  /* programme pour le cas ou les consommateurs representent moins de 10% du total de la base */
 
6995
6996              DATA hc.tablebinaire2;
6997              SET hc.pourcentage0;
6998              attrib Consos label="total des consommateurs" format=12.2;
6999              Consos = 10305 * (100-percent) / 100;
7000              run;
7001
7002              DATA hc.tablebinaire3;
7003              SET hc.tablebinaire2;
7004              attrib newtotal label="total individus virtuels avec la pondération" format=12.2;
 
7005              attrib ConsosPond label="Total des consommateurs avec la pondération" format=12.2;
 
7006              attrib coeff label="pondération" format=12.5;
7007              newtotal = 10305 / (100-percent)* 10;
7008              ConsosPond = newtotal / 10;
7009              coeff = ConsosPond / Consos;
7010              run;
7011
7012              DATA hc.budget_fam_men;
7013              SET hc.budget_fam_men;
7014              ATTRIB VarBin label="Variable Binarisée";
7015              IF &conso = 0 then do; VarBin = "0";end;
7016              else do; VarBin = "1";end;
7017              run;
7018
7019              ods rtf body="C:\Docs Alex\sortiesMacro"; /* balise de sortie des resultats au
7019! format word */
7020              proc logistic DATA=hc.budget_fam_men DESCENDING;
7021              class TAGEPR SEXEPR GCS2PR SITLOG STALOG TYPMEN1 CC NBPHAB;
7022              model VarBin =  REVACT2 TAGEPR SEXEPR GCS2PR SITLOG STALOG TYPMEN1 CC NBPHAB /
7022! pprob=.10 selection=backward;
7023              run;
7024              quit;
7025              ods rtf close; /* fin de balise de sortie des résultats au format word */
 
7026
7027  %fin :
7028  %mend main;
7029  %main(c03);
MPRINT(MAIN):   proc freq DATA=hc.budget_fam_men;
MPRINT(MAIN):   TABLE c03 / out = hc.distribution;
MPRINT(MAIN):   run;
 
NOTE:  10305 observations copiées de la TABLE HC.BUDGET_FAM_MEN.
NOTE: La TABLE HC.DISTRIBUTION a 3589 observations et 3 VARIABLES.
NOTE: La procédure FREQ a utilisé :
      temps réel 0.18 secondes
      temps processeur 0.18 secondes
 
 
MPRINT(MAIN):   DATA hc.Pourcentage0;
MPRINT(MAIN):   SET hc.distribution;
MPRINT(MAIN):   IF c03=0;
MPRINT(MAIN):   keep percent;
MPRINT(MAIN):   run;
 
NOTE:  3589 observations copiées de la TABLE HC.DISTRIBUTION.
NOTE: La TABLE HC.POURCENTAGE0 a 1 observations et 1 VARIABLES.
NOTE: L'étape DATA a utilisé :
      temps réel 0.01 secondes
      temps processeur 0.00 secondes
 
 
MPRINT(MAIN):   data _NULL_;
MPRINT(MAIN):   set hc.Pourcentage0;
MPRINT(MAIN):   call symput ('percent', percent);
MPRINT(MAIN):   run;
 
NOTE: Valeurs numériques converties en alphanumériques valeurs aux endroits donnés par :
      (Ligne):(Colonne).
      1:215
NOTE:  1 observations copiées de la table HC.POURCENTAGE0.
NOTE: L'étape DATA a utilisé :
      temps réel 0.01 secondes
      temps processeur 0.01 secondes
 
 
MPRINT(MAIN):   DATA _NULL_;
MPRINT(MAIN):   SET hc.Pourcentage0;
MPRINT(MAIN):   call symput ('percent', percent);
MPRINT(MAIN):   run;
 
NOTE: Valeurs numériques converties en alphanumériques valeurs aux endroits donnés par :
      (Ligne):(Colonne).
      3:63
NOTE:  1 observations copiées de la TABLE HC.POURCENTAGE0.
NOTE: L'étape DATA a utilisé :
      temps réel 0.01 secondes
      temps processeur 0.01 secondes
 
 
MPRINT(MAIN):   data _NULL_;
MPRINT(MAIN):   set hc.pourcentage0;
MPRINT(MAIN):   call symput ('pprob', (100-percent));
MPRINT(MAIN):   run;
 
NOTE: Valeurs numériques converties en alphanumériques valeurs aux endroits donnés par :
      (Ligne):(Colonne).
      5:91
NOTE:  1 observations copiées de la table HC.POURCENTAGE0.
NOTE: L'étape DATA a utilisé :
      temps réel 0.00 secondes
      temps processeur 0.00 secondes
 
 
MPRINT(MAIN):   DATA hc.budget_fam_men;
MPRINT(MAIN):   SET hc.budget_fam_men;
MPRINT(MAIN):   ATTRIB VarBin label="Variable Binarisée";
MPRINT(MAIN):   IF c03 = 0 then do;
MPRINT(MAIN):   VarBin = "0";
MPRINT(MAIN):  end;
MPRINT(MAIN):   else do;
MPRINT(MAIN):   VarBin = "1";
MPRINT(MAIN):  end;
MPRINT(MAIN):   run;
 
NOTE: Valeurs alphanumériques converties en numériques valeurs aux endroits donnés par :
      (Ligne):(Colonne).
      6:20   6:55
NOTE:  10305 observations copiées de la TABLE HC.BUDGET_FAM_MEN.
NOTE: La TABLE HC.BUDGET_FAM_MEN a 10305 observations et 495 VARIABLES.
NOTE: L'étape DATA a utilisé :
      temps réel 4.96 secondes
      temps processeur 0.39 secondes
 
 
MPRINT(MAIN):   ods rtf body="C:\Docs Alex\sortiesMacro";
NOTE: Écriture du fichier Corps RTF : C:\Docs Alex\sortiesMacro
MPRINT(MAIN):   proc logistic data=hc.budget_fam_men DESCENDING;
MPRINT(MAIN):   class TAGEPR SEXEPR GCS2PR SITLOG STALOG TYPMEN1 CC NBPHAB;
MPRINT(MAIN):   model VarBin = REVACT2 TAGEPR SEXEPR GCS2PR SITLOG STALOG TYPMEN1 CC NBPHAB / pprob=
84.900533721 selection=backward;
MPRINT(MAIN):   run;
 
NOTE: PPROB= ignored.
NOTE: PROC LOGISTIC is modeling the probability that VarBin=1.
NOTE: Convergence criterion (GCONV=1E-8) satisfied in Step 0.
NOTE: Convergence criterion (GCONV=1E-8) satisfied in Step 1.
NOTE:  10305 observations copiées de la table HC.BUDGET_FAM_MEN.
NOTE: La procédure LOGISTIC a utilisé :
      temps réel 1.17 secondes
      temps processeur 1.13 secondes
 
 
MPRINT(MAIN):   quit;
MPRINT(MAIN):   ods rtf close;

ca fait beaucoup de lecture, si ca vous prend la tete tant pis mais je tente ma chance quand meme...

merci
tfhoschkj est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/04/2007, 16h47   #2
Invité régulier
 
Inscription : octobre 2004
Messages : 19
Détails du profil
Informations personnelles :
Âge : 35
Localisation : Suisse

Informations forums :
Inscription : octobre 2004
Messages : 19
Points : 5
Points : 5
Par défaut Pourquoi 3 data _null_ ?

Bonjour,

Pourquoi avoir écrit 3 fois la partie data _null_ avec les mêmes valeurs ?
Essayez en n'écrivant qu'une fois data _null_ puis :
Code :
1
2
3
4
 
%IF &percent > 90.0 %then %goto cas3;
%else %IF 75.0 <= &percent <= 90.0 %then %goto cas2;
%else %goto cas1;
Si cela ne fonctionne toujours pas, faites-le moi savoir et je chercherai plus loin.

Cordialement,

Chris
tirixil 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 13h15.


 
 
 
 
Partenaires

Hébergement Web