[ Retour aux Travaux Dirigés de SAS ]
/* Macros SAS utiles pour le TD7 */
/* Jean-Sebastien Roy (js@jeannot.org), 2001 */
%macro labelg(tab,x,y,text, _anno,size=2);
data &anno;
set &tab( (&x=x &y=y &text=text) &x &y &text);
retain function 'label' xsys ysys '2' hsys '3' size &size position '8';
run;
%mend;
%macro aide_acp(nvars,ids);
proc sql ;
select count(*) into :avars from eigenvalues;
quit;
data aide_acp;
if _n_ = 1 then set teigenvalues;
set acp nobs=nind;
array c{*} prin1-prin%trim(&avars);
array co2_{&nvars};
array ctr{&nvars};
array l{*} lambda1-lambda&nvars;
sommec2=uss(of c{*});
do j = 1 to &nvars;
co2_{j}=100*c{j}*c{j}/sommec2;
ctr{j}=poids*c{j}*c{j}/l{j};
end;
qlt=sum(of co2_(*));
contr_=poids*sommec2/(sum(of l{*}));
format co2_1-co2_&nvars 5.1 ctr1-ctr&nvars 5.1 poids 5.1 qlt 5.1 prin1-prin&nvars 7.2;
keep &ids poids prin1-prin&nvars ctr1-ctr&nvars co2_1-co2_&nvars qlt contr_;
run;
proc sql;
create table aide_acp( contr_) as
select *,contr_*100/sum(contr_) as contr format 5.1 from aide_acp;
quit;
proc rank aide_acp aide_acp ;
var ctr1-ctr&nvars; ranks rctr1-rctr&nvars;
run;
proc sort aide_acp; by &ids;run;
proc print;run;
%mend;
%macro acp(table,vars,ids);
proc sql ;
create table acp_in( poids (npoids=poids)) as
select *, 100*poids/sum(poids) as npoids from &table;
quit;
proc princomp acp_in acp vardef=wgt;
ods output Eigenvalues=eigenvalues Eigenvectors=eigenvectors;
var &vars;
weight poids;
run;
proc transpose eigenvalues teigenvalues(_name_) lambda;
var eigenvalue;
run;
proc sql ;
select count(*) into :avars from eigenvalues;
quit;
data eigenvectors;
if _n_ = 1 then set teigenvalues;
set eigenvectors;
array c{*} prin1-prin%trim(&avars);
array l{*} lambda1-lambda%trim(&avars);
do i=1 to &avars;
c(i)=c(i)*sqrt(l(i));
end;
keep variable prin1-prin%trim(&avars);
run;
proc gplot eigenvalues;
symbol i=join v=dot pointlabel=none;
plot (eigenvalue difference)*Number / overlay legend;
plot2 (proportion cumulative)*Number / overlay legend;
run;
quit;
%mend;
%macro acp_plot(axe1,axe2,id);
data circle;
do i=0 to 100;
prin&axe1=cos(2*3.141592*i/100);
prin&axe2=sin(2*3.141592*i/100);
z=2;
output;
end;
run;
data circle;
set eigenvectors circle;
if z=. then z=1;
run;
data _anno;
set eigenvectors( prin&axe1 prin&axe2 variable);
retain function 'label' xsys ysys '2' hsys '3' size 2 position '8';
x=prin&axe1;y=prin&axe2;text=variable;
run;
proc gplot circle _anno;
symbol1 i=none v=plus pointlabel=none black;
symbol2 i=join v=none pointlabel=none red;
plot prin&axe2*prin&axe1=z / href=(0) vref=(0) nolegend;
run;
quit;
data _anno;
set acp;
retain function 'label' xsys ysys '2' hsys '3' size 2 position '8';
x=prin&axe1;y=prin&axe2;text=&id;
run;
proc gplot acp _anno;
symbol i=none v=dot pointlabel=none;
plot prin&axe2*prin&axe1 / href=(0) vref=(0);
run;
quit;
%mend;