[ 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=_anno,size=2);
  data &anno;
    set &tab(rename=(&x=&y=y &text=text) keep=&x &y &text);
    retain function 'label' xsys ysys '2' hsys '3' size &size position '8'
  run;
%mend;

%macro aide_acp(nvars,ids);
  proc sql noprint;
    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(drop=contr_) as
      select *,contr_*100/sum(contr_) as contr format 5.1 from aide_acp;
  quit;

  proc rank data=aide_acp out=aide_acp descending;
    var ctr1-ctr&nvars; ranks rctr1-rctr&nvars;
  run;

  proc sort data=aide_acp; by &ids;run;
  proc print;run;
%mend;


%macro acp(table,vars,ids);
  proc sql noprint;
    create table acp_in(drop=poids rename=(npoids=poids)) as
      select *, 100*poids/sum(poids) as npoids from &table;
  quit;

  proc princomp data=acp_in out=acp vardef=wgt;
    ods output Eigenvalues=eigenvalues Eigenvectors=eigenvectors;
    var &vars;
    weight poids;
  run;

  proc transpose data=eigenvalues out=teigenvalues(drop=_name_prefix=lambda;
    var eigenvalue;
  run;

  proc sql noprint;
    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 data=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(keep=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 data=circle anno=_anno;
    symbol1 i=none v=plus pointlabel=none color=black;
    symbol2 i=join v=none pointlabel=none color=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 data=acp anno=_anno;
    symbol i=none v=dot pointlabel=none;
    plot prin&axe2*prin&axe1 / href=(0) vref=(0);
  run;
  quit;
%mend;