A New View of Statistics Go to: Previous · Contents · Search · Home
On The Fly for the Effect-Size Statistic in
LONGITUDINAL STUDIES WITH A CONTROL GROUP

Once again I will assume known population SD.
See previous program (longitudinal study with no control group) for preamble.

```
options linesize=75;
options pagesize=40;

%macro data;
data dat1;
do trial=1 to &trialn;
do id=1 to &startn/2;
true=rannor(0);
con1=sqrt(&r)*true+sqrt(1-&r)*rannor(0);
con2=sqrt(&r)*true+sqrt(1-&r)*rannor(0);
true=rannor(0);
exp1=sqrt(&r)*true+sqrt(1-&r)*rannor(0);
exp2=sqrt(&r)*true+sqrt(1-&r)*rannor(0)+&es;
ydiff=exp2-exp1-(con2-con1);
output;
end;
end;
keep trial ydiff;

%mend;

%let trialn=1000; *no. of trials;
%let r=0.9; *reliability;
%let es=0.4; *effect size;
%let startn=20; *initial size (=startn/2 in each group);
%let nmax1=40; *total size limit for 1st interation;
%let nmax2=80; *total size limit for 2nd interation;
%data;

data dat0;
set;
dataset="initial";

proc means noprint data=dat1;
var ydiff;
output out=dat n=n mean= std=stdydiff;
by trial;

data dat2;
set;
iter=1;
samplees=ydiff; *denom=1;
confint=2*1.96*stdydiff/sqrt(n);
cipred = 3.575348E-3*samplees**4 + 1.565327E-1*samplees**2 + 4.015905E-1;
if cipred<confint then do;
nnew=round(n*(confint/cipred)**2)-n;
if nnew then do;
if nnew+n>&nmax1/2 then nnew=&nmax1/2-n;
do id=n+1 to nnew+n;
true=rannor(0);
con1=sqrt(&r)*true+sqrt(1-&r)*rannor(0);
con2=sqrt(&r)*true+sqrt(1-&r)*rannor(0);
true=rannor(0);
exp1=sqrt(&r)*true+sqrt(1-&r)*rannor(0);
exp2=sqrt(&r)*true+sqrt(1-&r)*rannor(0)+&es;
ydiff=exp2-exp1-(con2-con1);
output;
end;
end;
end;
keep trial ydiff id nnew iter;

*proc print;
*run;

/*
*checks formulae;
proc univariate noprint;
var samplees;
output mean=mean pctlpre=Q pctlpts=2.5 50 97.5;
title "Sampling distn for es in x-over, r=&r es=&es n=&startn";
title2 "for sample effect size";

proc print;

proc means mean std min max maxdec=2 data=dat2;
var samplees crrctes confint cipred;
title "Stats for es in x-over, r=&r es=&es n=&startn";
title2 "for Becker-derived es and its confidence interval";

run;
*/

*2nd iteration;

data dat1;
set dat1 dat2;

proc sort;
by trial;

*proc print;
*run;

proc means noprint data=dat1;
var ydiff;
output out=dat n=n mean= std=stdydiff;
by trial;

data dat2;
set;
iter=2;
samplees=ydiff; *denom=1;
confint=2*1.96*stdydiff/sqrt(n);
cipred = 3.575348E-3*samplees**4 + 1.565327E-1*samplees**2 + 4.015905E-1;
if cipred<confint then do;
nnew=round(n*(confint/cipred)**2)-n;
if nnew then do;
if nnew+n>&nmax2/2 then nnew=&nmax2/2-n;
do id=n+1 to nnew+n;
true=rannor(0);
con1=sqrt(&r)*true+sqrt(1-&r)*rannor(0);
con2=sqrt(&r)*true+sqrt(1-&r)*rannor(0);
true=rannor(0);
exp1=sqrt(&r)*true+sqrt(1-&r)*rannor(0);
exp2=sqrt(&r)*true+sqrt(1-&r)*rannor(0)+&es;
ydiff=exp2-exp1-(con2-con1);
output;
end;
end;
end;
keep trial ydiff id nnew iter;

*3nd iteration;

data dat1;
set dat1 dat2;

proc sort;
by trial;

proc means noprint data=dat1;
var ydiff;
output out=dat n=n mean= std=stdydiff;
by trial;

data dat2;
set;
iter=3;
samplees=ydiff; *denom=1;
confint=2*1.96*stdydiff/sqrt(n);
cipred = 3.575348E-3*samplees**4 + 1.565327E-1*samplees**2 + 4.015905E-1;
if cipred<confint then do;
nnew=round(n*(confint/cipred)**2)-n;
if nnew then do;
do id=n+1 to nnew+n;
*    if nnew+n>&nmax2/2 then nnew=&nmax2/2-n;
true=rannor(0);
con1=sqrt(&r)*true+sqrt(1-&r)*rannor(0);
con2=sqrt(&r)*true+sqrt(1-&r)*rannor(0);
true=rannor(0);
exp1=sqrt(&r)*true+sqrt(1-&r)*rannor(0);
exp2=sqrt(&r)*true+sqrt(1-&r)*rannor(0)+&es;
ydiff=exp2-exp1-(con2-con1);
output;
end;
end;
end;
keep trial ydiff id nnew iter;

*output results;

data dat1;
set dat1 dat2;
dataset="final";

data datboth;
set dat0 dat1;

proc sort;
by dataset trial;

proc means noprint data=datboth;
var ydiff;
output out=dat n=n mean= std=stdydiff;
by dataset trial;

data dat2;
set;
samplees=ydiff; *denom=1;
confint=2*1.96*stdydiff/sqrt(n);
confliml=samplees-confint/2;
conflimu=samplees+confint/2;

proc means noprint;
var n samplees confint confliml conflimu;
by dataset;
output mean=;

proc print noobs;
var dataset n samplees confint confliml conflimu;
format _numeric_ 5.2 n 4.;
title "ES stats rely=&r es=&es startn=&startn trials=&trialn nmax1=&nmax1 nmax2=&nmax2";
title2 "N is the final number in EACH group";
title3 "for controlled longitudinal study";

data datfinal;
set dat2;
if dataset="final";

proc univariate noprint;
var samplees ;
output mean=mean pctlpre=Q pctlpts=2.5 50 97.5;

proc print noobs;
format _numeric_ 5.2;
title "Sampling distn for es, r=&r es=&es n=&startn";
title2 "for final sample effect size";

proc means mean std min max maxdec=0 data=datfinal;
var n;
title "Stats for final sample size  r=&r es=&es n=&startn nmax1=&nmax1 nmax2=&nmax2";
title2 "N is the final number in EACH group";

proc sort data=dat1;
by trial iter;

proc means noprint;
var nnew;
output mean=;
by trial iter;

proc sort;
by iter;

proc means noprint;
var nnew;
by iter;
output n=n mean= std=std min=min max=max;

data;
set;
if iter;

proc print noobs;
var iter n nnew std min max;
format _numeric_ 5.0;
title "Number of extra observations at each iteration in EACH group";
title2 "for rely=&r es=&es startn=&startn";

run;```

Go to: Previous · Contents · Search · Home