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
| %********************************************************************;
/*base : table de construction du score */
/*beta : table contenant les coefficients associés à chaque variable*/
/* option (outest=) de la proc logistic */
/*quanti: liste des variables utilisées en continue ds le score */
/*quali: liste des variables découpées ds le score */
%********************************************************************;
/*=====> les contributions sont restituées dans la table traitement*/
%macro r_contribution(base=,beta=,quanti=,quali=);
options nonotes;
proc sql noprint;/*calcul du nombre total de clients dans la base*/
select count(*) into: nbtot from &base;
quit;
%LET i=1; %* calcul du nb de variables quanti;
%DO %while(%scan(&quanti,&i,%STR( )) ne %STR( ));
%LET i=%EVAL(&i+1);
%END;
%let nquanti=%eval(&i-1);
%LET i=1; %* calcul du nb de variables quali;
%DO %while(%scan(&quali,&i,%STR( )) ne %STR( ));
%LET i=%EVAL(&i+1);
%END;
%let nquali=%eval(&i-1);
%put ---------> &nquanti variable(s) quantitative(s); %* affichage du nb de variables quanti;
%put ---------> &nquali variable(s) qualitative(s); %* affichage du nb de variables quali;
%put ---------------------------------------------------------------;
%put ---------> les variables quantitatives:;
data traitement;
run;
%do i=1 %to &nquanti;
%let var=%scan(&quanti,&i); %* ième mot de la liste des variables quanti;
proc sql noprint;
select &var into : valeur from β
select css(&var) into : carre from &base;
quit;
%put ---------> la variable &i quantitative est : &var;
%put ---------> le coefficient associé est : &valeur;
data traitement_&i;
format facteur $10.;
facteur="&var";
variance=%sysevalf(&valeur*&valeur*&carre/&nbtot);
run;
data traitement;
set traitement traitement_&i;
if facteur="" then delete;
run;
proc datasets nolist;
delete traitement_&i;
quit;
%end;
%put ---------------------------------------------------------------;
%put ---------> les variables qualitatives:;
%do k=1 %to &nquali;
%let var=%scan(&quali,&k);
data trav;
set &base;
keep &var;
run;
proc sort data=trav;
by &var;
run;
proc sql noprint;
select distinct &var into : modalite separated by " " from trav; %* insertion dans une macro-
variable des différentes modalités prises par la variable quali;
select count(distinct &var) into : nmodalite from trav; %* nb de modalités de la variable quali;
quit;
%let nmod=&nmodalite;
%put ---------> la variable &k qualitative est : &var;
%let moyenne=0;
%let variance=0;
%do j=1 %to &nmod;
%let nummod=%scan(&modalite,&j);
proc sql noprint;
select &var&nummod into : valeur&nummod from β
quit;
%if %datatyp(&nummod)=NUMERIC %then %do; /*verification du type de la modalite*/
proc sql noprint;
select count(*) into : freq&nummod from trav where &var=&nummod;
quit;
%end;
%else %if %datatyp(&nummod)=CHAR %then %do;
proc sql noprint;
select count(*) into : freq&nummod from trav where &var="&nummod";
quit;
%end;
%put ---------> le coefficient associé de la modalité &nummod de &var est : &&valeur&nummod;
%let moyenne=%sysevalf(&moyenne+&&valeur&nummod*&&freq&nummod/&nbtot);
%end;
%do j=1 %to &nmod;
%let nummod=%scan(&modalite,&j);
%let variance=%sysevalf(&variance+&&freq&nummod/&nbtot*(&&valeur&nummod-&moyenne)*(&&valeur&nummod-&moyenne));
%end;
data traitement_&k;
format facteur $10.;
facteur="&var";
variance=&variance;
run;
data traitement;
set traitement traitement_&k;
if facteur="" then delete;
run;
proc datasets nolist;
delete traitement_&k trav;
quit;
%end;
/***calcul de la contribution de chacun***/
data traitement;
set traitement;
std=sqrt(variance);
run;
proc sql noprint;
select sum(std) into:ecart_tot from traitement;
quit;
data traitement;
set traitement;
std_tot=&ecart_tot;
run;
data traitement;
set traitement;
contribution=std/std_tot;
run;
options notes;
%MEND r_contribution; |
Partager