%Macro aidelogi (data,xplique,conti,quali,nbmod,ref,where,weight,ecran=Oui,centre=Oui,option1=descending); %put %nrstr(******************************************;); %put %nrstr(* Macro SAS Aidelogi, version 1.3 *;); %put %nrstr(******************************************;); %put %nrstr(* Cette macro sert lorsque l on veut *;); %put %nrstr(* faire une régression logistique avec *;); %put %nrstr(* des variables explicatives polytomiques*;); %put %nrstr(* Elle permet de comparer à la moyenne *;); %put %nrstr(* et non plus uniquement à une situation *;); %put %nrstr(* de référence de lecture souvent *;); %put %nrstr(* problématique. *;); %put %nrstr(* Dans la première partie, elle fait *;); %put %nrstr(* une régression classique avec situation*;); %put %nrstr(* de référence. Ensuite elle centre *;); %put %nrstr(* les variables continues et introduit *;); %put %nrstr(* des contraintes pour que la somme *;); %put %nrstr(* pondérée des paramètres soit égale à *;); %put %nrstr(* zéro. *;); %put %nrstr(******************************************;); %put %nrstr(* Olivier Godechot, le 09.09.2000 *;); %put %nrstr(******************************************;); %window Aidelogi #1 @1 "Nom de votre base : data=" @ 27 data 17 attr=rev_video auto=yes #2 @1 "Nom de la variable expliquée : xplique=" @ 41 xplique 30 attr=rev_video auto=yes #3 @1 "Options Logistic : Option1=" @ 31 option1 40 attr=rev_video auto=yes #4 @1 "Liste des variables continues : conti=" #5 @1 conti 80 attr=rev_video auto=yes #6 @1 "Les centrer ? Centre=" @23 Centre 4 attr=rev_video auto=yes #8 @1 "Liste des modalités des variables qualitatives (y compris réf) : quali=" #9 @1 quali 80 attr=rev_video auto=yes #11 @1 "Nb de modalités par variables politomiques (dans ordre de qual): nbmod=" #12 @1 nbmod 80 attr=rev_video auto=yes #14 @1 "Modalités de référence : ref=" #15 @1 ref 80 attr=rev_video auto=yes #17 @1 "Clause restrictive (optionnelle) : where=" #18 @1 where 80 attr=rev_video auto=yes #20 @1 "Variable de poids (optionnelle) : weight=" @50 weight 17 attr=rev_video auto=yes #22 @1 %nrstr("Syntaxe complete : %aidelogi(data=,xplique=,conti=,quali=,") #23 @1 %nrstr("nbmod=,ref=,where=,weight=,centre=,ecran=,option1=);") #25 @15 "Appuyez sur entrée et bonne suite, Olivier Godechot, le 09/09/2000"; %if %upcase(&Ecran)=OUI %then %do; %display Aidelogi; %end; %let data1=_%substr(%scan(&xplique,1),1,5)1_; %let data2=_%substr(%scan(&xplique,1),1,5)2_; %let data3=_%substr(%scan(&xplique,1),1,5)3_; %let data4=_%substr(%scan(&xplique,1),1,5)4_; %let data5=_%substr(%scan(&xplique,1),1,5)5_; %let data6=_%substr(%scan(&xplique,1),1,5)6_; %let data7=_%substr(%scan(&xplique,1),1,5)7_; %let wher=(&where); %let qual=%upcase(&quali); %let refe=%upcase(&ref); %let num=%upcase(&conti); *I.2 Sous-programme pour traiter des suites de variables de type V1-V10 et AA--ZZ; %let tiret1=%str( -); %do %while (%index(&num,&tiret1)>0); %let long=%index(&num,&tiret1); %let num=%qsubstr(&num,1,&long-1)%str(-)%qsubstr(&num,&long+2); %end; %do %while (%index(&qual,&tiret1)>0); %let long=%index(&qual,&tiret1); %let qual=%qsubstr(&qual,1,&long-1)%str(-)%qsubstr(&qual,&long+2); %end; %let tiret2=%str(- ); %do %while (%index(&num,&tiret2)>0); %let long=%index(&num,&tiret2); %let num=%qsubstr(&num,1,&long-1)%str(-)%qsubstr(&num,&long+2); %end; %do %while (%index(&qual,&tiret2)>0); %let long=%index(&qual,&tiret2); %let qual=%qsubstr(&qual,1,&long-1)%str(-)%qsubstr(&qual,&long+2); %end; %if %index(&qual,--)>0 or %index(&num,--)>0 %then %do; proc contents data=&data noprint; run; %end; %do %while (%index(&num,--)>0); %let i=1; %do %while(%index(%scan(&num,&i,%str( )),--)=0); %let i=%eval(&i+1); %end; %let long2=%length(%scan(&num,&i,%str( ))); %let Vd=%scan(&num,&i); %let long=%index(&num,&vd); %let Vf=%scan(&num,&i+1); %local z; %local zz; %let z=%sysfunc(open(&data)); %let posd=%sysfunc(varnum(&z,&vd)); %let posf=%sysfunc(varnum(&z,&vf)); %let j=%eval(&posd+1); %let blanc=%str( ); %let ttevar=&vd&blanc; %do %while (&j<&posf); %let vj=%sysfunc(varname(&z,&j)); %let ttevar=&ttevar&vj&blanc; %let j=%eval(&j+1); %end; %let ttevar=&ttevar&vf; %let zz=%sysfunc(close(&z)); %let num=%qsubstr(&num,1,&long-1)%str(&ttevar)%qsubstr(&num,&long+&long2); %end; %do %while (%index(&num,-)>0); %let i=1; %do %while(%index(%scan(&num,&i,%str( )),-)=0); %let i=%eval(&i+1); %end; %let long2=%length(%scan(&num,&i,%str( ))); %let Vd=%scan(&num,&i); %let long=%index(&num,&vd); %let Vf=%scan(&num,&i+1); %let k=%length(&Vd); %do %while(%verify(%substr(&vd,&k),0123456789)=0); %let posd=%substr(&vd,&k); %let k=%eval(&k-1); %end; %let k=%length(&Vf); %do %while(%verify(%substr(&vf,&k),0123456789)=0); %let posf=%substr(&vf,&k); %let k=%eval(&k-1); %end; %let j=%eval(&posd+1); %let blanc=%str( ); %let ttevar=&vd&blanc; %do %while (&j<&posf); %let vj=%substr(&vd,1,&k); %let ttevar=&ttevar&vj&j&blanc; %let j=%eval(&j+1); %end; %let ttevar=&ttevar&vf; %let num=%qsubstr(&num,1,&long-1)%str(&ttevar)%qsubstr(&num,&long+&long2); %end; %do %while (%index(&qual,--)>0); %let i=1; %do %while(%index(%scan(&qual,&i,%str( )),--)=0); %let i=%eval(&i+1); %end; %let long2=%length(%scan(&qual,&i,%str( ))); %let Vd=%scan(&qual,&i); %let long=%index(&qual,&vd); %let Vf=%scan(&qual,&i+1); %local z; %local zz; %let z=%sysfunc(open(&data)); %let posd=%sysfunc(varnum(&z,&vd)); %let posf=%sysfunc(varnum(&z,&vf)); %let j=%eval(&posd+1); %let blanc=%str( ); %let ttevar=&vd&blanc; %do %while (&j<&posf); %let vj=%sysfunc(varname(&z,&j)); %let ttevar=&ttevar&vj&blanc; %let j=%eval(&j+1); %end; %let ttevar=&ttevar&vf; %let zz=%sysfunc(close(&z)); %let qual=%qsubstr(&qual,1,&long-1)%str(&ttevar)%qsubstr(&qual,&long+&long2); %end; %do %while (%index(&qual,-)>0); %let i=1; %do %while(%index(%scan(&qual,&i,%str( )),-)=0); %let i=%eval(&i+1); %end; %let long2=%length(%scan(&qual,&i,%str( ))); %let Vd=%scan(&qual,&i); %let long=%index(&qual,&vd); %let Vf=%scan(&qual,&i+1); %let k=%length(&Vd); %do %while(%verify(%substr(&vd,&k),0123456789)=0); %let posd=%substr(&vd,&k); %let k=%eval(&k-1); %end; %let k=%length(&Vf); %do %while(%verify(%substr(&vf,&k),0123456789)=0); %let posf=%substr(&vf,&k); %let k=%eval(&k-1); %end; %let j=%eval(&posd+1); %let blanc=%str( ); %let ttevar=&vd&blanc; %do %while (&j<&posf); %let vj=%substr(&vd,1,&k); %let ttevar=&ttevar&vj&j&blanc; %let j=%eval(&j+1); %end; %let ttevar=&ttevar&vf; %let qual=%qsubstr(&qual,1,&long-1)%str(&ttevar)%qsubstr(&qual,&long+&long2); %end; %let l=1; %let ref=%str( &refe ); %let modact=%scan(&qual,&l); %let blanc=%str( ); %let modact=&blanc&modact&blanc; %let refe=&blanc&refe&blanc; %let qual2=; %do %while (&modact NE); %let pos=%index(&refe, &modact ); %if &pos=0 %then %do; %let qual2=&qual2&modact; %end; %let l=%eval(&l+1); %let modact=%scan(&qual,&l); %let modact=&blanc&modact&blanc; %end; %let nbnum=0; %let j=1; %do %while(%scan(&num,&j) NE); %let nbnum=%eval(&nbnum+1); %let j=%eval(&j+1); %end; %let nbtqual=0; %let j=1; %do %while(%scan(&qual,&j) NE); %let nbtqual=%eval(&nbtqual+1); %let j=%eval(&j+1); %end; %let nbmqual=0; %let j=1; %do %while(%scan(&qual2,&j) NE); %let nbmqual=%eval(&nbmqual+1); %let j=%eval(&j+1); %end; %let nbref=0; %let j=1; %do %while(%scan(&refe,&j) NE); %let nbref=%eval(&nbref+1); %let j=%eval(&j+1); %end; %let nbtmod=0; %let j=1; %do %while(%scan(&nbmod,&j) NE); %let nbtmod=%eval(&nbtmod+%scan(&nbmod,&j)); %let j=%eval(&j+1); %end; %let nbnmod=0; %let j=1; %do %while(%scan(&nbmod,&j) NE); %let nbnmod=%eval(&nbnmod+1); %let j=%eval(&j+1); %end; %if &nbtmod NE &nbtqual %then %goto Erreur1; %if &nbnmod NE &nbref %then %goto Erreur2; %let nbmact=%eval(&nbnum+&nbmqual); %put &nbmact; %let nbmtot=%eval(&nbnum+&nbmqual+&nbref); * II. Première régression logistique avec situation de référence; data &data1; run; %put %str(data &data1; run;); proc logistic data=&data outest=&data1 covout &option1; %put %str(proc logistic data=&data outest=&data1 covout &option1;); title 'Régression logistique avec situation de référence'; %put %str(title 'Régression logistique avec situation de référence';); model &xplique=&num &qual2 /RSQ; %put %str(model &xplique=&num &qual2 /RSQ;); %if &weight NE %then %do; weight &weight; %put %str(weight &weight;); %end; %if &wher NE () %then %do; where &wher; %put %str(where &wher;); %end; %let i=1; %let refqual=%scan(&nbmod,&i); %let refqual=%eval(&refqual-1); %let l=1; %let modact=%scan(&qual2,&l); %do %while (&refqual NE); %let j=1; %let propqual=%str(&modact=0); %let j=%eval(&j+1); %let l=%eval(&l+1); %let modact=%scan(&qual2,&l); %do %while (&j<=&refqual); %let propqual=&propqual%str(,)%str(&modact=0); %let j=%eval(&j+1); %let l=%eval(&l+1); %let modact=%scan(&qual2,&l); %end; %let modact2=%scan(&qual2,&l-1); %let long=%length(&modact2); %let nomtest=%substr(&modact2,1,&long-1)_; &nomtest: test &propqual; %put %str(&nomtest: test &propqual;); %let i=%eval(&i+1); %let refqual=%scan(&nbmod,&i); %if &refqual NE %then %do; %let refqual=%eval(&refqual-1); %end; %end; %put %str(run;); run; * III. Moyenne des variables continues et qualitatives; %local z; %local zz; %let z=%sysfunc(open(&data)); %let tyxpli=%sysfunc(vartype(&z,%sysfunc(varnum(&z,&xplique)))); %let zz=%sysfunc(close(&z)); %if &tyxpli=C %then %let clause=%str(&xplique NE ""); %else %let clause=%str(&xplique NE .); data &data2; set &data; %put %str(data &data2; set &data;); if NMISS(of &num &qual)=0 and &clause; %put %str(if NMISS(of &num &qual)=0 and &clause;); %put %str(run;); run; data &data3; run; %put %str(data &data3; run;); proc means data=&data2 N MEAN NOPRINT; %put %str(proc means data=&data2 N MEAN NOPRINT;); var &num &qual; %put %str(var &num &qual;); %if &wher NE () %then %do; where &wher ; %put %str(where &wher ;); %end; %if &weight NE %then %do; weight &weight; %put %str(weight &weight;); %end; output out=&data3; %put %str(output out=&data3;); %put %str(run;); run; data &data4; run; %put %str(data &data4; run;); proc means data=&data2 N MEAN NOPRINT; %put %str(proc means data=&data2 N MEAN NOPRINT;); var &num &qual; %put %str(var &num &qual;); class &xplique; %put %str(class &xplique;); %if &wher NE () %then %do; where &wher ; %put %str(where &wher ;); %end; %if &weight NE %then %do; weight &weight; %put %str(weight &weight;); %end; output out=&data4; %put %str(output out=&data4;); %put %str(run;); run; %local z; %local zz; %let z=%sysfunc(open(&data4)); %let taille=%sysfunc(attrn(&z,nobs)); %let nbinter=%sysevalf(&taille/5-2); %let zz=%sysfunc(close(&z)); %if &nbinter=1 %then %do; %let intercep=intercep; %let zero=0; %end; %else %do; %let blanc=%str( ); %let intercep=intercp1&blanc; %let i=2; %do %while (&i<%eval(&nbinter+1)); %let intercp=intercp&i; %let intercep=&intercep&intercp&blanc; %let i=%eval(&i+1); %end; %end; %if &num NE and %upcase(¢re)=OUI %then %do; proc standard data=&data2 out=&data2 MEAN=0; %put %str(proc standard data=&data2 out=&data2 MEAN=0;); var # %put %str(var #); %if &wher NE () %then %do; where &wher; %put %str(where &wher ;); %end; %put %str(run;); run; %end; data &data2; set &data2; %put %str(data &data2; set &data2;); %let i=1; %let refqual=%scan(&nbmod,&i); %if &refqual NE %then %do; %let refqual=%eval(&refqual-1); %end; %let refmod=%scan(&refe,&i); %let l=1; %let modact=%scan(&qual2,&l); %do %while (&refqual NE); %let j=1; %do %while (&j<=&refqual); %local z; %local zz; %let z=%sysfunc(open(&data3)); %let rc=%sysfunc(fetchobs(&z,4)); %let prop=%sysfunc(getvarn(&z,%sysfunc(varnum(&z,&modact)))); %let propref=%sysfunc(getvarn(&z,%sysfunc(varnum(&z,&refmod)))); %let zz=%sysfunc(close(&z)); &modact=&modact-(&prop/&propref)*&refmod; %put %str(&modact=&modact-(&prop/&propref)*&refmod;); %let j=%eval(&j+1); %let l=%eval(&l+1); %let modact=%scan(&qual2,&l); %end; %let i=%eval(&i+1); %let refmod=%scan(&refe,&i); %let refqual=%scan(&nbmod,&i); %if &refqual NE %then %do; %let refqual=%eval(&refqual-1); %end; %end; %put %str(run;); run; data &data5; run; %put %str(data &data5; run;); proc logistic data=&data2 outest=&data5 covout Noprint &option1; %put %str(proc logistic data=&data2 outest=&data5 covout Noprint;); title 'Régression avec comparaison à la moyenne'; %put %str(title 'Régression avec comparaison à la moyenne';); title2 ' Attention il manque les param. des ex-mod. de réf.!'; %put %str(title2 ' Attention il manque les param. des ex-mod. de réf.!';); model &xplique=&num &qual2 /RSQ; %put %str(model &xplique=&num &qual2 /RSQ;); %if &weight NE %then %do; weight &weight; %put %str(weight &weight;); %end; %if &wher NE () %then %do; where &wher; %put %str(where &wher;); %end; %let i=1; %let refmod=%scan(&refe,&i); %let refqual=%scan(&nbmod,&i); %let refqual=%eval(&refqual-1); %let l=1; %let modact=%scan(&qual2,&l); %do %while (&refqual NE); %let j=1; %local z; %local zz; %let z=%sysfunc(open(&data3)); %let rc=%sysfunc(fetchobs(&z,4)); %let prop=%sysfunc(getvarn(&z,%sysfunc(varnum(&z,&modact)))); %let propref=%sysfunc(getvarn(&z,%sysfunc(varnum(&z,&refmod)))); %let zz=%sysfunc(close(&z)); %let propqual=-%sysevalf(&prop/&propref)*&modact; %let j=%eval(&j+1); %let l=%eval(&l+1); %let modact=%scan(&qual2,&l); %do %while (&j<=&refqual); %local z; %local zz; %let z=%sysfunc(open(&data3)); %let rc=%sysfunc(fetchobs(&z,4)); %let prop=%sysfunc(getvarn(&z,%sysfunc(varnum(&z,&modact)))); %let propref=%sysfunc(getvarn(&z,%sysfunc(varnum(&z,&refmod)))); %let zz=%sysfunc(close(&z)); %let propqual=&propqual-%sysevalf(&prop/&propref)*&modact; %let j=%eval(&j+1); %let l=%eval(&l+1); %let modact=%scan(&qual2,&l); %end; %let modact2=%scan(&qual2,&l-1); %let long=%length(&modact2); &refmod: test &propqual=0; %put %str(&refmod: test &propqual=0;); %let i=%eval(&i+1); %let refmod=%scan(&refe,&i); %let refqual=%scan(&nbmod,&i); %if &refqual NE %then %do; %let refqual=%eval(&refqual-1); %end; %end; %let i=1; %let refqual=%scan(&nbmod,&i); %let refqual=%eval(&refqual-1); %let l=1; %let modact=%scan(&qual2,&l); %do %while (&refqual NE); %let j=1; %let propqual=%str(&modact=0); %let j=%eval(&j+1); %let l=%eval(&l+1); %let modact=%scan(&qual2,&l); %do %while (&j<=&refqual); %let propqual=&propqual%str(,)%str(&modact=0); %let j=%eval(&j+1); %let l=%eval(&l+1); %let modact=%scan(&qual2,&l); %end; %let modact2=%scan(&qual2,&l-1); %let long=%length(&modact2); %let nomtest=%substr(&modact2,1,&long-1)_; &nomtest: test &propqual; %put %str(&nomtest: test &propqual;); %let i=%eval(&i+1); %let refmod=%scan(&refe,&i); %let refqual=%scan(&nbmod,&i); %if &refqual NE %then %do; %let refqual=%eval(&refqual-1); %end; %end; %put %str(run;); run; title; %put %str(title;); proc iml; %put %str(proc iml;); use &data1 var{&intercep &num &qual2}; %put %str(use &data1 var{&intercep &num &qual2};); read all into mat; %put %str(read all into mat;); a=ncol(mat); %put %str(a=ncol(mat);); b=a+1; %put %str(b=a+1;); mse=sqrt(vecdiag(mat[2:b,1:a])); %put %str(mse=sqrt(vecdiag(mat[2:b,1:a]));); msea=T(mse); %put %str(msea=T(mse);); close &data1; %put %str(close &data1;); create mse1 from msea[colname={&intercep &num &qual2}]; %put %str(create mse1 from msea[colname={&intercep &num &qual2}];); append from msea; %put %str(append from msea;); use &data5 var{&intercep &num &qual2}; %put %str(use &data5 var{&intercep &num &qual2};); read all into mat2; %put %str(read all into mat2;); a=ncol(mat2); %put %str(a=ncol(mat2);); b=a+1; %put %str(b=a+1;); mse=sqrt(vecdiag(mat2[2:b,1:a])); %put %str(mse=sqrt(vecdiag(mat2[2:b,1:a]));); mseb=T(mse); %put %str(mseb=T(mse);); close &data5; %put %str(close &data5;); create mse2 from mseb[colname={&intercep &num &qual2}]; %put %str(create mse2 from mseb[colname={&intercep &num &qual2}];); append from mseb; %put %str(append from mseb;); use &data3 var{&num &qual2}; %put %str(use &data3 var{&num &qual2};); read all into mat3; c=ncol(mat3); tpoid=j(1,&nbinter,0)||mat3[4:4,1:c]; %put %str(read all into mat3; c=ncol(mat3); tpoid=j(1,&nbinter,0)||mat3[4:4,1:c];); poid=T(tpoid); %put %str(poid=T(tpoid);); tparm=mat2[1:1,1:a]; %put %str(tparm=mat2[1:1,1:a];); cov=mat2[2:b,1:a]; parm=T(tparm); %put %str(parm=T(tparm);); nl=nrow(parm); %put %str(nl=nrow(parm);); id=i(nl); %put %str(id=i(nl);); %let i=1; %let var=%scan(&refe,&i); %let refqual=%scan(&nbmod,&i); %let refqual=%eval(&refqual-1); %let cumqual=%eval(&nbinter+&nbnum); %do %while (&var NE); %let r2=%eval(&cumqual+1); %let r3=%eval(&cumqual+&refqual); %let r4=%eval(&nbmact+&nbinter-&r3); %let b1r4=; %let b2r4=; %if &r4 >0 %then %do; %let b1r4=//j(&r4,1,0); %let b2r4=//j(&r4,&refqual,0); %end; use &data3 var{&var}; %put %str(use &data3 var{&var};); read all into matref; pdref=matref[4:4,1]; %put %str(read all into matref; pdref=matref[4:4,1];); poidref=(-1/pdref)*(j(&cumqual,1,0)//poid[&r2:&r3,1]&b1r4); %put %str(poidref=(-1/pdref)*(j(&cumqual,1,0)//poid[&r2:&r3,1]&b1r4);); tpoidref=T(poidref);b=tpoidref*parm; %put %str(tpoidref=T(poidref);b=tpoidref*parm;); sd=sqrt(tpoidref*cov*poidref); %put %str(sd=sqrt(tpoidref*cov*poidref);); cumpref=T(j(&cumqual,1,0)//poid[&r2:&r3,1]&b1r4)*j(a,1,1)+pdref; %put %str(cumpref=T(j(&cumqual,1,0)//poid[&r2:&r3,1]&b1r4)*j(a,1,1)+pdref;); poidvar=j(&cumqual,&refqual,0)//id[1:&refqual,1:&refqual]&b2r4; %put %str(poidvar=j(&cumqual,&refqual,0)//id[1:&refqual,1:&refqual]&b2r4;); tpoidvar=t(poidvar); %put %str(tpoidvar=t(poidvar);); tvar=T(tpoidvar*parm)*inv((tpoidvar*cov*poidvar))*(tpoidvar*parm); %put %str(tvar=T(tpoidvar*parm)*inv((tpoidvar*cov*poidvar))*(tpoidvar*parm);); df=&refqual; %put %str(df=&refqual;); &var=b//sd//tvar//df//cumpref; %put %str(&var=b//sd//tvar//df//cumpref;); create &var from &var[colname={&var}]; %put %str(create &var from &var[colname={&var}];); append from &var; %put %str(append from &var;); %let cumqual=%eval(&cumqual+&refqual); %let i=%eval(&i+1); %let refqual=%scan(&nbmod,&i); %let refqual=%eval(&refqual-1); %let var=%scan(&refe,&i); %end; quit; %put %str(quit;); data &data6; set &data5(where=(_type_="PARMS")) mse2 ; %put %str(data &data6; set &data5(where=(_type_="PARMS")) mse2 ;); %put %str(run;); run; data &data6; merge &data6 &refe; %put %str(data &data6; merge &data6 &refe;); %put %str(run;); run; data &data4; set &data4 (drop=_type_ ); %put %str(data &data4; set &data4 (drop=_type_ );); if &clause then do; %put %str(if &clause then do;); %if %index(%upcase(&option1),DESCENDING) %then %do; _type_= trim(_stat_)!!left(&nbinter+2-(ceil(_N_/5)-1)); %put %str(_type_= trim(_stat_)!!left(&nbinter+2-(ceil(_N_/5)-1));); %end; %else %do; _type_= trim(_stat_)!!left(ceil(_N_/5)-1); %put %str(_type_= trim(_stat_)!!left(ceil(_N_/5)-1);); %end; end; else _type_=_stat_; %put %str(else type=_stat_;); %put %str(end;); %put %str(run;); run; data &data7; %put %str(data &data7;); set &data3(drop=_type_ where=(_stat_="MEAN")) &data1 (where=(_type_="PARMS")) mse1 &data6 &data6(where=(_type_="PARMS")) &data4(drop=&xplique _stat_ ); %put %str(&data3(drop=_type_ where=(_stat_="MEAN")) set &data1 (where=_type_="PARMS") mse1 &data6 &data6(where=(_type_="PARMS")) &data4(drop=&xplique _stat_ ) ;); if _n_=1 then _type_="MOYPOIDS"; %put %str(if _n_=1 then _type_="MOYPOIDS";); if _n_=2 then _type_="PARMS1"; %put %str(if _n_=2 then _type_="PARMS1";); if _n_=3 then _type_="SE1"; %put %str(if _n_=3 then _type_="SE1";); if _n_=4 then _type_="PARMS2"; %put %str(if _n_=4 then _type_="PARMS2";); if _n_=5 then _type_="SE2"; %put %str(if _n_=5 then _type_="SE2";); if _n_=6 then _type_="WALDVAR"; %put %str(if _n_=6 then _type_="WALDVAR";); if _n_=7 then _type_="DFVAR"; %put %str(if _n_=7 then _type_="DFVAR";); if _n_=8 then _type_="CUMPDVAR"; %put %str(if _n_=8 then _type_="CUMPDVAR";); if _n_=9 then do; %put %str(if _n_=9 then do;); _type_="CLEDETRI"; %put %str(_type_="CLEDETRI";); array g _NUMERIC_; %put %str(array g _NUMERIC_;); do over g; %put %str(do over g;); g=3; %put %str(g=.;); end; %put %str(end;); array h &intercep; %put %str(array h &intercep;); do over h; %put %str(do over h;); h=0; %put %str(h=0;); end; %put %str(end;); %if &num NE %then %do; array i # %put %str(array i #); do over i; %put %str(do over i;); i=1; %put %str(i=1;); end; %put %str(end;); %end; array j &qual; %put %str(array j &qual;); do over j; %put %str(do over j;); j=2; %put %str(j=1;); end; %put %str(end;); end; %put %str(end;); %put %str(run;); run; %if &nbinter=1 %then %do; %local z; %local zz; %let z=%sysfunc(open(&data5)); %let rc=%sysfunc(fetchobs(&z,1)); %let const=%sysfunc(getvarn(&z,%sysfunc(varnum(&z,intercep)))); %let zz=%sysfunc(close(&z)); %put &const; %end; proc transpose data=&data7 out=&data7; %put %str(proc transpose data=&data7 out=&data7;); id _type_; %put %str(id _type_;); %put %str(run;); run; data &data7; set &data7; %put %str(data &data7; set &data7;); Label PARMS1="PARAMETRE"; %put %str(Label PARMS1="PARAMETRE";); Label SE1="ECART-TYPE"; %put %str(Label SE1="ECART-TYPE";); Label PARMS2="PARAMETRE"; %put %str(Label PARMS2="PARAMETRE";); Label SE2="ECART-TYPE"; %put %str(Label SE2="ECART-TYPE";); test1=1-probchi((Parms1/SE1)**2,1); %put %str(test1=probchi((Parms1/SE1)**2,1);); Label TEST1="Proba Nullité"; %put %str(Label TEST1="Proba Nullité";); test2=1-probchi((Parms2/SE2)**2,1); %put %str(test2=probchi((Parms2/SE2)**2,1);); Label TEST2="Proba Nullité"; %put %str(Label TEST2="Proba Nullité";); testvar=1-probchi(waldvar,dfvar); %put %str(testvar=probchi(waldvar,dfvar);); Label WALDvar="CHI2 Varqual Polytomique"; %put %str(Label TESTvar="CHI2 Varqual Polytomique";); Label DFvar="DL Varqual Polytomique"; %put %str(Label DFvar="DL Varqual Polytomique";); Label TESTvar="Proba Nullité Varqual Polytomique"; %put %str(Label TESTvar="Proba Nullité Varqual Polytomique";); %let nbclass=%eval(&nbinter+1); %let cpte=1; %do %while (&cpte<%eval(&nbclass+1)); if cledetri=1 then do; %put %str(if cledetri=1 then do;); MOYPOID=PUT(MOYPOIDS,BEST8.); %put %str(MOYPOID=PUT(MOYPOIDS,BEST8.);); MOYNUM&cpte=MEAN&cpte; %put %str(MOY&cpte=MEAN&cpte;); Label MOYNUM&cpte="Moyenne des var conti pour classe&cpte"; %put %str(Label MOYNUM&cpte="Moyenne des var conti pour classe&cpte";); BMOYNU&cpte=MEAN&cpte-MEAN; %put %str(BMOYNU&cpte=MEAN&cpte-MEAN;); Label BMOYNU&cpte="Dif de moy des var conti classe&cpte-ensemble"; %put %str(Label BMOYNU&cpte="Dif de moy des var conti classe&cpte-ensemble";); BTESNU&cpte=2*(1-(PROBNORM(abs(MEAN&cpte-MEAN)/sqrt(STD&cpte**2/N&cpte+STD**2/N)))); %put %str(BTESNU&cpte=2*(1-(PROBNORM(abs(MEAN&cpte-MEAN)/sqrt(STD&cpte**2/N&cpte+STD**2/N))));); Label BTESNU&cpte="Test signif de dif de moy classe&cpte-ensemble"; %put %str(Label BTESNU&cpte="Test signif de dif de moy classe&cpte-ensemble";); end; %put %str(end;); else if cledetri=2 then do; %put %str(else if cledetri=2 then do;); MOYPOID=PUT(MOYPOIDS,PERCENT8.2); %put %str(MOYPOID=PUT(MOYPOIDS,PERCENT8.2);); MOYPRO&cpte=N&cpte*MEAN&cpte/(N*MEAN); %put %str(MOYPRO&cpte=N&cpte*MEAN&cpte/(N*MEAN);); Label MOYPRO&cpte="Prop des mod qual étant classe&cpte"; %put %str(Label MOYPRO&cpte="Prop des mod qual étant classe&cpte";); BMOYPR&cpte=(N&cpte*MEAN&cpte/(N*MEAN))-N&cpte/N; %put %str(BMOYPR&cpte=(N&cpte*MEAN&cpte/(N*MEAN))-N&cpte/N;); Label BMOYPR&cpte="Dif prop modqual-ensemble étant classe&cpte"; %put %str(Label BMOYPR&cpte="Dif prop modqual-ensemble étant classe&cpte";); Btest&cpte=1-probchi((((N&cpte*MEAN&cpte-MEAN*N&cpte)**2)/(MEAN*N&cpte))/((1-N&cpte/N)* (1-(N*MEAN)/N)),1); %put %str(Btest&cpte=1-probchi((((N&cpte*MEAN&cpte-MEAN*N&cpte)**2)/(MEAN*N&cpte))/((1-N&cpte/N)* (1-(N*MEAN)/N)),1);); Label BTESt&cpte="Test signif de dif de prop (classe&cpte)"; %put %str(Label BTESt&cpte="Test signif de dif de prop (classe&cpte)";); end; %put %str(end;); if _NAME_="_FREQ_" then do; %put %str(if _NAME_="_FREQ_" then do;); _NAME_="ENSEMBLE"; %put %str(_NAME_="ENSEMBLE";); _label_="N="!!LEFT(MOYPOIDS); %put %str(_label_="N="!!LEFT(MOYPOIDS);); MOYPOIDS=.; %put %str(MOYPOIDS=.;); MOYPRO&cpte=N&cpte/N; %put %str(MOYPRO&cpte=N&cpte/N;); end; %let cpte=%eval(&cpte+1); %end; Label CUMPDVAR="Somme des poids ensemble varqual"; %put %str(Label CUMPDVAR="Somme des poids ensemble varqual";); Label MOYPOID="Moy des var conti et poids des mod qual"; %put %str(Label MOYPOID="Moy des var conti et poids des mod qual";); Label _NAME_="NOM"; %put %str(Label _NAME_="NOM";); Label _LABEL_="LABEL"; %put %str(Label _LABEL_="LABEL";); %put %str(run;); if parms1 NE . and test1 NE . then do; if PARMS1<0 and TEST1<0.001 then SYMB1="---"; else if PARMS1<0 and TEST1<=0.01 then SYMB1="--"; else if PARMS1<0 and TEST1<=0.1 then SYMB1="-"; else if PARMS1<0 and TEST1<=0.2 then SYMB1="(-)"; else if PARMS1<0 and TEST1>0.2 then SYMB1=""; else if PARMS1>0 and TEST1<=0.001 then SYMB1="+++"; else if PARMS1>0 and TEST1<=0.01 then SYMB1="++"; else if PARMS1>0 and TEST1<=0.1 then SYMB1="+"; else if PARMS1>0 and TEST1<=0.2 then SYMB1="(+)"; else SYMB1=""; end; if parms2 NE . and test2 NE . then do; if PARMS2<0 and TEST2<0.001 then SYMB2="---"; else if PARMS2<0 and TEST2<=0.01 then SYMB2="--"; else if PARMS2<0 and TEST2<=0.1 then SYMB2="-"; else if PARMS2<0 and TEST2<=0.2 then SYMB2="(-)"; else if PARMS2<0 and TEST2>0.2 then SYMB2=""; else if PARMS2>0 and TEST2<=0.001 then SYMB2="+++"; else if PARMS2>0 and TEST2<=0.01 then SYMB2="++"; else if PARMS2>0 and TEST2<=0.1 then SYMB2="+"; else if PARMS2>0 and TEST2<=0.2 then SYMB2="(+)"; else SYMB2=""; end; %Let MARGE=; %if &nbinter=1 %then %do; %Let MARGE=MARGE; If cledetri=0 then MARGE=(1/(1+exp(-&const))); else if cledetri in (1,2) then MARGE=(1/(1+exp(-&const-parms2)))-(1/(1+exp(-&const))); %put %str(If cledetri=0 then MARGE=(1/(1+exp(-&const)));); %put %str(else if cledetri in (1,2) then MARGE=(1/(1+exp(-&const-parms2)))-(1/(1+exp(-&const)));); %end; run; proc sort; %put %str(proc sort;); by CLEDETRI; %put %str(by CLEDETRI;); %put %str(run;); run; %let varnum=; %if &num NE %then %do; %let varnum=MOYNUM1--BTESNU&nbinter; %end; proc print LABEL; %put %str(proc print LABEL;); title LES EFFETS BRUTS; %put %str(title Les effets bruts;); var MOYPOID &varnum MOYPRO1--BTEST&nbinter CUMPDVAR; %put %str(var MOYPOID &varnum MOYPOIDS MOYPRO1--BTEST&nbinter CUMPDVAR;); id _name_ _label_ ; %put %str(id _name_ _label_ ;); format MOYNUM1-MOYNUM&nbinter BMOYNU1-BMOYNU&nbinter BEST8. BTESNU1-BTESNU&nbinter MOYPRO1-MOYPRO&nbinter BMOYPR1-BMOYPR&nbinter BTEST1-BTEST&nbinter CUMPDVAR PERCENT8.2; %put %str(format MOYNUM1-MOYNUM&nbinter BMOYNU1-BMOYNU&nbinter BEST8. BTESNU1-BTESNU MOYPRO1-MOYPRO&nbinter BMOYPR1-BMOYPR&nbinter BTEST1-BTEST&nbinter CUMPDVAR PERCENT8.2;); %put %str(run;); run; proc print LABEL; %put %str(proc print LABEL;); title LES EFFETS NETS AVEC SITUATION DE REFERENCE; %put %str(title Les effets nets;); var MOYPOID PARMS1 SYMB1 SE1 TEST1 WALDVAR DFVAR TESTVAR; %put %str(var MOYPOID PARMS1 SYMB1 SE1 TEST1 WALDVAR DFVAR TESTVAR;); id _name_ _label_; %put %str(id _name_ _label_ ;); format _numeric_ best8. TEST1 TESTVAR PERCENT8.2; %put %str(format _numeric_ best8. TEST1 TESTVAR PERCENT8.2;); %put %str(run;); run; proc print LABEL; %put %str(proc print LABEL;); title LES EFFETS NETS AVEC COMPARAISON A LA MOYENNE; %put %str(title Les effets nets;); var MOYPOID PARMS2 SE2 TEST2 &MARGE SYMB2 WALDVAR DFVAR TESTVAR; %put %str(var MOYPOID PARMS2 SE2 TEST2 &MARGE SYMB2 WALDVAR DFVAR TESTVAR;); id _name_ _label_; %put %str(id _name_ _label_ ;); format _numeric_ best8. TEST2 TESTVAR &MARGE PERCENT8.2; %put %str(format _numeric_ best8. TEST2 TESTVAR &MARGE PERCENT8.2;); %put %str(run;); run; title; %put %str(**** Le programme était : *********;); %put %nrstr(%aidelogi) %str((data=&data,xplique=&xplique,conti=&conti,quali=&quali,nbmod=&nbmod,ref=&ref,where=&where,weight=&weight,ecran=&ecran,centre=¢re,option1=&option1);); %put %str(***********************************;); %put %str(); %put %str(); %put %str(****************************************************************;); %put %str(* C est fini. Des blocs de programme SAS générés par la macro*;); %put %str(* et directement utilisables comme programme SAS se trouvent *;); %put %str(* au-dessus dans la fenêtre Log. *;); %put %str(****************************************************************;); %goto fin; %Erreur1: ; %put %str( ATTENTION !!! Erreur(s). Non correspondance entre le nombre ); %put %str(de modalités de la ligne quali et de la ligne nbmod); %goto fin; %Erreur2: ; %put %str( ATTENTION !!! Erreur(s). Non correspondance entre le nombre ); %put %str(de variables de la ligne nbmod et de la ligne ref); %goto fin; %fin : ; %mend;