%macro dtprow(data,qvar,weight=,outprox=outprox); /*macro donnant la matrice des distances entre variables */ /* qualitatives fonction des coefficients de TSCHUPROW */ /* */ /* data : table SAS */ /* qvar : liste des variables a considerer */ /* weight : vecteur contenant le poids des individus */ /* outprox : table contenant la matrice des coeff. de Tschuprow */ %let p=1; %let qvar1=%scan(&qvar,&p,%str( )); %do %while(&&qvar&p ne); %let p=%eval(&p+1); %let qvar&p=%scan(&qvar,&p,%str( )); %end; %let p=%eval(&p-1); data _null_; set &data end=fin; retain n 0; %if %length(&weight) ne 0 %then n=n+&weight;; if fin then do; %do i=1 % to &p; call symput("n_&&qvar&i",n_&&qvar&i); %end; %if %length(&weight) ne 0 %then %do; call symput('n',n); %end; %else %do; call symput('n',_n_); %end; end; run; %let k=0; %do _i=1 %to %eval(&p-1); %do _j=%eval(&_i+1) %to &p; %let k=%eval(&k+1); proc freq data=&data noprint; table &&qvar&_i*&&qvar&_j / out=toto chisq; output out=titi pchi phi; /*##########1*/ %if %length(&weight) ne 0 %then weight &weight;; run; data tata; set toto; if first.&&qvar&_i; by &&qvar&_i; run; data _null_; set tata end=fin; if fin then call symput("n&_i",_n_); run; proc sort data=toto; by &&qvar&_j; run; data tata; set toto; if first.&&qvar&_j; by &&qvar&_j; run; data _null_; set tata end=fin; if fin then call symput("n&_j",_n_); run; data _null_; set titi; call symput('prox'||"&k",sqrt(2*(1-_phi_*_phi_/sqrt(df_pchi)))); /*##########2*/ run; %end; %end; data &outprox(type=distance keep=varname &qvar varnum); length varname $8 &qvar varnum 8; array tvar(&p) &qvar; %do _i=1 %to &p; varnum=&_i; varname=upcase("&&qvar&_i"); tvar(&_i)=0; %do _j=%eval(&_i+1) %to &p; %let _k=%eval((&_i-1)*&p-((&_i*(&_i-1))/2)+&_j-&_i); tvar(&_j)=&&prox&_k; %end; %do _j=1 %to %eval(&_i-1); %let _k=%eval((&_j-1)*&p-((&_j*(&_j-1))/2)+&_i-&_j); tvar(&_j)=&&prox&_k; %end; output; %end; run; %mend;