RANDOMIZATION SCHEDULES SPH 7460 notes.002
Randomized treatment assignments for clinical trials are usually
generated using pseudo-random number generators in SAS, FORTRAN,
or other languages.
If a clinical trial has several different clinical centers, usually
separate randomization schedules are generated for each center.
These separate groups are referred to as 'strata'.
Sometimes there are stratifying factors in addition to clinical
center. Typically, investigators want to stratify on variables which are
known to have a strong influence on outcome. In a clinical trial in which the
outcome is heart attack, it is reasonable to stratify on gender or age group.
The object of stratifying is to achieve approximate balance of the
treatment groups within each stratum. Say, for example, you want
a schedule of treatment assignments to drug D or placebo P for
100 people within a stratum. You want approximately equal numbers
assigned to D and P. You don't want, for example, 70 people assigned
to D and 30 people assigned to P. Such imbalances can affect the power of
the study. If the imbalance occurs on a risk factor for the study's outcome,
the results may appear to favor one drug over the other even though there is
no real difference between the drugs.
Randomization to two groups is basically just like flipping a coin.
Unless you take some precautions, you might end up with a bad
imbalance between the groups. This weakens the power of the study
and makes it more likely that the groups are also imbalanced on other
factors.
You don't know in advance how many people will ultimately be entered
into the trial from a given stratum. You would therefore like to
write the randomization schedule so that (1) people have equal
probability of being assigned to either group, and (2) approximate
balance between the groups is guaranteed at any point in the
schedule.
How can you do this?
The most common method is by creating a randomization schedule from
a series of 'permuted blocks' of specified lengths.
A permuted block of size N is a based on a random permutation of the
N numbers 1, 2, 3, ..., N.
Say for example N = 4. You start with the block [1 2 3 4]. You
randomly permute it and get [2 4 3 1]. You assign people to drug D
if the number is even and to drug P if it is odd. Thus the permuted
block gives rise the following sequence of treatment assignments:
[2 4 3 1]
[D D P P]
If you string together five randomly permuted blocks like this, you
could get the following treatment schedule:
[2 4 3 1][1 4 2 3][4 3 1 2][3 2 1 4][4 3 2 1]
D D P P P D D P D P P D P D P D D P D P
1 2 1 0 -1 0 1 0 1 0 1 0 -1 0-1 0 1 0 1 0 <--- D - P imbalance
Note that, at ANY POINT in the schedule, the imbalance between D and P
is never greater than two. Also, you never have runs of the same
treatment assignment of length greater than 4.
Also notice that, with all the block sizes being 4, the imbalance
between D and P is zero after every 4th randomization. This feature
unfortunately makes it possible for patients or clinic coordinators
to know the next treatment assignment in certain cases. For example,
if you are at the 15th spot in the schedule, and the three previousw
treatment assigments are D D P, then you know with absolute
certainty that the next assignment is also P.
To remedy this problem, randomization schedules are often composed as
mixtures of two or more different sizes of permuted blocks. This
makes it impossible to know exactly where block boundaries are. For
example, in the MRFIT clinical trial, three block sizes were used:
2, 4, and 6. Whenever one block was completed, the size K of the next
block was chosen at random, a random permutation of [1 2 ... K] was
generated, and the next K treatment assignments were made.
The MRFIT randomization schedule was stratified by clinical center.
There were 22 clinical centers. There were two treatment groups.
The MRFIT randomization schedule guaranteed that the treatments were
never out of balance by more than __?__. It also guaranteed that there
were no runs of treatment assignments greater than __?__.
So the main question is: how do you use pseudo-random number
generators to create random permutations of [1 2 ... N], for any
given N?
PROJECT ASSIGNMENT 4
1. Find an efficient way to generate random permutations of
[1 2 ... N]. Write SAS code which does this.
2. Write a complete SAS or SPLUS program to generate randomization
schedules based on permuted blocks of varying sizes. The
key parameters to the program are:
1) The number of treatments
2) The acceptable block sizes (and the number of such sizes)
3) The number of strata
4) The length of the schedule within each stratum (can be assumed
to be the same for each stratum).
You can assume that all the treatments will be assigned with equal
probability.
~john-c/5421/notes.002 Revised Sept 3, 2002.