BookmarkSubscribeRSS Feed
jeewakamendis
Calcite | Level 5

Hi Everyone,

Please help me with the below randomization.

3 types of injections (A, B and C) are randomised to 3 locations in each arm (L1 L2 L3 R1 R2 R3). 

L and R corresponds to LEFT AND RIGHT arms respectively.

For each arm, A has to be given at least once, remaining two locations in each arm can be allocated to either B or C.

It can both be B. Also It can both be C or It can be B and C.


I use PROC PLAN to generate random numbers and writing it to a SAS dataset.


Thanks in advanced.


This is what I got to so far.

proc plan seed=1832577;

  factors a=20 b=6;

  output out = c;

run;

%macro calc;

data dat(keep = SubjectNr Location arm Treatment allocatedarm allocatedarm2 allocatedarm3 allocTr1 allocTr2 allocTr3);

  length Treatment $8.;

  length Location $2.;

  length arm $5;

  set c;

  retain ct ctt allocatedarm allocatedarm2 allocatedarm3 allocTr1 allocTr2 allocTr3;

  if ct = . or ct ne a then do; 

  ct = a; ctt = 0; end;

  ctt = ctt + 1;

      if b<= 3 then do;

      arm='right';

      end;

      else

      arm='left';

    if ctt=1 then do;

      treatment = 'A';

allocatedarm=arm;

allocTr1= treatment;

      end;

     

  if ctt=2 then do;

        if arm ne allocatedarm then do;

treatment = 'A'; end;

else do;

treatment = 'B or C';

            end;

            allocatedarm2=arm;

            allocTr2 = treatment;

  end;

 

  if ctt=3 then do;

      if (allocTr1 eq allocTr2) or (allocatedarm eq allocatedarm2) then

            treatment = 'B or C';

      if (allocatedarm eq allocatedarm2) and (arm ne allocatedarm) then

            treatment = 'A';

      allocatedarm3=arm;

      allocTr3 = treatment;

  end;

  if ctt=4 then do;

      if (arm ne allocatedarm) and (allocatedarm2 ne allocatedarm) and (allocatedarm3 ne allocatedarm) then

      treatment = 'A';

  end;

SubjectNr = a;

location = b;

run;

/* proc sort data = dat out = dat; by SubjectNr; run; */

ods rtf file = " .rtf";

footnote "";

proc print data = dat noobs;

var SubjectNr Location Treatment arm allocatedarm allocatedarm2 allocatedarm3 allocTr1 allocTr2 allocTr3;

run;

ods rtf close;

%mend;

%calc;

quit;

4 REPLIES 4
Patrick
Opal | Level 21

If I understood your requirements right then below code should do what you're after.

proc plan seed=1832577;

  factors Subj=20 Loc=6;

  output out = Plan;

run;

proc format;

  value arm

    1-3 ='Right'

    4-6 ='Left'

    ;

  picture Location

    1-3 = '00000000' (prefix='R')

    4-6 = '00000000' (prefix='L')

    ;

run;

data _null_;

  set Plan end=last;

  SubjectNr=put(Subj,z10.);

  Location=put(Loc,Location2.);

  Arm=put(Loc,arm5.);

  length Treatment $8;

  if _n_=1 then

    do;

      dcl hash h1(multidata:'y',ordered:'yes');

      _rc=h1.defineKey('SubjectNr','Arm','Treatment');

      _rc=h1.defineData('SubjectNr','Arm','Treatment','Location');

      _rc=h1.defineDone();

    end;

  Treatment='A';

  if h1.check() ne 0 then

    do;

      _rc=h1.add();

    end;

  else

    do;

      if ceil(ranuni(1832577)*2)=1 then Treatment='B';

      else Treatment='C';

      _rc=h1.add();

    end;

  if last then

    do;

      _rc=h1.output(dataset:'want');

    end;

run;

jeewakamendis
Calcite | Level 5

Thanks Patrick for this

Babloo
Rhodochrosite | Level 12

May I request you to tell me how ranuni works here as i confused with seeds'1832577'?

ceil(ranuni(1832577)*2

vkorsz
Calcite | Level 5

Ranuni returns a random number from the uniform distribution between 0 and 1.  So it looks like here, the phrase

ceil(ranuni(1832577)*2)

will return 0 when the random number generated is 0,

1 when the random number generated is greater than 0 and less than or equal to .5,

and 2 when the random number generated is greater than .5 and less than or equal to 1.

The seed is specified here just to give a reproducible result.  If you do not specify a seed, the results will change each time the code is run.  The seed can be any number less than 2^31-1, including a date or time value as those are stored as numeric values in SAS.

SAS Innovate 2025: Save the Date

 SAS Innovate 2025 is scheduled for May 6-9 in Orlando, FL. Sign up to be first to learn about the agenda and registration!

Save the date!

What is Bayesian Analysis?

Learn the difference between classical and Bayesian statistical approaches and see a few PROC examples to perform Bayesian analysis in this video.

Find more tutorials on the SAS Users YouTube channel.

SAS Training: Just a Click Away

 Ready to level-up your skills? Choose your own adventure.

Browse our catalog!

Discussion stats
  • 4 replies
  • 1304 views
  • 0 likes
  • 4 in conversation