胡 完,胡良平,2*
(1.军事医学科学院生物医学统计学咨询中心,北京 100850; 2.世界中医药学会联合会临床科研统计学专业委员会,北京 100029
基于R软件实现随机分组及其应用
胡 完1,胡良平1,2*
(1.军事医学科学院生物医学统计学咨询中心,北京 100850; 2.世界中医药学会联合会临床科研统计学专业委员会,北京 100029
本文目的是使读者快速掌握用R软件实现几种随机分组的方法。通过借助R软件中实现随机抽样的sample()函数,间接地实现简单随机分组和分层随机分组的目的。事实表明:R软件易于获取、易学易用;R软件功能强大、适用面宽,可以方便快捷地解决试验设计中的随机分组问题。
R软件;简单随机分组;分层随机分组;非试验因素
从总体中抽取了规定数目的个体或样品或受试对象,通常还需要将他们随机分到若干个组里去。各组需要分配多少名个体呢?应根据具体情况确定,各组的个体数目可以按一定比例来分配,但最好各组的个体数目相等(在结果上将产生的误差最小化)。
如何将规定数目的个体按等比例或规定的某种比例随机分配到两组或多组中去的方法被称为随机分组。其具体方法有:完全或简单随机分组、分层或区组随机分组(注:在本质上,分层因素与区组因素都是指重要的非试验因素)、分层区组随机分组(事实上,就是同时考察两个重要非试验因素的随机分组)。
值得一提的是,目前在R软件中尚未找到直接用于随机化分组的函数,本文暂且借用随机抽样的sample( )函数来代替。不可避免的问题可能会出现,即各组的样本含量可能不相等。补救措施是改变随机数的种子数,直到所生成的随机分组结果符合各组样本含量相等的要求时,固定此随机数种子数,并保留程序。以后再运行此程序时,就能再现以前的符合要求的随机化分组结果。
2.1 简单随机分组
2.1.1 将全部受试对象随机均分成两组
【例1】现有编号为1~24的24位受试对象,希望将他们随机地均分到“试验组”与“对照组”中去,并显示出随机分组的结果。
解答:在R中使用下面的语句就可实现前述的目的。
> a<- c(1:24)
> b<- rep(c("试验组","对照组"),12)
> c<- sample(b,24,rep=F)
> d<- cbind(a,c);d
以上句的含义如下:
第一句:生成一个名为a的向量,其元素为1~24。
第二句:生成一个名为b的向量,其元素由“试验组”和“对照组”交替组成,共重复12次,故元素个数为24。
第三句:生成一个向量c,其元素是从向量b中无放回随机抽样的结果,抽出24个元素,本质上,相当于对向量b中的24个元素进行随机化排列。
第四句:将向量a与c按列进行合并,生成一个向量d,并将其输出。
ac[1,]"1""对照组"[2,]"2""对照组"[3,]"3""对照组"[4,]"4""对照组"[5,]"5""对照组"[6,]"6""试验组"[7,]"7""试验组"[8,]"8""试验组"[9,]"9""试验组"[10,]"10""对照组"[11,]"11""试验组"[12,]"12""对照组"[13,]"13""试验组"[14,]"14""对照组"[15,]"15""试验组"[16,]"16""试验组"[17,]"17""对照组"[18,]"18""对照组"[19,]"19""试验组"[20,]"20""对照组"[21,]"21""对照组"[22,]"22""试验组"[23,]"23""试验组"[24,]"24""试验组"
以上是将编号为1~24(见a列)的受试对象随机均分入试验组与对照组(见c列)。
2.1.2 将全部受试对象随机均分成三组
【例2】现有编号为1~24的24位受试对象,希望将他们随机地均分为“试验组”与“对照组1”和“对照组2”三组中去(即按1:2分配样品),并显示出随机分组的结果。
解答:在R中使用下面的语句就可实现前述的目的。
>a<- c(1:24)
>b<- rep(c("试验组","对照组1","对照组2"),8)
> c<- sample(b,24,rep=F)
> d<- cbind(a,c);d
第一句:生成一个名为a的向量,其元素为1~24。
第二句:生成一个名为b的向量,其元素由“试验组”、“对照组1”和“对照组2”交替组成,共重复8次,故元素个数为24。
第三句:生成一个向量c,其元素是从向量b中无放回随机抽样的结果,抽出24个元素,本质上相当于对向量b中的24个元素进行随机化排列。
第四句:将向量a与c按列进行合并,生成一个向量d,并将其输出。
a c[1,]"1""对照组2"[2,]"2""对照组2"[3,]"3""试验组"[4,]"4""对照组1"[5,]"5""对照组2"[6,]"6""试验组"[7,]"7""试验组"[8,]"8""试验组"[9,]"9""对照组1"[10,]"10""对照组2"[11,]"11""对照组1"[12,]"12""对照组1"[13,]"13""试验组"[14,]"14""对照组2"[15,]"15""对照组2"[16,]"16""对照组2"[17,]"17""对照组2"[18,]"18""试验组"[19,]"19""对照组1"[20,]"20""对照组1"[21,]"21""对照组1"[22,]"22""试验组"[23,]"23""对照组1"[24,]"24""试验组"
以上是将编号从1~24的24个样品(见a列)按1:2的比例随机化分组的输出结果,试验组、对照组1、对照组2中各包含8个样品。
如何使某次随机化分组结果具有重现性呢?若想使前面刚出现过的随机化分组结果再次出现,就很困难了。只有事先设置好随机化种子[使用set.seed(n),n为非0的正整数],然后生成随机化分组结果;再使用相同的随机化种子,第二次运行相同的生成随机化分组的程序,才能得到相同的随机化分组结果。若在未来的某个时间,还想生成相同的随机化分组结果,事先还得运行与以前使用过的相同的随机化种子。
> set.seed(2)
> a<- c(1:24)
> b<- rep(c("试验组","对照组1","对照组2"),8)
> c<- sample(b,24,rep=F)
> d<- cbind(a,c);d
以上的第一句为设置随机化种子,后面四句的内容与前面程序相同,已解释过了。
a c[1,]"1""对照组1"[2,]"2""对照组1"[3,]"3""试验组"[4,]"4""试验组"[5,]"5""试验组"[6,]"6""对照组2"[7,]"7""对照组2"[8,]"8""对照组2"[9,]"9""对照组1"[10,]"10""对照组2"[11,]"11""试验组"[12,]"12""对照组2"[13,]"13""试验组"[14,]"14""对照组1"[15,]"15""对照组2"[16,]"16""对照组1"[17,]"17""对照组1"[18,]"18""对照组1"[19,]"19""对照组1"[20,]"20""试验组"[21,]"21""对照组2"[22,]"22""试验组"[23,]"23""试验组"[24,]"24""对照组2"
> set.seed(2)
> a<- c(1:24)
> b<- rep(c("试验组","对照组1","对照组2"),8)
> c<- sample(b,24,rep=F)
> d<- cbind(a,c);d
以上的第一句所设置的随机化种子与前面相同,后面四句的内容与前面程序也相同,已解释过了。
a c[1,]"1""对照组1"[2,]"2""对照组1"[3,]"3""试验组"[4,]"4""试验组"[5,]"5""试验组"[6,]"6""对照组2"[7,]"7""对照组2"[8,]"8""对照组2"[9,]"9""对照组1"[10,]"10""对照组2"[11,]"11""试验组"[12,]"12""对照组2"[13,]"13""试验组"[14,]"14""对照组1"[15,]"15""对照组2"[16,]"16""对照组1"[17,]"17""对照组1"[18,]"18""对照组1"[19,]"19""对照组1"[20,]"20""试验组"[21,]"21""对照组2"[22,]"22""试验组"[23,]"23""试验组"[24,]"24""对照组2"
以上两批生成的随机化分组结果完全相同,这是由于两批运行的随机化种子数和程序都相同。
2.2 分层或区组随机分组
【例3】现有编号为1~24的24位受试对象,男性和女性各12例。试将性别视为分层因素,将各层中的受试对象随机地均分入试验组与对照组中去。
解答:在R中使用下面的语句就可实现前述的目的。
> set.seed(20160407)
>a<- c(1:24)
>b1<- rep(c("男"),12)
>b2<- rep(c("女"),12)
> c<- c(b1,b2)
> d1<- rep(c("试验组"),12)
> d2<- rep(c("对照组"),12)
> e<- c(d1,d2)
> f<- sample(e,24,rep=F)
> g<- cbind(a,c,f);g
以上有10行独立的R语句,其中,最后一行有两句,用“;”(即英文输入状态下分号)隔开。
第1行:固定随机数的种子数为20160407。
第2行:生成受试对象的编号1~24号,作为向量a的24个元素。
第3、4两行:生成两个各有12个元素(或长度为12)的向量b1与b2,其内容分别由12个“男”、12个“女”组成。
第5行:将b1与b2两个向量左右拼接成一个长度为24的向量c。
第6、7两行:生成两个各有12个元素(或长度为12)的向量d1与d2,其内容分别由12个“试验组”、12个“对照组”组成。
第8行:将d1与d2两个向量左右拼接成一个长度为24的向量e。
第9行:调用sample( )函数,从长度为24的向量e(其元素中,前12个为“试验组”、后12个为“对照组”)中无放回地随机抽取24个元素(注意:不能保证各层一定能抽取相同数目的“试验组”与“对照组”,如果要保证各层“试验组”与“对照组”数目相同,可分别按层进行随机分组),生成向量f。
第10行:前一句是将向量a、c和f按列进行合并生成一个数据框g;后一句要求输出数据框g的内容。
acf[1,]"1""男""试验组"[2,]"2""男""试验组"[3,]"3""男""对照组"[4,]"4""男""试验组"[5,]"5""男""对照组"
[6,]"6""男""对照组"[7,]"7""男""对照组"[8,]"8""男""对照组"[9,]"9""男""试验组"[10,]"10""男""对照组"[11,]"11""男""试验组"[12,]"12""男""试验组"[13,]"13""女""试验组"[14,]"14""女""对照组"[15,]"15""女""试验组"[16,]"16""女""试验组"[17,]"17""女""对照组"[18,]"18""女""对照组"[19,]"19""女""试验组"[20,]"20""女""对照组"[21,]"21""女""对照组"[22,]"22""女""试验组"[23,]"23""女""试验组"[24,]"24""女""对照组"
以上是输出结果,第1列为R软件自动生成的行号;第2列为受试对象的1~24个编号;第3列为受试对象的性别(注意:开始应将12位男性受试对象作为第一层编号为1~12号、将12位女性受试对象作为第二层编号为13~24号);第4列相当于[因为是借用随机抽样函数(即sample()函数)而不是真正的随机分组函数(此种函数在R中是否存在,笔者暂时尚不能确定)]将各层内相同性别的受试对象随机地均分入“试验组”与“对照组”。
[1] 胡良平. 课题设计与数据分析—关键技术与标准模板[M]. 北京: 军事医学科学出版社, 2014: 93-103.
[2] 黄文, 王正林. 数据挖掘: R语言实战[M]. 电子工业出版社, 2015: 34-39.
[3] 李诗羽, 张飞, 王正林. 数据分析: R语言实战[M]. 电子工业出版社, 2015: 88-156.
[4] 方匡南, 朱建平, 姜叶飞. R数据分析: 方法与案例详解[M]. 电子工业出版社, 2015: 54-168.
[5] Joseph Adler. R语言核心技术手册[M]. 2版. 刘思喆, 李舰, 陈钢, 等译. 电子工业出版社, 2015: 417-421.
(本文编辑:唐雪莉)
The realization of the random grouping and its application based on R software
HuWan1,HuLiangping1,2*
(1.ConsultingCenterofBiomedicalStatistics,AcademyofMilitaryMedicalSciences,Beijing100850,China; 2.SpecialtyCommitteeofClinicalScientificResearchStatisticsofWorldFederationofChineseMedicineSocieties,Beijing100029,China
*Correspondingauthor:HuLiangping,E-mail:lphu812@sina.com)
The purpose of this paper is to help readers to implement random grouping by using R software. The simple random grouping and stratified random grouping are realized with the help of the function of sample(), that is used to implement random sampling. In fact, R software is very easy to obtain, learn and use; and R software is very powerful, wide application, can solve problems about random grouping in the experimental designs conveniently and quickly.
R software; Simple random grouping; Stratified random grouping; Non-experimental factor
*通信作者:胡良平,E-mail:lphu812@sina.com )
R195.1
A
10.11886/j.issn.1007-3256.2016.06.003
国家高技术研究发展计划课题资助(02015AA020102)
2016-12-05)