謝金亮 何韻婷 王筱金 何 豪 王炳順Δ
【提 要】 目的 非固定區(qū)組長度可有效降低隨機對照臨床試驗(RCT)中區(qū)組隨機化分組的可預(yù)測性,為此編制全自動SAS宏程序?qū)崿F(xiàn)變化區(qū)組隨機化。方法 結(jié)合變化區(qū)組隨機化的原理編制SAS宏程序,通過模擬實例演示程序的使用。結(jié)果 輸入設(shè)定的宏變量參數(shù),運行SAS宏程序即可生成變化區(qū)組隨機化的受試者分配方案。此外,該SAS宏能實現(xiàn)多臂不等比RCT的分配問題,提供了受試者隨機分配序列重現(xiàn)的功能。結(jié)論 多區(qū)組長度的設(shè)置和區(qū)組長度的隨機選擇能夠降低分組可預(yù)測性,避免隨機分組階段選擇偏倚的產(chǎn)生。本文的SAS宏為隨機對照臨床試驗實現(xiàn)變化區(qū)組隨機化提供了便利。
隨機化是隨機對照臨床試驗(RCT)設(shè)計的基本原則之一。適宜的隨機化方法可以避免選擇偏倚的產(chǎn)生和平衡未知因素的影響[1]。RCT常用的經(jīng)典隨機化方法有簡單隨機化、區(qū)組隨機化及分層隨機化等。區(qū)組隨機化能夠確保各組樣本量均衡,達到最大的試驗效率[2-3],以及消除入組時間差異對處理效應(yīng)的影響。因此,區(qū)組隨機化常受到臨床試驗研究者的青睞。
不可預(yù)測性是隨機化的要旨之一,是指試驗相關(guān)人員在隨機分配實施前不能預(yù)先知曉治療分配的相關(guān)信息。不可預(yù)測性的破壞會導(dǎo)致RCT的分配隱藏(allocation concealment)措施受損,處理組治療效果甚至?xí)环糯蟾哌_40%[4-5]。傳統(tǒng)區(qū)組隨機化的運用會增加隨機分配序列的可預(yù)測風(fēng)險[6]。基于傳統(tǒng)區(qū)組隨機化的原理,以隨機選擇的區(qū)組長度替代固定區(qū)組長度的設(shè)置,能夠有效降低隨機分組的可預(yù)測性,該隨機分組方法稱為變化區(qū)組(varying block sizes)隨機化[7],現(xiàn)已越來越多地運用于臨床研究。
已有一些便利實現(xiàn)變化區(qū)組隨機化的SAS程序公開發(fā)表。然而,此前報道的變化區(qū)組隨機化SAS程序存在諸多局限,主要有①不是基于宏的程序顯得冗長,參數(shù)需做較多修改;②適用范圍較局限,多用于最簡單的1∶1平行組對照設(shè)計;③無法實現(xiàn)自動生成種子數(shù)并據(jù)此種子數(shù)重現(xiàn)分組的需求[7-9]。2021年9月8日國家藥監(jiān)局發(fā)布的《藥物臨床試驗隨機分配指導(dǎo)原則(征求意見稿)》明確提出,可以在同一研究中設(shè)置多個區(qū)組長度以盡可能減少分組的可預(yù)測性[10]。為此,本文旨在開發(fā)簡單易用的SAS宏,幫助臨床研究者更好理解變化區(qū)組隨機化以便更好地應(yīng)用。
1.變化區(qū)組隨機化
區(qū)組隨機化是指將具有相似屬性(如接受治療時間、體重、種族等)的受試者劃分成若干個大小相等的區(qū)組,區(qū)組內(nèi)的各組別受試者比例與總的各組別受試者比例相等。各區(qū)組內(nèi)的受試者按一定比例(通常為1∶1)隨機分配至各處理組,最后得到各組樣本量符合預(yù)期比例的隨機分配方案。區(qū)組隨機化與其他隨機化方法的顯著區(qū)別在于增加了區(qū)組的設(shè)置,通常以“區(qū)組長度”或“區(qū)組大小”來描述各區(qū)組內(nèi)的受試者數(shù)量。
變化區(qū)組隨機化是相對于傳統(tǒng)區(qū)組隨機化而言的,其以隨機可變的區(qū)組長度代替固定長度的區(qū)組,即相鄰區(qū)組的樣本量不一定相等且研究者無法知曉各區(qū)組的區(qū)組長度。研究者可以根據(jù)方案中設(shè)定的樣本量和設(shè)置的多個“區(qū)組長度”,將受試者隨機劃分成若干個大小不等的區(qū)組。“區(qū)組長度”通常設(shè)置為2類或3類,區(qū)組長度一般取比較組數(shù)的倍數(shù)。例如,當(dāng)試驗為雙臂RCT時,區(qū)組長度可取4、6、8[11]。
2.SAS宏程序
(1)SAS宏的各類變量說明
本文通過結(jié)合循環(huán)語句、ranuni函數(shù)以及proc rank步驟實現(xiàn)變化區(qū)組隨機化,運用SAS 9.4進行SAS宏的開發(fā)。在變化區(qū)組隨機化程序執(zhí)行過程涉及兩類變量:宏變量和運行過程中生成的新變量,變量的名稱和含義如表1所示。
表1 SAS宏主體中變量的設(shè)置和含義
(2)SAS宏主體及解釋
%macro RdmVBsize(samplesize=, trtnames=,blksizes=, outrtf=, seed=);
/*1.檢查是否定義了所有必選宏參數(shù)*/
%if %length(&samplesize)=0 %then %do;%go to ENDIT1;%end;
%if %length(&trtnames)=0 %then %do;%go to ENDIT1;%end;
%if %length(&blksizes)=0 %then %do;%go to ENDIT1;%end;
/*2.自動生成種子數(shù)*/
%if %length(&seed)=0 %then %do;
%let seed=%sysfunc(floor(%sysfunc(datetime())));
%end;
/*3.確定區(qū)組長度的數(shù)量和各個區(qū)組長度*/
%let Numblksize=%sysfunc(countw(&blksizes,%str()));
%do i=1 %to &Numblksize;
%let blksizes&i=%scan(&blksizes,&i,′ ′);
%end;
/*4.隨機分配區(qū)組長度*/
data work.plan;
sum=0;blk_id=0;sub_id=0;
do while(sum<&samplesize);
r=mod(input(ranuni(&seed)*100000000000,3.0),&Numblksize.);
%do i=1 %to &Numblksize.;
if r=%eval(&i.-1)then do;
size=&&blksizes&i.;
blk_id=blk_id+1;
sum=sum+size;end;
%end;
if sum>&samplesize then do;
sum=sum-size;
size=&samplesize-sum;
sum=sum+size;end;
do j=1 to size;
rand=ranuni(&seed);
sub_id=sub_id+1;
output;end;
end;
run;
/*5.確定各區(qū)組內(nèi)序列*/
proc rank data=plan out=plan;
by blk_id;var rand;
ranks rank;
run;
/*6.將各區(qū)組受試者隨機分配入組*/
%let trtnum=%sysfunc(countw(″&trtnames″,%str()));
%do i=1 %to &trtnum.;
data treat&i;
set plan;
if(size/&trtnum)*(&i-1) treatment=scan(″&trtnames″,&i,″ ); output treat&i;end; run; %end; /*7.輸出分配方案*/ data allocation;set treat:;by sub_id;run; proc datasets lib=work noprint; delete plan Treat:; run;quit; ods rtf file=“&outrtf.”bodytitle; title1 “變化區(qū)組隨機化分配方案”; title2 “樣本量=&SampleSize.區(qū)組長度=&blksizes種子數(shù)=&seed.”; proc report data=allocation nowd headline; column sub_id blk_id size rank treatment; define sub_id/“隨機入組例號” center; define blk_id/“區(qū)組ID” center; define size/“區(qū)組長度” center; define rank/“區(qū)組內(nèi)序列” center; define treatment/“處理分組” center; run; ods rtf close; %goto ENDIT2; %ENDIT1: %PUT ERROR:MACRO STOPPED-MUST ENTER THE RIGHT PARAMETERS.; %ENDIT2: %mend RdmVBsize; 本研究通過模擬兩個RCT的隨機化情境,展示如何利用變化區(qū)組隨機化SAS宏程序,生成不同RCT情境下的受試者隨機分配序列。 示例1:一項單中心平行對照臨床試驗,計劃招募48名受試者,運用變化區(qū)組隨機化方法,將受試者以1∶1的比例隨機分配至處理組和對照組。研究者設(shè)置兩個區(qū)組長度(4、6),執(zhí)行SAS宏得到受試者隨機分配表,部分結(jié)果如表2所示。 表2 示例1變化區(qū)組隨機化的部分分配方案樣本量=48 區(qū)組長度=4 6 種子數(shù)=1950126068 %RdmVBsize(samplesize=48, trtnames=intervention control, blksizes=4 6, outrtf=D:RdmVBsize1.doc; seed=); 假若有存檔或驗證方面需求,將自動生成的種子數(shù)填入對應(yīng)宏參數(shù)位置,即可重現(xiàn)上述隨機分配序列。如: %RdmVBsize(samplesize=48, trtnames=intervention control, blksizes=4 6, outrtf=D:RdmVBsize1Rep.doc; seed=1950126068); 示例2:一項三臂RCT,計劃納入200例患者,將患者以2:2:1的比例隨機分配至A藥組、B藥組及安慰劑組。研究者設(shè)置的三個區(qū)組長度(5、10、15),運行變化區(qū)組隨機化SAS宏,得到的部分分配結(jié)果如表3所示。SAS宏調(diào)用如下: 表3 示例2變化區(qū)組隨機化的部分分配方案樣本量=200 區(qū)組長度=5 10 15 種子數(shù)=1950126168 %RdmVBsize(samplesize=200, trtnames=drugA drugA drugB drugB Placebo, blksizes=5 10 15, outrtf=D:RdmVBsize2.doc; seed=); 1.傳統(tǒng)區(qū)組隨機化存在的風(fēng)險和改進 區(qū)組的設(shè)置使得比較組間保持均衡,同時避免入組時間趨勢對受試者分配的影響,提高了試驗效率。但區(qū)組長度的設(shè)置固定且較小[12],使隨機分配序列的可預(yù)測風(fēng)險增加并可能提前被揭秘,進而產(chǎn)生選擇偏倚。若應(yīng)用于開放性RCT,盲法的缺失會進一步增加可預(yù)測風(fēng)險,產(chǎn)生更嚴(yán)重的選擇偏倚。Rosenberger和Lachin提出以隨機變化的區(qū)組長度取代固定的區(qū)組大小,即使相關(guān)人員知曉區(qū)組長度也無法預(yù)測分配序列[13]。既往研究表明,變化區(qū)組隨機化的區(qū)組長度不小于相應(yīng)傳統(tǒng)區(qū)組隨機化時,前者的不可預(yù)測性明顯優(yōu)于后者[7],在多數(shù)醫(yī)療器械或外科手術(shù)類開放性臨床試驗中更加適用。 2.既往區(qū)組隨機化SAS編程思路及局限 臨床試驗實際工作中,通常采用權(quán)威的SAS統(tǒng)計軟件編程生成隨機化序列。Lei Li結(jié)合隨機化過程proc plan和if函數(shù)實現(xiàn)變化區(qū)組隨機化[8],其編程思路主要是:①重復(fù)執(zhí)行proc plan語句產(chǎn)生不同區(qū)組長度的區(qū)組的組內(nèi)序列,并整合分配序列數(shù)據(jù)集;②通過if函數(shù)指定各序列號的受試者入組。該編程思路存在一定局限:該SAS程序非宏程序,使用過程需要修改多處程序,智能化欠佳;使用者需要提前計算相關(guān)參數(shù),確保產(chǎn)生的序列數(shù)量與研究預(yù)設(shè)樣本量相等;區(qū)組長度的分配非隨機,即通過proc plan語句同時輸出區(qū)組長度相同的區(qū)組的組內(nèi)序列,導(dǎo)致最終分配方案中,區(qū)組長度相同的區(qū)組接連進行分組。 Jimmy Efird的變化區(qū)組隨機化SAS宏較簡潔[9],其編程思路如下:①區(qū)組長度隨機分配:ranuni函數(shù)產(chǎn)生并分配給區(qū)組隨機數(shù),if函數(shù)根據(jù)隨機數(shù)大小從預(yù)設(shè)區(qū)組長度中選取一個,作為該區(qū)組的區(qū)組長度;②區(qū)組內(nèi)序列確定:循環(huán)語句和ranuni函數(shù)聯(lián)用,逐一分配隨機數(shù),隨機數(shù)排序后得到區(qū)組內(nèi)序列;③分配入組:構(gòu)建序列與區(qū)組長度一半比較的不等式,將受試者以1∶1分配至不同處理組;④循環(huán)輸出各中心的各區(qū)組序列。Jimmy Efird的SAS宏,使用較繁瑣,需要在宏程序內(nèi)部修改多處參數(shù);區(qū)組長度的分配方法易出現(xiàn)序列數(shù)量與樣本量不一致的問題。此外,只能預(yù)設(shè)三個區(qū)組長度且并未整合所有區(qū)組的序列,不利于結(jié)果的重現(xiàn)。國內(nèi)學(xué)者的宏程序和Jimmy Efird的主要編程思路一致,程序語句和函數(shù)略有差異[7]。以uniform函數(shù)聯(lián)用產(chǎn)生隨機數(shù),接著proc rank語句進行排序并輸出區(qū)組內(nèi)序列。該宏程序冗長且可讀性欠佳;區(qū)組長度選擇少,只能預(yù)設(shè)兩個區(qū)組長度,其中一個已固定為2,區(qū)組長度小,不可預(yù)測較差。 由上可見,既往報道的變化區(qū)組SAS實現(xiàn)程序存在如下不足:無法滿足自動生成種子數(shù)并據(jù)此種子數(shù)重現(xiàn)分組的需求,不能對生成的隨機序列進行核驗;僅適用于平行組設(shè)計(1∶1)的RCT,適用范圍較窄;程序本身并非完全自動化,參數(shù)需在宏程序內(nèi)部進行修改和填寫。 3.其他軟件變化區(qū)組隨機化的實現(xiàn) 除SAS外其他統(tǒng)計軟件也有實現(xiàn)變化區(qū)組隨機化的相關(guān)程序。R語言中的隨機化程序包randomizeR,內(nèi)含能夠?qū)崿F(xiàn)變化區(qū)組隨機化的程序rpbrPar[14]。程序中blockrand函數(shù)能夠通過設(shè)置不同的參數(shù)實現(xiàn)區(qū)組長度隨機化分配,但它可能導(dǎo)致組間比例分布不均,以及產(chǎn)生的隨機化序列可能會超過預(yù)先指定的樣本大小,而且無法自動生成種子數(shù)。另一個程序包randomizr也存在類似問題[15]。Stata中也有實現(xiàn)變化區(qū)組隨機化的類似程序,但同樣可能會產(chǎn)生序列過多的問題[16]。 4.本文SAS宏的優(yōu)勢 本文SAS宏具體編寫過程前文已展示,其主要編程思路及相應(yīng)優(yōu)勢如下。①核驗宏變量和生成程序參數(shù):檢驗宏變量的輸入格式,確保程序正確運行;根據(jù)系統(tǒng)時間自動生成隨機化種子數(shù),提取預(yù)設(shè)的區(qū)組長度。②區(qū)組長度的隨機選擇:各區(qū)組通過循環(huán)語句和MOD函數(shù)從預(yù)設(shè)的區(qū)組長度中隨機選取一個,作為該區(qū)組的區(qū)組長度;比較區(qū)組長度的總和與樣本量的大小,判斷是否停止循環(huán),確保二者的一致性。③確定各區(qū)組內(nèi)序列:循環(huán)語句和ranuni函數(shù)聯(lián)用,逐一分配隨機數(shù),proc rank語句輸出區(qū)組內(nèi)序列。④分配入組:宏變量trtnames既能表示處理組數(shù),也能體現(xiàn)各處理組樣本量的比例。結(jié)合循環(huán)語句,使程序不再局限于雙臂(1∶1)RCT的受試者分配,能夠?qū)崿F(xiàn)多臂及各比較組不同比例RCT的受試者隨機化分配。⑤輸出分配方案:方案輸出過程,自動生成的隨機化種子數(shù)將顯示于隨機分配表的副標(biāo)題。倘若有重現(xiàn)性需求,在宏變量seed處輸入此前自動生成的種子數(shù),即可重現(xiàn)隨機序列。 目前,隨機對照臨床試驗常常是多中心臨床試驗,且各中心樣本量一般不相等。為此,可以根據(jù)方案中各中心樣本量分別設(shè)置相關(guān)參數(shù)分別執(zhí)行本宏,可以生成相應(yīng)的分配方案。該SAS宏的使用可能隨機出現(xiàn)小區(qū)組的情況,即最后一個區(qū)組的區(qū)組長度小于研究者預(yù)設(shè)的區(qū)組長度。但試驗相關(guān)人員無法知曉是否存在該區(qū)組,且該小區(qū)組的區(qū)組長度仍為比較組倍數(shù),同樣能將受試者以既定比例均衡分配至各組,并不會破壞預(yù)期的隨機分配比例和均衡性。 總之,變化區(qū)組隨機化通過提高隨機分配序列的不可預(yù)測性,盡可能避免受試者隨機入組階段選擇偏倚的產(chǎn)生,盡可能確保隨機對照試驗尤其是開放性臨床試驗研究結(jié)果的真實性。本文的SAS宏可以很方便地實現(xiàn)變化區(qū)組隨機化,可以滿足實際臨床研究中各組比例多樣化的需求,而且滿足隨機分配序列可重現(xiàn)性的要求,提升了程序的適用性和應(yīng)用的規(guī)范性。結(jié) 果
討 論