- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
Hello -
I have a sample of 60 units that need to be randomized to treatment and control (30 and 30). However, I have several subgroups I want to block on, such that the units within them are randomized within the subgroups. There should be .5 probability of randomization within each block. I would like an outcome roughly like this:
Group1 (6 units): 3T, 3C
Group2 (10 units): 5T, 5C
Group3 (6 units): 3T, 3C
Group4 (38 units): 19T, 19C
I am not sure how to code for this. I was thinking of something along these lines, but this doesn't seem to be quite right:
PROC SURVEYSELECT DATA=mysample method = sys rate = 0.5 seed = 11235813 out=OUTFILE outall;
STRATA Group1 Group2 Group3 Group4;
Run;
DATA assignment; SET OUTFILE;
SamplingWeight GT 0 THEN GROUP = 'TREATMENT';
SamplingWeight EQ 0 THEN GROUP = 'CONTROL';
RUN;
A second question is how I should set up my data file to facilitate this. I currently have binary indicator variables for each subgroup. How do I write the code to ensure that only the 1s for a given subgroup are randomized within that block?
I realize this is a complex question. I appreciate any suggestions.
Thanks.
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
Assign a random number R to each unit. Sort your units by Group and R. Take the first 3 units for Group 1 T, the next 3 for Group 1 C, the next 5 for Group 2 T, and so on. The assignment will be perfectly random within each Group.
PG
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
One simple way to do this is with dataset interleaving :
/* Define groups treatments and units, unrandomized */
data units;
input grp trt $ id $ @@;
datalines;
1 C A 1 C B 1 C C
1 T D 1 T E 1 T F
2 C G 2 C H 2 C I 2 C J 2 C K
2 T L 2 T M 2 T N 2 T O 2 T P
;
/* Make sure the order is well defined */
proc sort data=units; by grp trt; run;
/* Assign a random number to every unit */
data randomIds;
call streamInit(233434);
set units;
ran = rand("UNIFORM");
keep grp id ran;
run;
/* Sort random numbers (i.e. randomize units) within every group */
proc sort data=randomIds; by grp ran; run;
/* Interleave units and random assignment */
data assign;
set units;
set randomIds;
drop ran;
run;
proc print data=assign noobs; run;
PG
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
Thank you. I like this suggestion for its simplicity. One possibly minor issue with it is that (while I did not explain this above) some of groups have odd numbers of units -- a decision will have to be made as to whether the final unit in those groups is assigned to T or C. I feel that this introduces some degree of bias.
I wonder if there is a way to use the process you have described above, but to have SAS assign the last unit in the subgroups that have odd numbers of units?
I really appreciate this help. I am a fairly new SAS user and I have not used it for this purpose before.
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
Remember, YOU define the design in the initial step. So you could have an entry in a group have TRT="D" (instead of "C" or "T") and then drop the unit that ends up randomly assigned to it.
PG
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
gotcha.
Thank you!