<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Re: Randomization Scheme in Statistical Procedures</title>
    <link>https://communities.sas.com/t5/Statistical-Procedures/Randomization-Scheme/m-p/673514#M32231</link>
    <description>&lt;P&gt;/*&lt;BR /&gt;Permuted Block Randomization Schedule&lt;/P&gt;
&lt;P&gt;This randomization assumes an equal number of subjects per treatment arm.&lt;/P&gt;
&lt;P&gt;Provide block sizes, number of treatment arms, and total sample size.&lt;BR /&gt;Each block size should be a multiple of the number of treatment arms. &lt;BR /&gt;For example, a block size of 3 with only 2 treatment arms is not allowed.&lt;/P&gt;
&lt;P&gt;Block sizes &amp;gt;10 are not recommended due to processing time required.&lt;BR /&gt;*/&lt;BR /&gt;%let blocks=2 4 6 8;&lt;BR /&gt;%let ngroups=2;&lt;BR /&gt;%let samplesize=100;&lt;/P&gt;
&lt;P&gt;/*&lt;BR /&gt;Specify an integer value for seed if you want to be able to reproduce the schedule.&lt;BR /&gt;Otherwise, let seed=0&lt;BR /&gt;*/&lt;BR /&gt;%let seed = 0;&lt;/P&gt;
&lt;P&gt;%macro m1 ();&lt;BR /&gt;%global list;&lt;/P&gt;
&lt;P&gt;%let list = ;&lt;BR /&gt;%do j = 1 %to &amp;amp;blocksize/&amp;amp;ngroups;&lt;BR /&gt;%do i = 0 %to &amp;amp;ngroups-1;&lt;BR /&gt;%let list = &amp;amp;list &amp;amp;i;&lt;BR /&gt;%end;&lt;BR /&gt;%end;&lt;BR /&gt;%mend m1;&lt;/P&gt;
&lt;P&gt;%macro SelectBlockSize();&lt;BR /&gt;%global blocksize;&lt;/P&gt;
&lt;P&gt;proc datasets; delete allblocks; run; quit;&lt;/P&gt;
&lt;P&gt;%let counter=1;&lt;BR /&gt;%let current=%scan(&amp;amp;blocks,&amp;amp;counter);&lt;BR /&gt;%do %until (&amp;amp;current=);&lt;BR /&gt;data blocks;&lt;BR /&gt;blocksize=1*&amp;amp;current;&lt;BR /&gt;rand=ranuni(&amp;amp;seed);&lt;BR /&gt;output;&lt;BR /&gt;run;&lt;BR /&gt;proc append data=blocks base=allblocks; run;&lt;/P&gt;
&lt;P&gt;%let counter=%eval(&amp;amp;counter+1);&lt;BR /&gt;%let current=%scan(&amp;amp;blocks,&amp;amp;counter);&lt;BR /&gt;%end;&lt;/P&gt;
&lt;P&gt;proc sort data=allblocks; by rand; run;&lt;BR /&gt;data _null_;&lt;BR /&gt;set allblocks;&lt;BR /&gt;blockcheck=mod(blocksize,&amp;amp;ngroups);&lt;BR /&gt;if blockcheck ne 0 then call symputx ('blockcheck',blocksize);&lt;BR /&gt;else %let blockcheck='';&lt;BR /&gt;call symputx ('blocksize',blocksize);&lt;BR /&gt;run;&lt;/P&gt;
&lt;P&gt;%if &amp;amp;blockcheck ne '' %then %do;&lt;BR /&gt;%put ;&lt;BR /&gt;%put ERROR: Invalid block size for number of groups.;&lt;BR /&gt;%put ***********************************************;&lt;BR /&gt;%put Block size = &amp;amp;blockcheck;&lt;BR /&gt;%put Number of groups = &amp;amp;ngroups;&lt;BR /&gt;%put ***********************************************;&lt;BR /&gt;%put ;&lt;BR /&gt;%abort;&lt;BR /&gt;%end;&lt;BR /&gt;%mend SelectBlockSize;&lt;/P&gt;
&lt;P&gt;%macro m2 ();&lt;BR /&gt;proc datasets; delete assignment; run;&lt;/P&gt;
&lt;P&gt;%selectblocksize;&lt;BR /&gt;%m1;&lt;BR /&gt;%let n = &amp;amp;blocksize;&lt;BR /&gt;%let stop=0;&lt;/P&gt;
&lt;P&gt;%do %until (&amp;amp;stop=1);&lt;BR /&gt;%if (&amp;amp;n&amp;gt;&amp;amp;samplesize) %then %let stop=1;&lt;BR /&gt;data test;&lt;BR /&gt;array x {&amp;amp;blocksize} (&amp;amp;list);&lt;BR /&gt;nfact=fact(dim(x));&lt;BR /&gt;do i = 1 to nfact;&lt;BR /&gt;seq=allperm(i, of x[*]);&lt;BR /&gt;if &amp;amp;seed=0 then rand=ranuni(&amp;amp;seed);&lt;BR /&gt;else rand=ranuni(1+&amp;amp;seed);&lt;BR /&gt;output;&lt;BR /&gt;end;&lt;BR /&gt;run;&lt;/P&gt;
&lt;P&gt;proc sort data=test; by rand; run;&lt;BR /&gt;data test2 (keep = treat blocksize);&lt;BR /&gt;set test (obs=1 keep=x1-x&amp;amp;blocksize);&lt;BR /&gt;array x {&amp;amp;blocksize} x1-x&amp;amp;blocksize;&lt;BR /&gt;do i = 1 to &amp;amp;blocksize;&lt;BR /&gt;treat=x[i];&lt;BR /&gt;blocksize=1*&amp;amp;blocksize;&lt;BR /&gt;output;&lt;BR /&gt;end;&lt;BR /&gt;run;&lt;/P&gt;
&lt;P&gt;proc append base=assignment data=test2; run;&lt;/P&gt;
&lt;P&gt;%selectblocksize;&lt;BR /&gt;%m1;&lt;BR /&gt;%let n = %eval(&amp;amp;n+&amp;amp;blocksize);&lt;BR /&gt;%end;&lt;/P&gt;
&lt;P&gt;data assignment;&lt;BR /&gt;set assignment;&lt;BR /&gt;PatientID+1;&lt;BR /&gt;run;&lt;/P&gt;
&lt;P&gt;proc print data=assignment noobs;&lt;BR /&gt;var PatientID treat;&lt;BR /&gt;where patientid&amp;lt;=&amp;amp;samplesize;&lt;BR /&gt;run;&lt;BR /&gt;%mend m2;&lt;BR /&gt;%m2;&lt;/P&gt;</description>
    <pubDate>Thu, 30 Jul 2020 17:48:09 GMT</pubDate>
    <dc:creator>cminard</dc:creator>
    <dc:date>2020-07-30T17:48:09Z</dc:date>
    <item>
      <title>Randomization Scheme</title>
      <link>https://communities.sas.com/t5/Statistical-Procedures/Randomization-Scheme/m-p/672628#M32187</link>
      <description>&lt;P&gt;I am looking for coding recommendations or references for creating a randomization scheme for a trial. There will be two treatment arms and two groups to stratify subjects&amp;nbsp;on. In particular, I am looking to balance two binary covariates between the arms. So there will be 4 groups of subjects to be randomly assign to a treatment arm, see following groups (diabetic and age):&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp; -Diabetic and &amp;lt; 50 years&amp;nbsp;old;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp; -Diabetic and &amp;gt;/= 50 years old;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp; -Non-Diabetic and &amp;lt; 50 years old; and&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp; -Non-Diabetic and &amp;gt;/= 50 years old.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;I have created simple randomized schemes and block schemes before. It seems like I could create four block schemes to address this scenario, correct?&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Also,&amp;nbsp;I was curios if anyone had some code to create a block randomization scheme with varying block sizes within the scheme (e.g., varies between blocks of 4 and 6)?&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Thank you for your time and help!&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Mon, 27 Jul 2020 17:34:05 GMT</pubDate>
      <guid>https://communities.sas.com/t5/Statistical-Procedures/Randomization-Scheme/m-p/672628#M32187</guid>
      <dc:creator>H</dc:creator>
      <dc:date>2020-07-27T17:34:05Z</dc:date>
    </item>
    <item>
      <title>Re: Randomization Scheme</title>
      <link>https://communities.sas.com/t5/Statistical-Procedures/Randomization-Scheme/m-p/672791#M32200</link>
      <description>&lt;P&gt;Look into PROC PLAN.&amp;nbsp; It has a variety of randomization schemes for blocked designs.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;SteveDenham&lt;/P&gt;</description>
      <pubDate>Tue, 28 Jul 2020 12:07:47 GMT</pubDate>
      <guid>https://communities.sas.com/t5/Statistical-Procedures/Randomization-Scheme/m-p/672791#M32200</guid>
      <dc:creator>SteveDenham</dc:creator>
      <dc:date>2020-07-28T12:07:47Z</dc:date>
    </item>
    <item>
      <title>Re: Randomization Scheme</title>
      <link>https://communities.sas.com/t5/Statistical-Procedures/Randomization-Scheme/m-p/673514#M32231</link>
      <description>&lt;P&gt;/*&lt;BR /&gt;Permuted Block Randomization Schedule&lt;/P&gt;
&lt;P&gt;This randomization assumes an equal number of subjects per treatment arm.&lt;/P&gt;
&lt;P&gt;Provide block sizes, number of treatment arms, and total sample size.&lt;BR /&gt;Each block size should be a multiple of the number of treatment arms. &lt;BR /&gt;For example, a block size of 3 with only 2 treatment arms is not allowed.&lt;/P&gt;
&lt;P&gt;Block sizes &amp;gt;10 are not recommended due to processing time required.&lt;BR /&gt;*/&lt;BR /&gt;%let blocks=2 4 6 8;&lt;BR /&gt;%let ngroups=2;&lt;BR /&gt;%let samplesize=100;&lt;/P&gt;
&lt;P&gt;/*&lt;BR /&gt;Specify an integer value for seed if you want to be able to reproduce the schedule.&lt;BR /&gt;Otherwise, let seed=0&lt;BR /&gt;*/&lt;BR /&gt;%let seed = 0;&lt;/P&gt;
&lt;P&gt;%macro m1 ();&lt;BR /&gt;%global list;&lt;/P&gt;
&lt;P&gt;%let list = ;&lt;BR /&gt;%do j = 1 %to &amp;amp;blocksize/&amp;amp;ngroups;&lt;BR /&gt;%do i = 0 %to &amp;amp;ngroups-1;&lt;BR /&gt;%let list = &amp;amp;list &amp;amp;i;&lt;BR /&gt;%end;&lt;BR /&gt;%end;&lt;BR /&gt;%mend m1;&lt;/P&gt;
&lt;P&gt;%macro SelectBlockSize();&lt;BR /&gt;%global blocksize;&lt;/P&gt;
&lt;P&gt;proc datasets; delete allblocks; run; quit;&lt;/P&gt;
&lt;P&gt;%let counter=1;&lt;BR /&gt;%let current=%scan(&amp;amp;blocks,&amp;amp;counter);&lt;BR /&gt;%do %until (&amp;amp;current=);&lt;BR /&gt;data blocks;&lt;BR /&gt;blocksize=1*&amp;amp;current;&lt;BR /&gt;rand=ranuni(&amp;amp;seed);&lt;BR /&gt;output;&lt;BR /&gt;run;&lt;BR /&gt;proc append data=blocks base=allblocks; run;&lt;/P&gt;
&lt;P&gt;%let counter=%eval(&amp;amp;counter+1);&lt;BR /&gt;%let current=%scan(&amp;amp;blocks,&amp;amp;counter);&lt;BR /&gt;%end;&lt;/P&gt;
&lt;P&gt;proc sort data=allblocks; by rand; run;&lt;BR /&gt;data _null_;&lt;BR /&gt;set allblocks;&lt;BR /&gt;blockcheck=mod(blocksize,&amp;amp;ngroups);&lt;BR /&gt;if blockcheck ne 0 then call symputx ('blockcheck',blocksize);&lt;BR /&gt;else %let blockcheck='';&lt;BR /&gt;call symputx ('blocksize',blocksize);&lt;BR /&gt;run;&lt;/P&gt;
&lt;P&gt;%if &amp;amp;blockcheck ne '' %then %do;&lt;BR /&gt;%put ;&lt;BR /&gt;%put ERROR: Invalid block size for number of groups.;&lt;BR /&gt;%put ***********************************************;&lt;BR /&gt;%put Block size = &amp;amp;blockcheck;&lt;BR /&gt;%put Number of groups = &amp;amp;ngroups;&lt;BR /&gt;%put ***********************************************;&lt;BR /&gt;%put ;&lt;BR /&gt;%abort;&lt;BR /&gt;%end;&lt;BR /&gt;%mend SelectBlockSize;&lt;/P&gt;
&lt;P&gt;%macro m2 ();&lt;BR /&gt;proc datasets; delete assignment; run;&lt;/P&gt;
&lt;P&gt;%selectblocksize;&lt;BR /&gt;%m1;&lt;BR /&gt;%let n = &amp;amp;blocksize;&lt;BR /&gt;%let stop=0;&lt;/P&gt;
&lt;P&gt;%do %until (&amp;amp;stop=1);&lt;BR /&gt;%if (&amp;amp;n&amp;gt;&amp;amp;samplesize) %then %let stop=1;&lt;BR /&gt;data test;&lt;BR /&gt;array x {&amp;amp;blocksize} (&amp;amp;list);&lt;BR /&gt;nfact=fact(dim(x));&lt;BR /&gt;do i = 1 to nfact;&lt;BR /&gt;seq=allperm(i, of x[*]);&lt;BR /&gt;if &amp;amp;seed=0 then rand=ranuni(&amp;amp;seed);&lt;BR /&gt;else rand=ranuni(1+&amp;amp;seed);&lt;BR /&gt;output;&lt;BR /&gt;end;&lt;BR /&gt;run;&lt;/P&gt;
&lt;P&gt;proc sort data=test; by rand; run;&lt;BR /&gt;data test2 (keep = treat blocksize);&lt;BR /&gt;set test (obs=1 keep=x1-x&amp;amp;blocksize);&lt;BR /&gt;array x {&amp;amp;blocksize} x1-x&amp;amp;blocksize;&lt;BR /&gt;do i = 1 to &amp;amp;blocksize;&lt;BR /&gt;treat=x[i];&lt;BR /&gt;blocksize=1*&amp;amp;blocksize;&lt;BR /&gt;output;&lt;BR /&gt;end;&lt;BR /&gt;run;&lt;/P&gt;
&lt;P&gt;proc append base=assignment data=test2; run;&lt;/P&gt;
&lt;P&gt;%selectblocksize;&lt;BR /&gt;%m1;&lt;BR /&gt;%let n = %eval(&amp;amp;n+&amp;amp;blocksize);&lt;BR /&gt;%end;&lt;/P&gt;
&lt;P&gt;data assignment;&lt;BR /&gt;set assignment;&lt;BR /&gt;PatientID+1;&lt;BR /&gt;run;&lt;/P&gt;
&lt;P&gt;proc print data=assignment noobs;&lt;BR /&gt;var PatientID treat;&lt;BR /&gt;where patientid&amp;lt;=&amp;amp;samplesize;&lt;BR /&gt;run;&lt;BR /&gt;%mend m2;&lt;BR /&gt;%m2;&lt;/P&gt;</description>
      <pubDate>Thu, 30 Jul 2020 17:48:09 GMT</pubDate>
      <guid>https://communities.sas.com/t5/Statistical-Procedures/Randomization-Scheme/m-p/673514#M32231</guid>
      <dc:creator>cminard</dc:creator>
      <dc:date>2020-07-30T17:48:09Z</dc:date>
    </item>
  </channel>
</rss>

