Voici une macro construite par Simon Olivier pour calculer les résidus ajustés d’un tableau de fréquence.
Les résidus ajustés se veulent un outils pour déterminer les liens d’associations dans un tableau de fréquence. Sous l’hypothèse d’indépendance entre les variables du tableau de fréquence IxJ, les résidus suivent une loi normale de moyenne zéro et de variance 1. Des résidus positifs élevés dans un cellule démontrent que les catégories ont tendance à avoir lieu ensemble alors que des résidus négatifs élevés montrent une tendance à ce que les catégories n’aient pas lieu simulaténament.
Les catégories doivent être représentés par des numéros.
Fichier = fichier de données
mingrp1 = plus petite catégorie de la première variable
maxgrp1 = plus grande catégorie de la première variable
var1 = nom de la première variable
%macro residus_ajustes(fichier=, mingrp1=, maxgrp1=, mingrp2=, maxgrp2=, var1=, var2=);
ods output CrossTabFreqs=res_aju;
proc freq data=&fichier;
tables &var1*&var2;
run;
data max;
set res_aju;
id_group=compress(&var1||&var2);
id_num=input(id_group,3.);
run;
/*GROUP I */
proc means data=res_aju noprint;
where _TYPE_=’10′;
by &var1;
var frequency;
output out=max_i(drop=_TYPE_) max=max_i;
run;
/*GROUP J */
proc means data=res_aju noprint;
where _TYPE_=’01′;
by &var2;
var frequency;
output out=max_j(drop=_TYPE_) max=max_j;
run;
/*TOTAL*/
proc means data=res_aju noprint;
var frequency;
output out=maximum max=maximum;
run;
data _null_;
set maximum;
call symput(‘total’,maximum);
run;
%put &total;
data residus_adjus;
set res_aju;
Groupe1=&var1;
Groupe2=&var2;
if &var1=. then delete;
if &var2=. then delete;
id_group=compress(&var1||&var2);
id_num=input(id_group,3.);
run;
data merg_i;
merge max_i residus_adjus;
by &var1;
keep id_num max_i;
run;
proc sort data=residus_adjus;
by &var2;
run;
data merg_j;
merge max_j residus_adjus;
by &var2;
keep id_num max_j;
run;
proc sort data=merg_j;
by id_num;
run;
proc sort data=residus_adjus;
by id_num;
run;
data residus_adjus2;
merge merg_i merg_j residus_adjus;
by id_num;
pi=max_i/&total;
pj=max_j/&total;
do group=&mingrp1 to &maxgrp1;
do group2=&mingrp2 to &maxgrp2;
espere=max_i*max_j/&total;
RA=(frequency-espere)/sqrt(espere*(1-pi)*(1-pj));
end;
end;
run;
proc print data=residus_adjus2;
where &var1 ne . and ra ne . or groupe2 ne . and ra ne .;
var groupe1 groupe2 ra;
run;
%mend;