*****************************************************************************;
*                                                                          *;
*  HAYSPOWEM.SAS:  Hays' power macro written in SAS.                      *;
*                                            *;
*  Original program written in BASIC by Ron Hays, 1996.                    *;
*  see:                                                                    *;
http://www.gim.med.ucla.edu/FacultyPages/Hays/util.htm (hayspowe.bas)  *;
*                                                            *;
*                                                            *;
*  This program, HAYSPOWEM.SAS, was written by Karen Spritzer              *;
*  for SAS 8.0, 3/22/2004.                                                *;
*  Modified on 8/23/2004.                                                  *;
*  Link to code is:                                                        *;
http://www.gim.med.ucla.edu/FacultyPages/Hays/util.htm (hayspowem.sas)  *;
*                                                                          *;
*  NOTES: do not alter code in the macro - only modify the macro call.    *;
*  The macro allows up to 10 scales and a sample call to the              *;
*  macro is at the bottom of the code.                                    *;
*  Note that in the program, scale names > 20 characters are truncated    *;
*  to 20 to keep table columns in line in the output.                      *;
*                                                                          *;
*****************************************************************************;

/*********** DO NOT MODIFY ANYTHING BETWEEN "%MACRO HAYSPOWEM" AND "&MEND HAYSPOWEM" ***********/

%MACRO HAYSPOWEM(
TITLE=,
sd1=,sd2=,sd3=,sd4=,sd5=,sd6=,sd7=,sd8=,sd9=,sd10=,
nscal1=,nscal2=,nscal3=,nscal4=,nscal5=,nscal6=,nscal7=,nscal8=,nscal9=,nscal10=,
nscales=,outfile=);

proc sql;
  create table temp
      (sd num,
        scale char(30));

  insert into temp
    values(&sd1, &nscal1)
    values(&sd2, &nscal2)
    values(&sd3, &nscal3)
    values(&sd4, &nscal4)
    values(&sd5, &nscal5)
    values(&sd6, &nscal6)
    values(&sd7, &nscal7)
    values(&sd8, &nscal8)
    values(&sd9, &nscal9)
    values(&sd10,&nscal10);

data temp; set temp;
scale=substr(scale,1,20);
if _N_ <= &nscales;
run;

/**** TABLE 1 ****/

data _null_; file "&outfile";

put &TITLE /
"                                                                    " /
"                                                                    " /
"Table 1: Sample sizes needed per group to detect differences          " /
"between two experimental groups, repeated measures design.          " /
"                                                                    " /
"                                              Number of Points Difference" /
"Scale Name              R      SD    VAR          2      5    10    20 " /
"_________________________________________________________________________    ";
run;

data _null_; file "&outfile" mod; set temp;
r=.60;
rsquare=r*r;
var=sd*sd;

two  =15.68*var*(1-rsquare)/  4;
five  =15.68*var*(1-rsquare)/ 25;
ten  =15.68*var*(1-rsquare)/100;
twenty=15.68*var*(1-rsquare)/400;

put scale +1 @23 r 4.2 @30 sd 5.2 @37 var 7.2 @46 two 7.0 @53 five 7.0 @60 ten 7.0 @67 twenty 7.0;

run;

data _null_; file "&outfile" mod;

put //
"_______________________________________________________________    " /
"                                                                    " /
"Note: Estimates assume alpha = 0.05, two-tailed t-test, power = 80%, " /
"and an intertemporal correlation between scores of 0.60.            " /
"                                                                    " /
"                                                                    " /;

/**** TABLE 2 ****/

data _null_; file "&outfile" mod;

put &TITLE /
"                                                                    " /
"                                                                    " /
"Table 2: Sample sizes needed per group to detect differences          " /
"between two experimental groups, post-intervention measures only.    " /
"                                                                    " /
"                                              Number of Points Difference" /
"Scale Name                    SD    VAR          2      5    10    20 " /
"_________________________________________________________________________    ";
run;

data _null_; file "&outfile" mod; set temp;
r=.60;
rsquare=r*r;
var=sd*sd;

two2  =15.68*var/  4;
five2  =15.68*var/ 25;
ten2  =15.68*var/100;
twenty2=15.68*var/400;

put scale +1          @30 sd 5.2 @37 var 7.2 @46 two2 7.0 @53 five2 7.0 @60 ten2 7.0 @67 twenty2 7.0;

run;

data _null_; file "&outfile" mod;

put //
"_______________________________________________________________    " /
"                                                                    " /
"Note: Estimates assume alpha = 0.05, two-tailed t-test, and power = 80%.  "/
"                                                                    " /;

/**** TABLE 3 ****/

data _null_; file "&outfile" mod;

put  &TITLE /
"                                                                    " /
"                                                                    " /
"Table 3: Sample sizes needed per group to detect differences          " /
"between two self-selected groups, repeated measures design.    " /
"                                                                    " /
"                                              Number of Points Difference" /
"Scale Name              R      SD    VAR          2      5    10    20 " /
"_________________________________________________________________________    ";
run;

data _null_; file "&outfile" mod; set temp;
r=.60;
rsquare=r*r;
var=sd*sd;

two3  =15.68*var*2*(1-r)/  4;
five3  =15.68*var*2*(1-r)/ 25;
ten3  =15.68*var*2*(1-r)/100;
twenty3=15.68*var*2*(1-r)/400;

put scale +1 @23 r 4.2 @30 sd 5.2 @37 var 7.2 @46 two3 7.0 @53 five3 7.0 @60 ten3 7.0 @67 twenty3 7.0;

run;

data _null_; file "&outfile" mod;

put //
"_______________________________________________________________    " /
"                                                                    " /
"Estimates assume alpha = 0.05, two-tailed t-test, power = 80%,  " /
"and an intertemporal correlation between scores of 0.60.                    " /
"                                                                    " /
"                                                                    " /;
run;

/*********** END OF "MACRO" ***********/

%MEND HAYSPOWEM;

** Here's the macro call;
** it wants the TITLE,
  # of scales to expect,
  the SD/Name for each scale, and
  the file to write the results to;

/** example **/

%hayspowem(
TITLE="Power call for RCMAR study",
nscales=3,
sd1=20.10,nscal1="PHYSICAL FUNCTIONING",
sd2=5.4  ,nscal2="EMOTIONAL WELL-BEING is a very long title",
sd3=30  ,nscal3="SOCIAL FUNCTIONING",
sd4=4    ,nscal4="scale4",
sd5=5    ,nscal5="scale5",
sd6=6    ,nscal6="scale6",
sd7=7    ,nscal7="scale7",
sd8=8    ,nscal8="scale8",
sd9=9    ,nscal9="scale9",
sd10=10  ,nscal10="scale10",
outfile=hayspowe.out);