/* Appendix 1 -- COMBO MACRO -- Updated 3 Nov 95 */
/********************/
/* COMBO MACRO */
/********************/
%macro combo (n,r);
data combo;
keep v1-v&r n r;
array word (*) w1-w&n;
array rr (*) r1-r&r;
array v $8 v1-v&r;
n = &n; r = &r;
%do i = 1 %to &n; w&i=&i;
%end;
%do i=1 %to &r;
%if &i = 1 %then %do;
do r&i=1to &n-(&r-&i);
%end;
%else %do;
do r&i = r%eval(&i-1)+1 to &n-(&r-&i);
%end;
%end;
do k=1 to &r;
v(k)=word (rr(k));
end;
output;
%do i=1 %to &r;
end;
%end;
run;
%mend combo;
/***********************************/
/* CREATE GLOBAL MACRO VARIABLES */
/***********************************/
%global n r tot m1 m2 md lxp rxp xpb;
/******************************/
/* RANDOMIZATION TEST MACRO */
/******************************/
%macro rmtest (dset,group,code1,code2,score);
%let n=;
%let r=;
%let tot=;
%let m1=;
%let m2=;
%let md=;
%let tot=;
%let lxp=0;
%let rxp=0;
%let xpb=0;
proc sort data=&dset;
by &group;
run;
data &dset;
set &dset;
nn + 1;sumtot + &score;
run;
/* REGULAR T-TEST RESULTS */
proc ttest data=&dset;
title "RESULTS OF";
class &group;
var &score;
run;
data numbers;
set &dset;
by &group;
if first.&group then do;
sumgrp=0;
ng = 0;
end;
sumgrp + &score;ng + 1;
if (last.&group and &group = &code1) then do;
call symput('r',left(nn)); * get the number in first group;
call symput('s1',left(sumtot)); * get sum of scores in first group;
mn1 = sumgrp/ng;
call symput('m1',left(mn1));
end;
if (last.&group and &group = &code2) then do;
call symput('n',left(nn)); * get total number in both groups;
call symput('tot',left(sumtot)); * get sum of scores in both groups;
mn2 = sumgrp/ng;
mdiff = (sumgrp)/(ng)-(sumtot-sumgrp)/(nn-ng);
call symput('m2',left(mn2));
call symput('md',left(mdiff));
end;
run;
proc transpose data=&dset out=trtest;
var &score;
run;
/* INVOKE COMBO MACRO TO GENERATE ALL POSSIBLE ARRANGEMENTS */
%combo (&n,&r);
/* COMPUTE GROUP MEANS AND DIFFERENCE BETWEEN GROUP MEANS */
/* FOR EACH ARRANGEMENT */
data trtest (drop=_name_ sum1 i);
if _n_ = 1 then set trtest;
set combo;
array scores (*) col1-col&n;
array v (*) v1-v&r;
sum1 = 0; totsum = 0;
do i = 1 to &n;
if i le &r then sum1=sum1+scores{v{i}};
totsum=totsum+scores{i};
end;
mean1 = sum1/&r;
mean2 = (&tot-sum1)/(&n-&r);
mdiff = mean2 - mean1;
run;
/* Save some space */
proc datasets lib=work;
delete combo;
run;
quit;
/* MAKE FREQUENCY DISTRIBUTION OF MEAN DIFFERENCES */
/* There has been a slight modification to this section. */
/* Instead of using PROC FREQ as published, PROC SUMMARY */
/* is used in its place to overcome a limitation of PROC FREQ. */
proc summary data=trtest nway;
class mdiff;
output out=fdiff;
run;
data _null_;
set trtest end=last;
if last then call symput ('ntotal',_n_);
run;
/* Save some more space */
proc datasets lib=work;
delete numbers trtest;
run;
quit;
data fdiff(keep=mdiff _freq_ percent cumperct);
set fdiff;
percent=100* _freq_/ &ntotal;
if _n_ = 1 then cumperct = percent;
else cumperct + percent;
run;
proc print data=fdiff;
title 'Distribution Of Difference Between Means Under Random Assignment';
title2 "Observed Difference Between Group Means (Group 2 - Group 1) Equals &md
";
run;
title;
/* RESTRICT DISTRIBUTION TO TAILS */
data tails;
set fdiff;
if mdiff lt 0 then sign = -1;
else sign = 1;
percent = percent/100;
if round(abs(mdiff),.001) ge round(abs(&md),.001);
run;
/* Save a little more space */
proc datasets lib=work;
delete fdiff;
run;
quit;
proc sort data=tails;
by sign;
run;
data tails;
set tails;
by sign;
if first.sign then sump = percent;
else sump+percent;
run;
data prob;
set tails;
by sign;
if last.sign;
if sign = -1 then do;
low=sump;
call symput('lxp',left(sump));
end;
if sign = 1 then do;
high=sump;
call symput('rxp',left(sump));
end;
if (sign lt 0 and low = .) then call symput ('lxp',0);
if (sign gt 0 and high= .) then call symput ('rxp',0);
run;
data p;
set prob end=last;
xpb +sump;
call symput('xpb',left(xpb));
if last;
run;
title ' ';
/* PRINT RESULTS OF RANDOMIZATION TEST */
data _null_;
file print;
put _page_;
put " RESULTS OF";
put " RANDOMIZATION TEST";
put ' ';
put "Observed Difference Between Group Means (Group 2 - Group 1) Equals &md";
put ' ';
put " Tail Probabilities Under Randomization:";
put " P1: p <= -|&md| = &lxp";
put " P2: p >= +|&md| = &rxp";
put " p3: Two-tail p = &xpb";
put " ";
run;
/* Clean up work space */
proc datasets library=work;
delete tails prob p;
run;
quit;
%mend rmtest;