1、各种常见随机化的SAS实现 在前两期的讲座中我们介绍了实验设计的三要素与四原则[1],本期将结合实例重点阐述实验设计中如何实现各种常见的随机化。随机化体现在如下三个方面[2]:①抽样随机:每一个符合条件的实验对象参加实验的机会相同,即总体中每个个体有相同的机会被抽到进入样本之中。它保证所得到的样本具有代表性,使实验结论具有普遍意义;②分组随机:每个实验对象分配到不同组(通常为对照组、不同处理组)的机会相同。它保证大量难以控制的非处理因素在对比组间尽可能均衡一致,以提高各组间的可比性;③实验顺序随机:每个受试对象先后接受处理的机会相等,它使实验顺序的影响也达到均衡。本期主要就如何用SAS实
2、现随机抽样和随机分组进行阐述。 已知编号为1-20的20例病人的基本信息见表1。本文将以表1数据为例,阐述随机化的SAS实现。 表1 20例病人的基本信息 病人编号 1 2 3 4 5 6 7 8 9 10 性别 F F M F F F M M M M 年龄 60 64 37 57 41 31 60 64 58 16 病人编号 11 12 13 14 15 16 17 18 19 20 性别 M M F F F F F M F F 年龄
3、 58 63 23 37 20 33 39 40 49 42 1. 随机抽样 目前在SAS/STAT模块中,有一个与调查设计有关的SURVEYSELECT过程。该过程可用来实现各种随机抽样,包括:单纯随机抽样、系统随机抽样、分层抽样、无限随机抽样(有替换)、序贯随机抽样、以及按规模大小成比例概率抽样(PPS)等。 1.1 简单随机抽样的实现 简单随机抽样,就是从总体中不加任何分组、划类、排队等,完全随机地抽取受试对象。特点是每个个体(样品)被抽中的概率相等,各样品之间完全独立,彼此间无一定的关联性和排斥性。简单随机抽样是其他各种抽样形式的基础。通常只是在总体样品
4、之间差异程度较小和数目较少时,采用这种方法。 例1:从编号为1到20的人中用简单随机化的方法抽取10名作为受试者。 用SAS9.1.3实现简单随机抽样的程序如下: data a; input id sex$ age; cards; 1 F 60 2 F 64 … … … 20 F 42 ; run; ods html; proc surveyselect data=a method=srs n=10 out=b; run; proc print data=b; run; ods html close; 程序说明:首先,创建SAS数据集名为a。然后,调用SUR
5、VEYSELECT过程进行随机抽样,并指定一些抽样选项,其中“data=”指定输入数据集,用于指定抽样框;“method=”用于指定随机抽样的方法,srs表示单纯随机抽样;“n=”用于指定抽样大小(此处可以用“rate=”来替换,用于指定抽样率);“out=”用于指定输出数据集,它包含所有被抽到的样本(可以添加选项“rep=number”来规定重复抽样的次数,如“rep=2”命令系统同时抽取2份样本)。最后用PROC PRINT把输出数据集b在输出窗口中显示出来。命令ods html和ods html close用于把程序运行结果以网页格式保存下来。 输出结果如下: Selection M
6、ethod Simple Random Sampling Input Data Set A Random Number Seed 937359000 Sample Size 10 Selection Probability 0.5 Sampling Weight 2 Output Data Set B 以上是本次单纯随机抽样的基本信息,抽样方法是简单随机抽样(Simple Random Sampling)。由于未指定SEED=选项来规定初始种子,来产生随机数字流。系统使用默认种子作为初始种子(SEED=937359000),如果将来想重新抽取与本次完全相同的样本
7、可以在抽样时指定同一种子。抽取的样本大小是10。抽样概率(Selection Probability)是指样本被抽中的概率,此处为0.5。对于无分层的单纯随机抽样,样本的抽样概率是一致的。抽样权重(Sampling Weight)是抽样概率的倒数,反映样本信息量的大小。 Obs id sex age 1 5 F 41 2 6 F 31 3 10 M 16 4 11 M 58 5 12 M 63 6 13 F 23 7 15 F 20 8 16 F 33 9 19 F 49 10 20 F 42
8、以上是PROC PRINT命令显示的输出数据集,包括所有被抽中的样本。第二列id显示了被抽中的病人的编号。 1.2 分层随机抽样的实现 分层抽样,先依据一种或几种特征将总体分为若干个子总体,每个子总体称作一个层,然后从每层中随机抽取一个子样本,这些子样本合起来就是总体的样本。分层抽样所得的样本具有较好的代表性,抽样误差较小。 例2:将表1中的20例病人以性别为分层因素,抽取10名受试者。 用SAS9.1.3实现分层随机抽样的程序如下: ods html; proc sort data=a; by sex; run; proc surveyselect data=a metho
9、d=srs n=(6 4) out=b; strata sex; run; proc print data=b; run; ods html close; 程序说明:数据步与例1相同,此处省略。过程步,SORT过程用于将数据集a排序,by语句指明按性别进行排序,此处排序方式为先F后M。SURVEYSELECT过程与例1的不同之处在于选项n=(6 4),规定每层中得抽样大小,若每层抽样大小相同,可写为n=n1的形式。此外,还多了一个STRATA语句,该语句用于指定分层变量。 主要SAS输出结果如下: Obs sex id age SelectionProb Sampli
10、ngWeight 1 F 4 57 0.5 2 2 F 6 31 0.5 2 3 F 13 23 0.5 2 4 F 15 20 0.5 2 5 F 19 49 0.5 2 6 F 20 42 0.5 2 7 M 3 37 0.5 2 8 M 8 64 0.5 2 9 M 11 58 0.5 2 10 M 18 40 0.5 2 1.3 系统随机抽样的实现 系统抽样,先按照某种顺序将总体中的个体(样品)从1~N相继编号,并计算抽样距离K=N/n。式中N为总体样
11、品总数,n为样本容量。然后在1~K中抽一随机数i,作为样本的第一个被抽样品,接着取i+K,i+2K,…,i+(n-1)K,直至抽够n个样品为止。值得注意的是,当总体的被观察样品按顺序有周期趋势或增加(减少)趋势时,容易产生偏倚。 例3:将表1中的20例病人按系统随机抽样的方法抽取5名受试者。 用SAS9.1.3实现系统随机抽样的程序如下: ods html; proc surveyselect data=a method=sys n=5 out=b; control id; run; proc print data=b; run; ods html close; 程序说明:
12、数据步与例1相同,此处省略。SURVEYSELECT过程与例1的不同之处在于选项method=sys,规定抽样方法为系统随机抽样法。此外,还多了一个control语句,该语句用于指定排序的变量。 SAS输出结果如下: Obs sex age id 1 F 57 4 2 M 64 8 3 M 63 12 4 F 33 16 5 F 42 20 1.4整群抽样的实现 整群抽样是先将总体分成若干群,从中随机抽取几个群;抽中群内的全部个体(样品)组成样本。可将整群抽样转化为简单随机抽样。例如,从10班随机抽取5个班作为受试对象,可看做从10个个
13、体中随机抽取5个,即为简单随机抽样。 2. 随机分组 利用SAS软件实现随机分组的途径有很多,目前比较常用的是SAS/STAT模块的PLAN过程,它可用于构建各种常见的试验设计并对设计方案进行随机化,也可用于产生数字的排列组合表。笔者将介绍如何利用PLAN过程来实现两组和多组的随机分组。 2.1完全随机化的实现 完全随机化,直接对受试对象进行随机化分组,常通过掷硬币或随机数字表,或用计算机产生随机数来进行随机化,在事先或者实施过程中不作任何限制和干预或调整。分组后各组受试对象的例数不一定相等。 例4:将表1中的20例病人随机分为2组。 用SAS9.1.3实现简单随机分组的程序如下:
14、 proc plan seed=20101216; /*第一步*/ factors a=20; output out=sheji; run; data b c; /*第二步*/ set sheji; patient=_n_; if a<=10 then do; group='A'; output b; end; else do; group='B'; output c;end; run; data d; /*第三步*/ set b; group1=group;
15、 patient1=patient; keep group1 patient1; run; data e; /*第四步*/ set c; group2=group; patient2=patient; keep group2 patient2; run; data f; /*第五步*/ merge d e; run; ods html; proc print noobs; /*第六步*/ run; ods html close; 程序说明:第一步,调用PLAN过程产生2
16、0个随机排列数,并把结果输出至数据集sheji中,选项seed=,规定产生随机数的种子。第二步,对数据集sheji进行操作,把病人按随机排列数进行分组,随机数小于等于10的进入A组,其余进入B组,并将结果分别保存至数据集b和c中。第三步和第四步,分别将数据集b、c中的group改为group1、group2,将patient改为patient1和patient2,生成新的数据集d和e。最后把数据集d和e合并为新的数据集f,并通过PRINT过程将随机分组的结果展现出来。 SAS输出结果如下: group1 patient1 group2 patient2 A 4 B 1
17、A 5 B 2 A 7 B 3 A 8 B 6 A 10 B 9 A 11 B 14 A 12 B 15 A 13 B 16 A 17 B 18 A 19 B 20 例5 将这20例病人随机分为4组。 用SAS9.1.3实现简单随机分组的程序如下[3]: proc plan seed=20101216; factors a=20; output out=sheji; run; data b1 b2 b3 b4; set sheji; patient=_n_; if a
18、<=5 then do; group='A'; output b1; end; if 6<=a<=10 then do; group='B'; output b2; end; if 11<=a<=15 then do; group='C'; output b3; end; if 16<=a then do;group='D'; output b4;end; run; data d1; set b1; group1=group; patient1=patient; keep group1 patient1; run; data d3;
19、set b3; group3=group; patient3=patient; keep group3 patient3; run; data d4; set b4; group4=group; patient4=patient; keep group4 patient4; run; data f; merge d1 d2 d3 d4; run; ods html; proc print noobs; run; ods html close; SAS输出结果如下: group1 patient1 group2 pa
20、tient2 group3 patient3 group4 patient4 A 5 B 4 C 1 D 2 A 7 B 8 C 6 D 3 A 10 B 11 C 9 D 14 A 13 B 12 C 15 D 18 A 19 B 17 C 16 D 20 2.2 分层随机化的实现 分层随机化,首先对可能影响实验过程和结果的主要混杂因素(如年龄、性别、病情、疾病分期等)进行分层,然后在每一层内进行完全随机化分组,最后分别合并为实验组和对照组。配对随机化和区组随机化可看成是分层随机
21、化的实际应用。 例6 将表1中的20例病人以性别为区组因素,随机分为2组。 将20例病人中的12名女性,编号为1-12,按例4中的程序分为2组;8名为男性,编号为1-8,按例4中的程序分为2组,可以实现对这20例病人的区组随机化。 例7现有来自3个窝别的24只大鼠,以窝别为区组因素,随机为4组,每组6只。 ①对大鼠进行编号,第一窝编号为1~8,第二窝编号为9~16,第三窝编号为17~24。 用SAS9.1.3实现区组随机化的程序如下[3,4]: proc plan seed=201200505; factors block=3 length=8; output out=shej
22、i; run; data a b c d; set sheji; mouse=_n_; if length<=2 then do;group='A';output a;end; else if 3<=length<=4 then do;group='B';output b;end; else if 5<=length<=6 then do;group='C';output c;end; else do;group='D';output d;end; run; data aa; set a; group1=group; mouse1=mouse;
23、 keep group1 mouse1; run; data bb; set b; group2=group; mouse2=mouse; keep group2 mouse2; run; data cc; set c; group3=group; mouse3=mouse; keep group3 mouse3; run; data dd; set d; group4=group; mouse4=mouse; keep group4 mouse4; run; data e; merge aa bb c
24、c dd; run; ods html; proc print noobs; run; ods html close; SAS输出结果: group1 mouse1 group2 mouse2 group3 mouse3 group4 mouse4 A 2 B 1 C 3 D 6 A 4 B 8 C 5 D 7 A 9 B 11 C 10 D 12 A 15 B 16 C 13 D 14 A 17 B 23 C 18 D 21 A 19 B 24 C 2
25、0 D 22 2.3 分层区组随机化 在多中心试验中,区组随机化可以按中心分层进行,又称为分层的区组随机化。 例8 若有来自2个种系的大鼠,分别24只,每个种系分为各3个窝别,随机分为4组,每组12只。 只需在例7的程序中,将“factors block=3 length=8”改为“factors center=2 block=3 length=8”即可[4]。 2.4 动态随机化 在临床实验研究中,研究者常习惯将患者分为实验组与对照组,患者来医院就诊,若将先来就诊的分入实验组,后来就诊的分入对照组,是不正确的。因为患者来医院就诊,在患病严重程度、患病时间等重要非实验因素方面不一定是均衡的,可能带有某种程度上的“聚集性”,即某一段时间上来的患者多数为重病患者,另一段时间上来的多数为轻病患者;若规定第一个来就诊者分入实验组,第二个来就诊者分入对照组,这样交叉进行分组,最后也可能两组患者在某些重要非实验因素方面相差悬殊,组间缺乏均衡性。有一种简便易行的随机化分组方法叫“按不平衡指数最小的分配原则”分组[5]。此法也称为动态随机化法。 前面的讲座中已经介绍了动态随机化的方法[1]。此处不再赘述。






