%macro BENARD(trt,id,response,dataset,MULTCOMP=0);
options nodate;
 proc sort data=&dataset; by &id;
 proc rank data=&dataset out=rdata; by &id;
   var &response;
   ranks r;

data sumnij(keep=&id &response &trt mat r) nidot(keep=&id ni);
    set rdata;
   by &id; mat=1;
   if &response=. then mat=.5;
   output sumnij;
   if first.&id then do;
   ni=0; end;
   if &response ne . then do;
   ni+1; end;
   if last.&id then output nidot;

*************************************************************;
*  MAT=# reps of the jth column or treatment in the ith row
*      or block (mat=.5 for empty cells or reps-necessary for
*      Proc Freq, 13 lines below and to maintain data MATrix).
* ni=# obs /driver or # obs per row;
*************************************************************;

data Rrank; merge sumnij nidot;
 by &id;
 if r=. or ni=1 then delete;
 Rijk=R-((ni+1)/2);

***** Rijk=REDUCED RANKS (For each specific rank subtract the
*****                     arithmatic mean of the ranks);
***************************************************************;

 PROC FREQ DATA=SUMNIJ; TABLES &ID*&TRT/OUT=SUMNIJ NOPRINT;
   weight mat;
 data sumnij(drop=count percent); set sumnij; mnij=count;
   if mnij=.5 then mnij=0;

proc sort data=Rrank; by &trt;
proc means data=Rrank noprint; var rijk; by &trt;
  output out=udot sum=udotj N=NDOTJ;
  *** udotj =col or trt totals for reduced ranks;

PROC TRANSPOSE DATA=UDOT OUT=UDOT2 prefix=udotj;
  VAR UDOTJ;

************************************************************;
proc sort data=Rrank; by &id r;
proc means data=Rrank noprint; by &id r; id ni;
  output out=ties n=nn;

  ***** NN IS THE NUMBER OF OBSERVATIONS WITH THE SAME
  ***** ID AND RANK VALUE. IF NO TIED RANKS THEN DATA SET
  ***** TIES AND Rrank ARE IDENTICAL.;

proc freq data=ties; tables &id*nn/out=ties noprint;

  **** NN IS THE NUMBER OF TIES OF ANY GIVEN SIZE IN THE ITH
  **** RANKING;
data Ties(keep=&id ni count nn t);
     merge ties nidot; by &id;
     t=nn**3*count;
     *** COUNT IS THE NUMBER OF TIES OF SIZE NN IN THE
     *** ITH RANKING.;

     proc means noprint; var t; by &id; output out=ties sum=t;
                           id ni;

data ties(drop=_type_); set ties;
   if ni gt 1 then do;
   k=(ni**3-t)/(12*ni*(ni-1));
   end;
   ***** K IS WEIGHTING FACTOR FOR EACH BLOCK OR ROW.;

proc means noprint data=&dataset; var &trt;
   output out=max max=mtrt;

   ***** MTRT is the maximum treatment value. This value is passed
   ***** to a macro variable called 'maxtrt'.;
data sumnij(keep=mtrt &id mnij); set max end=final;
     do i=1 to total;
     set sumnij point=i nobs=total;
     output; end;
     if final then call symput('maxtrt',left(mtrt));

data varco(keep=&id t1-t&maxtrt mtrt);
   array t[&maxtrt] t1-t&maxtrt;
   do i=1 to &maxtrt;
   set sumnij;
   t{i}=mnij;
   end;
   **** the matrix t consists # treatments by # of rows where
   **** the t elements represent the number of replications
   **** in the jth treatment in the ith row or block.;

data varco;  merge ties varco; by &id;

%macro create2;

data vmat2; set varco;
  v1=(k*t1*(ni-t1));
  v2=-t1*t2*k;
  v3=v2;
  v4=(k*t2*(ni-t2));
 proc means noprint;
  var v1-v4;
  output out=vmat2 sum=v1-v4;
  id mtrt;

data vmat2(drop=_FREQ_ _TYPE_); merge vmat2 udot2;
 vu=(v4*0) - (udotj2*udotj2); v=v4;
 BVE_stat=ABS(vu)/abs(v);
 Pvalue=1-probchi(bve_stat,1);
 proc print label SPLIT='*' noobs;
 LABEL BVE_STAT='BENARD-van ELTEREN*Test Statistic';
 LABEL pvalue  ='P value from the*CHI-SQUARE distribution';
 VAR BVE_STAT pvalue;
 title ' ';

%mend create2;

%macro create3;

 data vmat3; set varco;
  v1=(k*t1*(ni-t1));
  v2=-t1*t2*k;
  v3=-t1*t3*k;
  v4=v2;
  v5=(k*t2*(ni-t2));
  v6=-t2*t3*k;
  v7=v3;
  v8=v6;
  v9=(k*t3*(ni-t3));

  proc means noprint;
   var v1-v9;
   output out=vmat3 sum=v1-v9;
   id mtrt;

data vmat3(drop=_FREQ_ _TYPE_); merge vmat3 udot2;

V=(V5*V9) - (V6*V8);
VU=(V5*V9*0) + (V6*UDOTJ3*UDOTJ2) + (UDOTJ2*V8*UDOTJ3) -
   (V5*UDOTJ3*UDOTJ3) - (V8*V6*0) - (UDOTJ2*V9*UDOTJ2);
BVE_stat=ABS(VU)/abs(V);
/*
*    Lines 143-146 are necessary only if IML is not available.
*    LINES 153 THROUGH 182 ARE ONLY NEEDED IF YOU WISH TO USE
*    IML WITH 3 TREATMENTS.
***************************************************************;

data vu(keep=x1-x3);
     set vmat3;
 array a[4] v1 v4 v7 udotj1;
 array b[4] v2 v5 v8 udotj2;
 array c[4] v3 v6 v9 udotj3;
 do i=1 to 4;
 x1=a{i}; x2=b{i}; x3=c{i};
 output vu;
 end;

data mat(drop=&trt _type_ _freq_ ndotj);
merge vu udot;
If udotj=. then udotj=0;
******************************************************************;
proc iml;
reset NOprint;
use mat;
read POINT (1:3) VAR{X1 X2 X3} into VMATRIX;
read POINT (2:3) VAR{X2 X3} into x;
read POINT (2:4) VAR{X2 X3 udotj} into y;
v=det(x);        * v=det of the V matrix;
vu=det(y);       *vu=det of the V subu matrix;
d=v||vu;
create bve from d;
append from d;
quit;
*****************************************************************;

data BVE(rename=(col2=detvu col1=detv)); set bve;
  BVE_stat=ABS(col2)/abs(col1);
*/
  Pvalue=1-probchi(bve_stat,2);
  proc print label SPLIT='*' noobs;
  LABEL BVE_STAT='BENARD-van ELTEREN*Test Statistic';
  LABEL pvalue  ='P value from the*CHI-SQUARE distribution';
  VAR BVE_STAT pvalue;
  title ' ';

data mc; merge vmat3 udot;
 ubar=udotj/ndotj;

PROC TRANSPOSE DATA=UDOT OUT=UDOT3 prefix=ndotj;
VAR nDOTJ;

data mc(keep=v1-v9 udotj1-udotj3 ndotj1-ndotj3 ubarj1-ubarj3
             vb1-vb9
             varub12 varub13 varub23 d12 d13 d23);
merge vmat3 udot3;
 ubarj1=udotj1/ndotj1;
 ubarj2=udotj2/ndotj2;
 ubarj3=udotj3/ndotj3;
 vb1=v1/(ndotj1**2);
 vb2=v2/(ndotj1*ndotj2); vb4=vb2;
 vb3=v3/(ndotj1*ndotj3); vb7=vb3;
 vb5=v5/(ndotj2**2);
 vb6=v6/(ndotj2*ndotj3); vb8=vb6;
 vb9=v9/(ndotj3**2);
 varub12=vb1+vb5 - (2*vb2); LABEL varub12='VARIANCE*(MCR1-MCR2)';
 varub13=vb1+vb9 - (2*vb3); LABEL varub13='VARIANCE*(MCR1-MCR3)';
 varub23=vb5+vb9 - (2*vb6); LABEL varub23='VARIANCE*(MCR2-MCR3)';

  %if &MULTCOMP=0 %THEN %DO;
      d12=abs(ubarj1-ubarj2)/(sqrt(varub12/2));
      d13=abs(ubarj1-ubarj3)/(sqrt(varub13/2));
      d23=abs(ubarj2-ubarj3)/(sqrt(varub23/2));

proc print label noobs split='*';
var varub12 varub13 varub23;
 LABEL varub12='VARIANCE*(MCR1-MCR2)';
 LABEL varub13='VARIANCE*(MCR1-MCR3)';
 LABEL varub23='VARIANCE*(MCR2-MCR3)';
TITLE 'VARIANCES of the DIFFERENCES of the MEAN CENTERED RANKS(MCR)';
title2 'These variances should be equal or nearly equal';
title3 ' ';

proc print label noobs;
var d12 d13 d23;
label d12='D1,2 for group 1 vs 2';
label d13='D1,3 for group 1 vs 3';
label d23='D2,3 for group 2 vs 3';
title  'RESULTING STATISTICS FROM MULTIPLE COMPARISONS AMONG GROUPS';
title2 '0.05 and .01 critical values of 3.314 and 4.120';
title3 'These Critical Values Control the TYPE I EXPERIMENTWISE ERROR';
title4 'Rate using a TUKEY-KRAMER Procedure (see Miller,1981 p. 177).';
title5 ' ';

  %END;
  %ELSE %DO;
      d12=abs(ubarj1-ubarj2)/(sqrt(varub12));
      d13=abs(ubarj1-ubarj3)/(sqrt(varub13));
      d23=abs(ubarj2-ubarj3)/(sqrt(varub23));

proc print label noobs split='*';
var varub12 varub13 varub23;
TITLE 'VARIANCES of the DIFFERENCES of the MEAN CENTERED RANKS(MCR)';
title2 'These variances should be equal or nearly equal';
title3 ' ';

proc print label noobs;
var d12 d13 d23;
label d12='D1,2 for group 1 vs 2';
label d13='D1,3 for group 1 vs 3';
label d23='D2,3 for group 2 vs 3';
title  'RESULTING STATISTICS FROM MULTIPLE COMPARISONS AMONG GROUPS';
title2 '0.05 and 0.01 critical values of 2.40 and 2.93';
title3 'These Critical Values Control the TYPE I EXPERIMENTWISE ERROR';
title4 'Rate using a BONFERRONI Procedure (see Woolson,1987, p. 371) ';
title5 ' ';
   %END;

%mend create3;

%macro create4;
data vmat4; set varco;
 v1=(k*t1*(ni-t1));
 v2=-t1*t2*k;
 v3=-t1*t3*k;
 v4=-t1*t4*k;
 v5=v2;
 v6=(k*t2*(ni-t2));
 v7=-t2*t3*k;
 v8=-t2*t4*k;
 v9=v3;
 v10=v7;
 v11=(k*t3*(ni-t3));
 v12=-t3*t4*k;
 v13=v4;
 v14=v8;
 v15=v12;
 v16=(k*t4*(ni-t4));
proc means noprint;
 var v1-v16;
 output out=vmat4 sum=v1-v16;
 id mtrt;

data vmat4(drop=_FREQ_ _TYPE_); merge vmat4 udot2;

******************************************************************;

data vu(keep=x1-x4);
   set vmat4;
 array a[5] v1 v5 v9  v13 udotj1;
 array b[5] v2 v6 v10 v14 udotj2;
 array c[5] v3 v7 v11 v15 udotj3;
 array d[5] v4 v8 v12 v16 udotj4;
 do i=1 to 5;
 x1=a{i}; x2=b{i}; x3=c{i}; x4=d{i};
 output vu;
 end;

data mat(drop=&trt _type_ _freq_ ndotj);
merge vu udot;
If udotj=. then udotj=0;

**************************************************************;
proc iml;
reset NOprint;
use mat;
read POINT (1:4) VAR{X1 X2 X3 x4} into VMATRIX;
read POINT (2:4) VAR{X2 X3 x4} into x;
read POINT (2:5) VAR{X2 X3 x4 udotj} into y;
v=det(x);              * v=det of the V matrix;
vu=det(y);             *vu=det of the V subu matrix;
d=v||vu;
create bve from d;
append from d;
quit;

data BVE(rename=(col2=detvu col1=detv)); set bve;
 BVE_stat=ABS(col2)/abs(col1);
 Pvalue=1-probchi(bve_stat,3);
 proc print data=bve label SPLIT='*' noobs;
 LABEL BVE_STAT='BENARD-van ELTEREN*Test Statistic';
 LABEL pvalue  ='P value from the*CHI-SQUARE distribution';
 VAR BVE_STAT pvalue;
 title ' ';

data mc; merge vmat4 udot;
 ubar=udotj/ndotj;

PROC TRANSPOSE DATA=UDOT OUT=UDOT4 prefix=ndotj;
VAR nDOTJ;

data mc(keep=v1-v16 udotj1-udotj4 ndotj1-ndotj4 ubarj1-ubarj4
             vb1-vb16
             varub12 varub13 varub14 varub23 varub24 varub34
             d12 d13 d14 d23 d24 d34);
merge vmat4 udot4;
 ubarj1=udotj1/ndotj1;
 ubarj2=udotj2/ndotj2;
 ubarj3=udotj3/ndotj3;
 ubarj4=udotj4/ndotj4;
 vb1=v1/(ndotj1**2);
 vb2=v2/(ndotj1*ndotj2);
 vb3=v3/(ndotj1*ndotj3);
 vb4=v4/(ndotj1*ndotj4);
 vb5=vb2;
 vb6=v6/(ndotj2**2);
 vb7=v7/(ndotj2*ndotj3);
 vb8=v8/(ndotj2*ndotj4);
 vb9=vb3;
 vb10=vb7;
 vb11=v11/(ndotj3**2);
 vb12=v12/(ndotj3*ndotj4);
 vb13=vb4;
 vb14=vb8;
 vb15=vb12;
 VB16=V16/(NDOTJ4**2);
 varub12=vb1+vb6 -  (2*vb2);
 varub13=vb1+vb11 - (2*vb3);
 varub14=vb1+vb16 - (2*vb4);
 varub23=vb6+vb11 - (2*vb7);
 VARUB24=VB6+VB16 - (2*VB8);
 VARUB34=VB11+VB16 - (2*VB12);

%IF &MULTCOMP=0 %THEN %DO;
    d12=abs(ubarj1-ubarj2)/(sqrt(varub12/2));
    d13=abs(ubarj1-ubarj3)/(sqrt(varub13/2));
    d14=abs(ubarj1-ubarj4)/(sqrt(varub14/2));
    d23=abs(ubarj2-ubarj3)/(sqrt(varub23/2));
    d24=abs(ubarj2-ubarj4)/(sqrt(varub24/2));
    d34=abs(ubarj3-ubarj4)/(sqrt(varub34/2));


proc print label noobs split='*';
 var varub12 varub13 varub14 varub23 varub24 varub34;
    LABEL varub12='VARIANCE*(MCR1-MCR2)';
    LABEL varub13='VARIANCE*(MCR1-MCR3)';
    LABEL varub14='VARIANCE*(MCR1-MCR4)';
    LABEL varub23='VARIANCE*(MCR2-MCR3)';
    LABEL varub24='VARIANCE*(MCR2-MCR4)';
    LABEL varub34='VARIANCE*(MCR3-MCR4)';
TITLE 'VARIANCES of the DIFFERENCES of the MEAN CENTERED RANKS(MCR)';
title2 'These variances should be equal or nearly equal';
title3 ' ';

proc print label noobs;
 var d12 d13 d14 d23 d24 d34;
 label d12='D1,2 for group 1 vs 2';
 label d13='D1,3 for group 1 vs 3';
 label d14='D1,4 for group 1 vs 4';
 label d23='D2,3 for group 2 vs 3';
 label d24='D2,4 for group 2 vs 4';
 label d34='D3,4 for group 3 vs 4';
title  'RESULTING STATISTICS FROM MULTIPLE COMPARISONS AMONG GROUPS';
title2 '0.05 and .01 critical values of 3.633 and 4.403';
title3 'These Critical Values Control the TYPE I EXPERIMENTWISE ERROR';
title4 'Rate using a TUKEY-KRAMER Procedure (see Miller,1981 p. 177).';
title5 ' ';
   %END;
   %ELSE %DO;
d12=abs(ubarj1-ubarj2)/(sqrt(varub12));
d13=abs(ubarj1-ubarj3)/(sqrt(varub13));
d14=abs(ubarj1-ubarj4)/(sqrt(varub14));
d23=abs(ubarj2-ubarj3)/(sqrt(varub23));
d24=abs(ubarj2-ubarj4)/(sqrt(varub24));
d34=abs(ubarj3-ubarj4)/(sqrt(varub34));


proc print label noobs split='*';
var varub12 varub13 varub14 varub23 varub24 varub34;
    LABEL varub12='VARIANCE*(MCR1-MCR2)';
    LABEL varub13='VARIANCE*(MCR1-MCR3)';
    LABEL varub14='VARIANCE*(MCR1-MCR4)';
    LABEL varub23='VARIANCE*(MCR2-MCR3)';
    LABEL varub24='VARIANCE*(MCR2-MCR4)';
    LABEL varub34='VARIANCE*(MCR3-MCR4)';
TITLE 'VARIANCES of the DIFFERENCES of the MEAN CENTERED RANKS(MCR)';
title2 'These variances should be equal or nearly equal';
title3 ' ';

proc print label noobs;
var d12 d13 d14 d23 d24 d34;
label d12='D1,2 for group 1 vs 2';
label d13='D1,3 for group 1 vs 3';
label d14='D1,4 for group 1 vs 4';
label d23='D2,3 for group 2 vs 3';
label d24='D2,4 for group 2 vs 4';
label d34='D3,4 for group 3 vs 4';
title  'RESULTING STATISTICS FROM MULTIPLE COMPARISONS AMONG GROUPS';
title2 '0.05 and 0.01 Critical Values of 2.65 and 3.14';
title3 'These Critical Values Control the TYPE I EXPERIMENTWISE ERROR';
title4 'Rate using a BONFERRONI Procedure (see Woolson,1987, p. 371) ';
title5 ' ';
   %END;
*proc print;
%mend create4;

%macro create5;
 data vmat5; set varco;
   v1=(k*t1*(ni-t1));
   v2=-t1*t2*k;
   v3=-t1*t3*k;
   v4=-t1*t4*k;
   v5=-t1*t5*k;
   v6=v2;
   v7=(k*t2*(ni-t2));
   v8=-t2*t3*k;
   v9=-t2*t4*k;
   v10=-t2*t5*k;
   v11=v3;
   v12=v8;
   v13=(k*t3*(ni-t3));
   v14=-t3*t4*k;
   v15=-t3*t5*k;
   v16=v4;
   v17=v9;
   v18=v14;
   v19=(k*t4*(ni-t4));
   v20=-t4*t5*k;
   v21=v5;
   V22=V10;
   v23=v15;
   v24=v20;
   v25=(k*t5*(ni-t5));
 proc means noprint;
  var v1-v25;
  output out=vmat5 sum=v1-v25;
  id mtrt;

data vmat5(drop=_FREQ_ _TYPE_); merge vmat5 udot2;

******************************************************************;

data vu(keep=x1-x5);
   set vmat5;
 array a[6] v1 v6  v11 v16  v21 udotj1;
 array b[6] v2 v7  v12 v17  v22 udotj2;
 array c[6] v3 v8  v13 v18  v23 udotj3;
 array d[6] v4 v9  v14 v19  v24 udotj4;
 array e[6] v5 v10 v15 v20  v25 udotj5;
 do i=1 to 6;
 x1=a{i}; x2=b{i}; x3=c{i}; x4=d{i}; x5=e{i};
 output vu;
 end;

data mat(drop=&trt _type_ _freq_ ndotj);
 merge vu udot;
 If udotj=. then udotj=0;

******************************************************************;
proc iml;
reset NOprint;
use mat;
read POINT (1:5) VAR{X1 X2 X3 x4 x5} into VMATRIX;
read POINT (2:5) VAR{X2 X3 x4 x5} into x;
read POINT (2:6) VAR{X2 X3 x4 x5 udotj} into y;
v=det(x);          * v=det of the V matrix     ;
vu=det(y);         *vu=det of the V subu matrix;
d=v||vu;
create BVE from d;
append from d;
quit;

data BVE(rename=(col2=detvu col1=detv)); set BVE;
  BVE_stat=ABS(col2)/abs(col1);
  Pvalue=1-probchi(bve_stat,4);
   proc print data=bve label SPLIT='*' noobs;
   LABEL BVE_STAT='BENARD-van ELTEREN*Test Statistic';
  LABEL pvalue  ='P value from the*CHI-SQUARE distribution';
  VAR BVE_STAT pvalue;
  title ' ';

data mc; merge vmat5 udot;
  ubar=udotj/ndotj;

PROC TRANSPOSE DATA=UDOT OUT=UDOT5 prefix=ndotj;
  VAR nDOTJ;
data mc(keep=v1-v25 udotj1-udotj5 ndotj1-ndotj5 ubarj1-ubarj5
             vb1-vb25 varub12
             varub13 varub14 varub15 varub23 varub24 varub25
             varub34 varub35 varub45 d12 d13 d14 d15 d23 d24
             d25 d34 d35 d45);
  merge vmat5 udot5;
    ubarj1=udotj1/ndotj1;
    ubarj2=udotj2/ndotj2;
    ubarj3=udotj3/ndotj3;
    ubarj4=udotj4/ndotj4;
    ubarj5=udotj5/ndotj5;
    vb1=v1/(ndotj1**2);
    vb2=v2/(ndotj1*ndotj2);
    vb3=v3/(ndotj1*ndotj3);
    vb4=v4/(ndotj1*ndotj4);
    vb5=v5/(ndotj1*ndotj5);
    vb6=vb2;
    vb7=v7/(ndotj2**2);
    vb8=v8/(ndotj2*ndotj3);
    vb9=v9/(ndotj2*ndotj4);
    vb10=v10/(ndotj2*ndotj5);
    vb11=vb3;
    vb13=v13/(ndotj3**2);
    vb14=v14/(ndotj3*ndotj4);
    vb15=v15/(ndotj3*ndotj5);
    Vb16=vb4;
    vb17=vb9;
    vb18=vb14;
    vb19=v19/(ndotj4**2);
    vb20=v20/(ndotj4*ndotj5);
    vb21=vb5;
    vb22=vb10;
    vb23=vb15;
    vb24=vb20;
    vb25=v25/(ndotj5**2);
    varub12=vb1+vb7 - (2*vb2);
    varub13=vb1+vb13 - (2*vb3);
    varub14=vb1+vb19 - (2*vb4);
    varub15=vb1+vb25 - (2*vb5);
    varub23=vb7+vb13 - (2*vb8);
    VARUB24=VB7+VB19 - (2*VB9);
    VARUB25=VB7+VB25 - (2*VB10);
    VARUB34=VB13+VB19 - (2*VB14);
    VARUB35=VB13+VB25 - (2*VB15);
    varub45=vb19+vb25 - (2*vb20);
 %IF &MULTCOMP=0 %THEN %DO;
      d12=abs(ubarj1-ubarj2)/(sqrt(varub12/2));
      d13=abs(ubarj1-ubarj3)/(sqrt(varub13/2));
      d14=abs(ubarj1-ubarj4)/(sqrt(varub14/2));
      d15=abs(ubarj1-ubarj5)/(sqrt(varub15/2));
      d23=abs(ubarj2-ubarj3)/(sqrt(varub23/2));
      d24=abs(ubarj2-ubarj4)/(sqrt(varub24/2));
      d25=abs(ubarj2-ubarj5)/(sqrt(varub25/2));
      d34=abs(ubarj3-ubarj4)/(sqrt(varub34/2));
      d35=abs(ubarj3-ubarj5)/(sqrt(varub35/2));
      d45=abs(ubarj4-ubarj5)/(sqrt(varub45/2));

proc print label noobs split='*';
  var varub12 varub13 varub14 varub15 varub23 varub24 varub25 varub34
  varub35 varub45;
     LABEL VARUB12='VARIANCE*(MCR1-MCR2)';
     LABEL VARUB13='VARIANCE*(MCR1-MCR3)';
     LABEL VARUB14='VARIANCE*(MCR1-MCR4)';
     LABEL VARUB15='VARIANCE*(MCR1-MCR5)';
     LABEL VARUB23='VARIANCE*(MCR2-MCR3)';
     LABEL VARUB24='VARIANCE*(MCR2-MCR4)';
     LABEL VARUB25='VARIANCE*(MCR2-MCR5)';
     LABEL VARUB34='VARIANCE*(MCR3-MCR4)';
     LABEL VARUB35='VARIANCE*(MCR3-MCR5)';
     LABEL VARUB45='VARIANCE*(MCR4-MCR5)';
TITLE 'VARIANCES of the DIFFERENCES of the MEAN CENTERED RANKS(MCR)';
title2 'These variances should be equal or nearly equal';
title3 ' ';
proc print label noobs;
  var d12 d13 d14 d15 d23 d24 d25 d34 d35 d45;
  label d12='D1,2 for group 1 vs 2';
  label d13='D1,3 for group 1 vs 3';
  label d14='D1,4 for group 1 vs 4';
  label d15='D1,5 for group 1 vs 5';
  label d23='D2,3 for group 2 vs 3';
  label d24='D2,4 for group 2 vs 4';
  label d25='D2,5 for group 2 vs 5';
  label d34='D3,4 for group 3 vs 4';
  label d35='D3,5 for group 3 vs 5';
  label d45='D4,5 for group 4 vs 5';
title  'RESULTING STATISTICS FROM MULTIPLE COMPARISONS AMONG GROUPS';
title2 '0.05 and .01 critical values of 3.858 and 4.603';
title3 'These Critical Values Control the TYPE I EXPERIMENTWISE ERROR';
title4 'Rate using a TUKEY-KRAMER Procedure (see Miller,1981 p. 177).';
title5 ' ';
  %END;
  %ELSE %DO;
      d12=abs(ubarj1-ubarj2)/(sqrt(varub12));
      d13=abs(ubarj1-ubarj3)/(sqrt(varub13));
      d14=abs(ubarj1-ubarj4)/(sqrt(varub14));
      d15=abs(ubarj1-ubarj5)/(sqrt(varub15));
      d23=abs(ubarj2-ubarj3)/(sqrt(varub23));
      d24=abs(ubarj2-ubarj4)/(sqrt(varub24));
      d25=abs(ubarj2-ubarj5)/(sqrt(varub25));
      d34=abs(ubarj3-ubarj4)/(sqrt(varub34));
      d35=abs(ubarj3-ubarj5)/(sqrt(varub35));
      d45=abs(ubarj4-ubarj5)/(sqrt(varub45));

proc print label noobs split='*';
var varub12 varub13 varub14 varub15 varub23 varub24 varub25 varub34
    varub35 varub45;
     LABEL VARUB12='VARIANCE*(MCR1-MCR2)';
     LABEL VARUB13='VARIANCE*(MCR1-MCR3)';
     LABEL VARUB14='VARIANCE*(MCR1-MCR4)';
     LABEL VARUB15='VARIANCE*(MCR1-MCR5)';
     LABEL VARUB23='VARIANCE*(MCR2-MCR3)';
     LABEL VARUB24='VARIANCE*(MCR2-MCR4)';
     LABEL VARUB25='VARIANCE*(MCR2-MCR5)';
     LABEL VARUB34='VARIANCE*(MCR3-MCR4)';
     LABEL VARUB35='VARIANCE*(MCR3-MCR5)';
     LABEL VARUB45='VARIANCE*(MCR4-MCR5)';
TITLE 'VARIANCES of the DIFFERENCES of the MEAN CENTERED RANKS(MCR)';
title2 'These variances should be equal or nearly equal';
title3 ' ';
proc print label noobs;
var d12 d13 d14 d15 d23 d24 d25 d34 d35 d45;
label d12='D1,2 for group 1 vs 2';
label d13='D1,3 for group 1 vs 3';
label d14='D1,4 for group 1 vs 4';
label d15='D1,5 for group 1 vs 5';
label d23='D2,3 for group 2 vs 3';
label d24='D2,4 for group 2 vs 4';
label d25='D2,5 for group 2 vs 5';
label d34='D3,4 for group 3 vs 4';
label d35='D3,5 for group 3 vs 5';
label d45='D4,5 for group 4 vs 5';
title  'RESULTING STATISTICS FROM MULTIPLE COMPARISONS AMONG GROUPS';
title2 '0.05 and 0.01 critical values of 2.81 and 3.29';
title3 'These Critical Values Control the TYPE I EXPERIMENTWISE ERROR';
title4 'Rate using a BONFERRONI Procedure (see Woolson,1987, p. 371)';
title5 ' ';

  %END;

%mend create5;

%macro analyze;
%if &maxtrt=2 %then %do;
%create2
%end;
%if &maxtrt=3 %then %do;
%create3
%end;
%if &maxtrt=4 %then %do;
%create4
%end;
%if &maxtrt=5 %then %do;
%create5
%end;
%mend analyze;

%analyze
run;
%MEND BENARD;
