%macro aidacp(donnee,id,var,nfac,FACIND=facind,FACVAR=facvar,NOPRINT=NO); /* Macro écrite par Hélène Mathian (équipe PARIS) et Patrick Brossier (GIP RECLUS) donnee tableau des données à traiter id liste des identificateurs des observations var liste des variables à traiter nfac nombre de facteurs à retenir facind tableau contenant les données originales et les scores (-> graphi) facvar tableau contenant les statistiques de l'analyse (-> graphj) noprint permet de supprimer l'impression des résultats Cette macro réalise une ACP et fournit l'aide à son interprétation Macros utilisées: %obsnvars (attention variables globales nvars nobs) Version du 26/06/01 */ %global nvars nobs; /* programme ACP et aide à l'interprétation */ proc sort data=&DONNEE(keep=&ID &VAR) out=tempo1;by &ID; run; %obsnvars(tempo1(keep=&var)); proc standard data=tempo1 OUT=tempo2 mean=0 std=1; var &var; data tempo2(keep=&ID NORME2) tempo1(keep=&id &var);set tempo2; NORME2=0; array V &var; do over v; if v=. then v=0; norme3=V**2; NORME2=sum(of NORME2 norme3); end; proc princomp data=tempo1 out=&FACIND outstat=&FACVAR n=&NFAC; var &var; data tempo3;set &FACVAR(where=(_type_='EIGENVAL') keep=_type_ &var); array v(_I_) &var; array _b(_I_) _b1-_b&nvars; do over v; _b=v; end; drop &var _I_ _type_; data tempo1;set tempo3; array _b(_I_) _b1-_b&nvars; _tot=sum(of _b1-_b&nvars); do over _b; _dd=_b*100000/_tot; output; end; keep _i_ _dd; label _i_='Facteurs'; proc chart data=tempo1; hbar _i_ /discrete percent cpercent freq=_dd; data tempo2;set tempo2; if _N_=1 then set tempo3; run; data &FACIND; merge &FACIND(keep=&ID PRIN1-PRIN&NFAC) tempo2;by &ID; length QLT INR POID PRIN1-PRIN&NFAC COR1-COR&NFAC CTR1-CTR&NFAC 5.; array cp PRIN1-PRIN&NFAC.; array v _b1-_b&NFAC.; array ctr CTR1-CTR&NFAC; array cor COR1-COR&NFAC; INR=round(NORME2*1000/&nvars/&NOBS); POID=round(1000/&NOBS); QLT=0; do over cp; COR=round(CP**2*1000/NORME2); QLT=QLT+COR; CTR=round(CP**2*1000/&NOBS/V); CP=round(CP*1000); end; drop norme2 _b1-_b&nvars; %IF &NOPRINT^=YES %THEN %do; proc print data=&FACIND; id &id; var qlt poid inr %do i=1 %to &NFAC; PRIN&i COR&i CTR&i %end; ; run; %end; data &FACVAR;set &FACVAR; keep _name_ &VAR; if _type_='SCORE'; proc transpose data=&FACVAR out=&FACVAR; data &FACVAR; set &FACVAR(rename=(_name_=VAR)); length VAR $8. QLT INR POID PRIN1-PRIN&NFAC COR1-COR&NFAC CTR1-CTR&NFAC 5.; if _N_=1 then set tempo3; array cp PRIN1-PRIN&NFAC; array v _b1-_b&NFAC.; array ctr CTR1-CTR&NFAC; array cor COR1-COR&NFAC; INR=round(1000/&nvars); POID=round(1000/&nobs); QLT=0; do over cp; CP=CP*sqrt(V); COR=round(CP**2*1000); QLT=QLT+COR; CTR=round(CP**2*1000/V); CP=round(CP*1000); end; drop _b1-_b&nvars; proc print data=&FACVAR; id var; var qlt poid inr %do i=1 %to &NFAC; PRIN&i COR&i CTR&i %end; ; run; PROC DATASETS DD=WORK NOLIST NOWARN FORCE NOFS; DELETE TEMPO1 TEMPO2 TEMPO3; run; quit; %mend AIDACP; /* fin du corps du programme*/ %macro graphi(ID,ax1,ax2,FACIND=facind,fonte=HWPSL009,size=1.5); /* Macro écrite par Hélène Mathian (équipe PARIS) et Patrick Brossier (GIP RECLUS) id liste des identificateurs des observations ax1 numéro du facteur pour l'axe des x ax2 numero du facteur pour l'axe des y facind tableau contenant les données originales et les scores fonte police utilisée pour les écritures du graphique size taille des caractères en % de la hauteur du graphique (vsize) Cette macro permet la représentation des axes factoriels pour les individus Macros utilisées: %listid (attention variables globales listevar nid) %axis Version du 06/07/99 */ %global nid; %listid(&facind,&id); data tempo1; set &FACIND(keep=&ID PRIN&ax1 PRIN&ax2); length function $ 8; retain xsys ysys '2' hsys '5' function 'label' position '5' size &size style %quote("&fonte"); text=&nID; /* variable contenant les noms */ x=PRIN&ax1/1000; y=PRIN&ax2/1000; keep xsys ysys hsys function text x y position size style; run; %axis(tempo1,x,y,&fonte,&size); symbol1 v=point; /* DOT ou STAR ou CIRCLE */ proc gplot data=tempo1; plot Y*X/annotate=tempo1 frame haxis=axis1 vaxis=axis2 href=0 vref=0; run; PROC DATASETS DD=WORK NOLIST NOWARN FORCE NOFS; DELETE TEMPO1; run; quit; %mend graphi; %macro graphj(ax1,ax2,FACVAR=facvar,fonte=HWPSL009,size=1.5); /* Macro écrite par Hélène Mathian (équipe PARIS) et Patrick Brossier (GIP RECLUS) ax1 numéro du facteur pour l'axe des x ax2 numero du facteur pour l'axe des y facvar tableau contenant les statistiques de l'analyse fonte police utilisée pour les écritures du graphique size taille des caractères en % de la hauteur du graphique (vsize) Cette macro permet la représentation des axes factoriels pour les variables Macros utilisées: %axis Version du 06/07/99 */ data tempo1; set &FACVAR(keep=VAR PRIN&ax1 PRIN&ax2); length function $8; retain xsys ysys '2' hsys '5' function 'label' position '5' size &size style %quote("&fonte"); x=PRIN&ax1/1000; y=PRIN&ax2/1000; rename var=text; /* variable contenant les noms */ keep xsys ysys hsys function var x y position size style; run; %axis(tempo1,x,y,&fonte,&size); symbol1 v=point; /* DOT ou STAR ou CIRCLE */ proc gplot data=tempo1; plot Y*X/annotate=tempo1 frame haxis=axis1 vaxis=axis2 href=0 vref=0; run; PROC DATASETS DD=WORK NOLIST NOWARN FORCE NOFS; DELETE TEMPO1; run; quit; %mend graphj;