I need to write code to create a reproducible randomization scheme for a three site clinical trial. At each site, the randomization is 1:1 treatment:control but in blocks of 6. 24 subjects are assigned to each site. In other words, there are a total of 72 subjects, 24 subjects randomly assigned to each site, 4 blocks with a size of 6 at each site, with 3 treatment subjects and 3 control subjects within each block. The code has to be reproducible in a sense that you can change the number of sites, number of subjects per site, number of blocks, size of blocks and the ratio of control to treatment.
I am fine with randomly assigning subjects to different sites. Where I struggle is randomly assigning subjects within each site to blocks with a ratio of treatment to control. For some reason, when I run the code to assign subjects to blocks with treatment and control, each subject within each site produces 24 observations (4 blocks of 6). So a total of 576 observations in each site. What I am trying to accomplish is randomly assigning each subject within a site to one of 4 blocks of 6 with 3 treatment and 3 control subjects in each block (or whatever the specified block size or treatment/control ratio is).
Here is what I have so far:
data values;
nsites=3;
subjectspersite=24;
samplesize=(nsites*subjectspersite);
blocksize=6;
TreatmentR=1;
nblocks=round((subjectspersite)/(blocksize));
na=round(blocksize/(1/(treatmentR/(1+treatmentR))));
nb=blocksize-na;
run;
data values1;
set values;
DO Subject = 1 to (samplesize) by 1;
OUTPUT;
END;
RUN;
DATA values2;
set values1;
random=ranuni(27407349);
RUN;
PROC SORT data=values2;
by random;
RUN;
PROC FORMAT;
value siteno 1 = 'Site 1'
2 = 'Site 2'
3 = 'Site 3'
4 = 'Site 4'
5 = 'Site 5'
6 = 'Site 6'
7 = 'Site 7'
8 = 'Site 8'
9 = 'Site 9'
10 = 'Site 10';
RUN;
data values3;
set values2;
if nsites=1 then site=1;
if _N_ le ((1/nsites)*samplesize) and nsites=2 then site=1;
else if _ gt ((1/nsites)*samplesize) and nsites=2 then site=2;
if _N_ le ((1/nsites)*samplesize) and nsites=3 then site=1;
else if _N_ gt ((1/nsites)*samplesize) and _N_ le ((2/nsites)*samplesize) then site=2;
else if _N_ gt ((2/nsites)*samplesize) then site=3;
if _N_ le ((1/nsites)*samplesize) and nsites=4 then site=1;
else if _N_ gt ((1/nsites)*samplesize) and _N_ le ((2/nsites)*samplesize) then site=2;
else if _N_ gt ((2/nsites)*samplesize) and _N_ le ((3/nsites)*samplesize) then site=3;
else if _N_ gt((3/nsites)*samplesize) then site=4;
if _N_ le ((1/nsites)*samplesize) and nsites=5 then site=1;
else if _N_ gt ((1/nsites)*samplesize) and _N_ le ((2/nsites)*samplesize) then site=2;
else if _N_ gt ((2/nsites)*samplesize) and _N_ le ((3/nsites)*samplesize) then site=3;
else if _N_ gt((3/nsites)*samplesize) and _N_ le ((4/nsites)*samplesize) then site=4;
else if _N_ gt((4/nsites)*samplesize) then site=5;
if _N_ le ((1/nsites)*samplesize) and nsites=6 then site=1;
else if _N_ gt ((1/nsites)*samplesize) and _N_ le ((2/nsites)*samplesize) then site=2;
else if _N_ gt ((2/nsites)*samplesize) and _N_ le ((3/nsites)*samplesize) then site=3;
else if _N_ gt((3/nsites)*samplesize) and _N_ le ((4/nsites)*samplesize) then site=4;
else if _N_ gt((4/nsites)* samplesize) and _N_ le ((5/nsites)*samplesize) then site=5;
else if _N_ gt((5/nsites)*samplesize) then site=6;
if _N_ le ((1/nsites)*samplesize) and nsites=7 then site=1;
else if _N_ gt ((1/nsites)*samplesize) and _N_ le ((2/nsites)*samplesize) then site=2;
else if _N_ gt ((2/nsites)*samplesize) and _N_ le ((3/nsites)*samplesize) then site=3;
else if _N_ gt((3/nsites)*samplesize) and _N_ le ((4/nsites)*samplesize) then site=4;
else if _N_ gt((4/nsites)* samplesize) and _N_ le ((5/nsites)*samplesize) then site=5;
else if _N_ gt((5/nsites)*samplesize) and _N_ le ((6/nsites)*samplesize) then site=6;
else if _N_ gt((6/nsites)*samplesize)then site=8;
if _N_ le ((1/nsites)*samplesize) and nsites=8 then site=1;
else if _N_ gt ((1/nsites)*samplesize) and _N_ le ((2/nsites)*samplesize) then site=2;
else if _N_ gt ((2/nsites)*samplesize) and _N_ le ((3/nsites)*samplesize) then site=3;
else if _N_ gt((3/nsites)*samplesize) and _N_ le ((4/nsites)*samplesize) then site=4;
else if _N_ gt((4/nsites)* samplesize) and _N_ le ((5/nsites)*samplesize) then site=5;
else if _N_ gt((5/nsites)*samplesize) and _N_ le ((6/nsites)*samplesize) then site=6;
else if _N_ gt((6/nsites)*samplesize) and _N_ le ((7/nsites)*samplesize) then site=7;
else if _N_ gt((7/nsites)*samplesize) then site=8;
if _N_ le ((1/nsites)*samplesize) and nsites=9 then site=1;
else if _N_ gt ((1/nsites)*samplesize) and _N_ le ((2/nsites)*samplesize) then site=2;
else if _N_ gt ((2/nsites)*samplesize) and _N_ le ((3/nsites)*samplesize) then site=3;
else if _N_ gt((3/nsites)*samplesize) and _N_ le ((4/nsites)*samplesize) then site=4;
else if _N_ gt((4/nsites)* samplesize) and _N_ le ((5/nsites)*samplesize) then site=5;
else if _N_ gt((5/nsites)*samplesize) and _N_ le ((6/nsites)*samplesize) then site=6;
else if _N_ gt((6/nsites)*samplesize) and _N_ le ((7/nsites)*samplesize) then site=7;
else if _N_ gt((7/nsites)*samplesize) and _N_ le ((8/nsites)*samplesize) then site=8;
else if _N_ gt((8/nsites)*samplesize) then site=9;
if _N_ le ((1/nsites)*samplesize) and nsites=10 then site=1;
else if _N_ gt ((1/nsites)*samplesize) and _N_ le ((2/nsites)*samplesize) then site=2;
else if _N_ gt ((2/nsites)*samplesize) and _N_ le ((3/nsites)*samplesize) then site=3;
else if _N_ gt((3/nsites)*samplesize) and _N_ le ((4/nsites)*samplesize) then site=4;
else if _N_ gt((4/nsites)* samplesize) and _N_ le ((5/nsites)*samplesize) then site=5;
else if _N_ gt((5/nsites)*samplesize) and _N_ le ((6/nsites)*samplesize) then site=6;
else if _N_ gt((6/nsites)*samplesize) and _N_ le ((7/nsites)*samplesize) then site=7;
else if _N_ gt((7/nsites)*samplesize) and _N_ le ((8/nsites)*samplesize) then site=8;
else if _N_ gt((8/nsites)*samplesize) and _N_ le ((9/nsites)*samplesize) then site=9;
else if _N_ gt((9/nsites)*samplesize) then site=10;
format site siteno.;
run;
PROC SORT data=values3;
by site;
RUN;
data sites1 sites2 sites3 sites4 sites5 sites6 sites7 sites8 sites9 sites10;
set values3;
if nsites=1 then output sites1;
else if nsites=2 then output sites2;
else if nsites=3 then output sites3;
else if nsites=4 then output sites4;
else if nsites=5 then output sites5;
else if nsites=6 then output sites6;
else if nsites=7 then output sites7;
else if nsites=8 then output sites8;
else if nsites=9 then output sites9;
else if nsites=10 then output sites10;
run;
Data site1of1;
set sites1;
if site=1 then output site1of1;
run;
data site1of2 site2of2;
set sites2;
if site=1 then output site1of2;
else if site=2 then output site2of2;
run;
data site1of3 site2of3 site3of3;
set sites3;
if site=1 then output site1of3;
else if site=2 then output site2of3;
else if site=3 then output site3of3;
run;
data site1of4 site2of4 site3of4 site4of4;
set sites4;
if site=1 then output site1of4;
else if site=2 then output site2of4;
else if site=3 then output site3of4;
else if site=4 then output site4of4;
run;
data site1of5 site2of5 site3of5 site4of5 site5of5;
set sites5;
if site=1 then output site1of5;
else if site=2 then output site2of5;
else if site=3 then output site3of5;
else if site=4 then output site4of5;
else if site=5 then output site5of5;
run;
data site1of6 site2of6 site3of6 site4of6 site5of6 site6of6;
set sites6;
if site=1 then output site1of6;
else if site=2 then output site2of6;
else if site=3 then output site3of6;
else if site=4 then output site4of6;
else if site=5 then output site5of6;
else if site=6 then output site6of6;
run;
data site1of7 site2of7 site3of7 site4of7 site5of7 site6of7 site7of7;
set sites7;
if site=1 then output site1of7;
else if site=2 then output site2of7;
else if site=3 then output site3of7;
else if site=4 then output site4of7;
else if site=5 then output site5of7;
else if site=6 then output site6of7;
else if site=7 then output site7of7;
run;
data site1of8 site2of8 site3of8 site4of8 site5of8 site6of8 site7of8 site8of8;
set sites8;
if site=1 then output site1of8;
else if site=2 then output site2of8;
else if site=3 then output site3of8;
else if site=4 then output site4of8;
else if site=5 then output site5of8;
else if site=6 then output site6of8;
else if site=7 then output site7of8;
else if site=8 then output site8of8;
run;
data site1of9 site2of9 site3of9 site4of9 site5of9 site6of9 site7of9 site8of9 site9of9;
set sites9;
if site=1 then output site1of9;
else if site=2 then output site2of9;
else if site=3 then output site3of9;
else if site=4 then output site4of9;
else if site=5 then output site5of9;
else if site=6 then output site6of9;
else if site=7 then output site7of9;
else if site=8 then output site8of9;
else if site=9 then output site9of9;
run;
data site1of10 site2of10 site3of10 site4of10 site5of10 site6of10 site7of10 site8of10 site9of10 site10of10;
set sites10;
if site=1 then output site1of10;
else if site=2 then output site2of10;
else if site=3 then output site3of10;
else if site=4 then output site4of10;
else if site=5 then output site5of10;
else if site=6 then output site6of10;
else if site=7 then output site7of10;
else if site=8 then output site8of10;
else if site=9 then output site9of10;
else if site=10 then output site10of10;
run;
proc print data=site1of3;
run;
data treatmentsite1of3;
set site1of3;
do block=1 to nblocks by 1;
nna=0;
nnb=0;
do i=1 to blocksize;
subject2=i+((block-1)*blocksize);
if nna=na then treatment="B";
if nnb=nb then treatment="A";
else do;
aprob=(na-nna)/(na+nb-nna-nnb);
u=ranuni(0);
if (0<=u<=aprob) then do;
treatment="A";
nna=nna+1;
end;
if (aprob<u<=1) then do;
treatment="B";
nnb=nnb+1;
end;
end;
keep subject2 treatment site subject site nblocks block;
output;
end;
end;
run;
proc print data=treatmentsite1of3;
id subject2;
var treatment site subject block;
title1 'Site 1 of 3 sites';
title2 "Randomization Schema for Specified Ratio of Treatments A to Control B";
run;
Any help would be greatly appreciated. Also, Any correction or suggestions with my current code would be extremely helpful.
Thank you.