東南大學公共衛生學院流行病與衛生統計學系(210009)
秦 揚 潘俊霞 劉 沛△
【提 要】 目的 為利用SAS圖形模板語言(graph template language,GTL)實現疫苗臨床試驗統計制圖的自動化提供方法學參考,以提高臨床試驗制圖效率,降低宏程序使用門檻提供便利。方法 利用SAS強大的數據處理能力、SAS GTL靈活的圖形展現能力構建SAS宏程序,結合excel參數表,實現臨床試驗批量自動化制圖功能。結果 通過SAS自動化宏程序批量繪制疫苗臨床試驗中兩種特殊圖形:實驗室指標基線隨訪散點圖和不良事件發生率及相對風險圖。結論 利用SAS數據處理、GTL圖形輸出可構建SAS宏程序,結合excel參數表可實現臨床試驗制圖的批量自動化。
在疫苗臨床試驗統計分析報告中,將統計結果以圖形方式呈現,不僅可縮短報告篇幅,而且能重點突出試驗的關鍵信息,常常起到畫龍點睛之作用。目前統計制圖已有較多工具,如excel、R、Graphpad Prism等軟件。這些工具雖然各有特色和優勢,但均需要從SAS中導出相應數據集實現繪圖。在臨床試驗中,歐美發達國家及我國CFDA均推薦使用SAS進行統計分析,統計報告中的制圖數據需要來自SAS軟件的分析結果。如果利用以上制圖軟件繪圖,需要將SAS產生的結果數據導出至該軟件,一方面使結果表達的可溯源性受到了挑戰,另一方面也容易出現軟件兼容與更多意外的風險。更為重要的是,由于臨床試驗一次往往需要產生幾十甚至上百張圖表,反復修改宏參數極易出現人為操作失誤等問題,不斷調試宏程序也需要花費時間和人力。
在我國衛生統計學界,SAS雖然一直是統計分析的權威軟件,但其繪圖功能一直被認為不夠完善。值得注意的是,自SAS9.2推出ODS Graphics System以來,改變了這種局面。而最新的SAS9.4無論是在繪圖類型與繪圖功能的細節方面均進行了擴展和完善,這些特點都為自定義編制SAS宏,實現自動化的圖形輸出提供了便利條件。本文針對目前國內缺乏SAS GTL介紹的情況下,在介紹GTL基本功能的基礎上,通過構建SAS宏程序并結合excel參數賦值實現統計制圖自動化,以期為提高臨床試驗制圖效率,降低宏程序使用門檻提供便利。
SAS作為一款優秀的統計分析軟件,其統計繪圖功能卻一直為人詬病,直到SAS9.2 ODS Graphics System的推出改變了這種局面。與傳統的SAS GRAPH繪圖模塊相比,ODS Graphics采用模板驅動的原理,利用ODS系統讀取繪圖模板、樣式模板及相應的數據以實現圖形的輸出[1]。另外,SAS ODS graphics system從9.3版本之后并入Base模塊,意味著無需額外付費即可使用。更重要的是,ODS graphics將所有圖形的繪制都統一至同一過程步,使其語法變得更加簡潔統一,其核心GTL更是利用“blocks”概念實現了代碼內部的邏輯控制。ODS Graphics模塊包括三個部分:SG繪圖過程步(Statistical Graphics Procedures,SG Procedures)、ODS圖形設計器(ODS Graphics Designer)和ODS圖形編輯器(ODS Graphics Editor),而GTL則是整個模塊最底層的支持代碼。其中,SG過程步可實現基本圖形的輸出,ODS Graphics Designer利用菜單式點選實現作圖,ODS Graphics Editor則在后期對圖形進行簡單的編輯。直接利用GTL繪圖可定制更加靈活的個性化圖形,它以一定程度的程序復雜性實現更加靈活的圖形元素修改。GTL的語法簡潔統一,其圖形實現可分為以下兩個步驟:
步驟1:編譯(compile)
proc template;
define statgraphtemplate-name;/*定義圖形模板名稱*/
begingraph;/*開始圖形繪制*/
GTL-statements;/*圖形參數修改*/
endgraph;/*結束圖形繪制*/
end;/*結束模板定義*/
步驟2:執行(execute)
proc sgrenderdata=data-source/*定義數據集名稱*/template=template-name/*定義模板名稱*/;
即首先自定義圖形模板,提交后得以編譯存儲,再結合作圖數據對象創建圖形輸出。可以看到,相比傳統的Graph繪圖模塊,GTL的語法更為簡潔,并在繪圖模板定義時呈現出代碼塊嵌套的特點。所謂代碼塊(Blocks),即一對對稱的繪圖語句,它標志著特定功能代碼的開始與結束。比如面的define statgraph語句與end語句、begingraph語句與endgraph語句的成對存在。另外,GTL語句的書寫也符合代碼塊的特點,如layout語句與endlayout語句、cell語句與endcell語句等。代碼塊的相互嵌套是不可逆的,比如layout語句必須嵌套在begingraph代碼塊當中,cell語句必須嵌套在layout語句當中。“block”概念的存在使得程序的可讀性大大增加,需要注意的是GTL也給這種嵌套以一定的規則。GTL-statements是可變代碼,它包括布局語句(layout_statements)與圖形元素語句。其中,圖形元素可包括形狀、圖例與文字元素等。GTL允許自由地進行圖形布局設計,利用三類布局模板(layout statements)可分別創建頁面單圖、多圖和分類面板圖;不同的統計圖形選擇不同的作圖語句(plotstatements),同時指定相應的圖形參數選項;利用圖例語句(legendstatements)、文字語句(textstatements)及相應的選項可為圖形指定圖例與相應文字如標題、腳注等。
需要明確的是,ODS Graphics輸出的圖形為模板驅動圖形,sg過程步通過調用繪圖數據對象、加載已編譯存儲的繪圖模板,并采用當前ODS destination指定的樣式模板,再輸出終端繪制圖形。因此ODS繪圖時必須至少存在一個活動的ODS終端。我們通過ODS語句指定圖片路徑、ODS Graphics語句指定圖片屬性如圖片名稱、格式、分辨率等,從而在ODS終端輸出高質素的標量、矢量統計圖形。
1.制圖宏程序的建立
與excel、GraphPad不同的是,通過調用自定義的SAS宏程序[2-3],我們可以避免同類型圖形的手工重復制圖。本研究制圖宏程序分為三部分:數據處理、GTL繪圖與ODS輸出控制。
EpiData庫或電子數據采集(electric data capture,EDC)中的臨床試驗數據經導出、初步處理成源數據后可調用宏程序,經宏中數據處理部分成為GTL所需的作圖數據集,即sg render過程步的data_source。提交GTL模板定義實現編譯查錯并存儲,Sg render過程步將數據對象與模板定義相結合生成圖形結果,同時利用ODS系統將圖形輸出為特定格式,可指定相應的輸出樣式、輸出路徑等。ODS輸出樣式與圖形模板定義共同影響圖形的表現。利用ODS系統,我們可以指定是否生成單獨的圖片格式文件或者將圖形作為輸出的一部分、圖形為標量還是矢量圖以及圖形的具體物理屬性如路徑、名稱、格式等。宏內參數包括三種,一般參數、傳遞參數與圖形參數。一般參數指圖形的名稱、格式、存儲路徑等全局宏變量;傳遞參數則是指作圖數據集、作圖參數;圖形參數則是一些可變的圖形屬性如圖片標題、軸標簽、不同組別線型、顏色等。
2.SAS與excel參數表的連接[4]
在實際操作過程當中,每輸出一張圖形需要調用一次宏程序,并修改圖形參數。當輸出大量圖形時,頻繁的調用將導致出錯的風險增多。以excel外部參數表的形式統一整理繪圖宏參數并實現修改,可實現批量出圖并降低宏程序使用難度。通過將excel參數表以SAS數據集的形式導入SAS宏程序,從而實現了對GTL程序中宏變量的批量賦值與修改,詳見表1。

表1 某臨床試驗的excel參數表模板(節選)
使用者可直接根據參數表中對宏參數的描述修改對應宏參數,通過修改value1-N列的對應參數值,可同時批量輸出N張不同的圖形。
1.實驗室指標基線隨訪散點圖
實驗室指標基線隨訪散點圖采用矩陣圖的表現形式,在同一圖形面板中完整地展示了受試者不同實驗室指標在不同時間點的變動情況[5]。實驗室指標矩陣圖可以視為臨床試驗報告中正常異常交叉表的圖形化表達,以矩陣圖中散點直觀展示的可視化技術取代了表格的籠統概述,形象地突出了安全性分析中的異常信號。圖1顯示的是某臨床試驗受試者第3天、7天、14天、28天部分血常規、血生化指標與基線的對比情況。

圖1 部分血常規/血生化指標基線隨訪散點圖
圖中指示線為相應指標的正常值上限(upper limit of normal,ULN)可作為個體正常、異常值的分界。我們選取部分適宜制圖的血常規、血生化指標進行展示,并在數據處理階段對異常無臨床意義的值進行了剔除。即顯示異常的個體均為有臨床意義的個體,這些個體的篩選號被直觀標識出來。如圖可見,篩選號為S074的個體在第7天出現了谷丙轉氨酶的升高,在第14天呈現出谷丙轉氨酶的持續升高并伴有總膽紅素的升高,提示肝功能嚴重受損。對于這樣的個體,在安全性評價中應重點關注,追溯其異常是否與干預措施有關。
實驗室指標基線隨訪散點圖制圖的具體步驟:
1.填寫參數表:
填寫相應的外部參數表以修改必要的圖形屬性參數。
2.調用制圖宏:
通過修改宏內參數值以實現制圖,其中exceladdress為參數表位置:%datapanel(exceladdress=%str(D:assignmentsas-drawing參數表.xlsx),sheet=格子圖)
3.宏內GTL模板定義:
proc template;
define statgraph datapanel;/*圖形模板定義*/
mvar TITLE ROWVAR COLUMNVAR START HEADERLABELDISPLAY XLABEL XTYPE YLABEL YTYPE X Y GROUP DATALABEL REFERCENCELINEVALUE1 REFERCENCELINEVALUE2 BORDER OPAQUE LINECOLOR1 LINECOLOR2;/*聲明宏變量*/
nmvar LINEPATTERN1 LINETHICKNESS1 LINEPATTERN2 LINETHICKNESS2;
begingraph;
entryfootnote TITLE;/*定義腳注*/
layout datalattice rowvar=ROWVAR columnvar=COLUMNVAR/start=START headerlabeldisplay=HEADERLABELDISPLAY rowaxisopts=(display=(XLINEDISPLAY XLABELDISPLAY XTICKSDISPLAY XTICKVALUESDISPLAY)type=XTYPE linearopts=(thresholdmax=1)label=XLABEL labelattrs=(size=9pt))columnaxisopts=(display=(XLINEDISPLAY XLABELDISPLAY XTICKSDISPLAY XTICKVALUESDISPLAY)type=YTYPE linearopts=(thresholdmax=1)label=YLABEL labelattrs=(size=9pt));/*格子圖分類變量定義及軸選項*/
layout prototype;/*格子圖內容定義*/
scatterplot x=X y=Y/group=GROUP name=“datapanel”
datalabel=DATALABEL;/*散點圖定義*/
referenceline REFERCENCELINEVALUE1/lineattrs=
(color=LINECOLOR1 pattern=LINEPATTERN1 thickness=LINETHICKNESS1 pt);/*輔助線定義*/
referenceline REFERCENCELINEVALUE2/lineattrs=
(color=LINECOLOR2 pattern=LINEPATTERN2 thickness=LINETHICKNESS2 pt);
endlayout;
sidebar;
discretelegend “datapanel”/border=BORDER opaque=OPAQUE;/*圖例定義*/
endsidebar;
endlayout;
endgraph;
end;
run;
2.不良事件發生率及相對風險圖
不良事件發生率及相對風險圖在臨床試驗不良事件描述中利用傳統的森林圖[6],通過計算組間效應量RR及其95%可信區間,直觀展現了所關注的不良事件發生率與相應的組間差異。另外,還可以進行縱向間不良事件發生的比較。根據研究目的,在森林圖中按照一定規律對不良事件進行排序,可以直觀、突出地顯示最需要關注的不良事件。本例中我們以不良反應發生率的總和作為排序的標準。圖2顯示的是某臨床試驗中28天非征集不良事件的發生率與組間差異情況。

圖2 不良事件發生率及相對風險圖
圖中將不良事件發生率以從高到低的順序排序,右側顯示了不良事件不同劑量組間的RR值及其95%置信區間。由圖可見,RR=1的標識線穿過所有不良事件的95%置信區間范圍,提示不良事件組間差異無統計學意義。
繪制不良事件發生率及相對風險圖的具體步驟:
1.填寫參數表:
2.調用制圖宏:
通過修改宏內參數值以實現制圖,其中exceladdress為參數表位置:%forest(exceladdress=D:assignmentsas-drawing參數表.xlsx,sheet=多框圖,group=group,zzname=zzname,group1=高劑量組,group2=低劑量組)
3.宏內數據處理與ODS控制代碼:
(1)數據處理:
/*分析數據集>制圖集*/
ods trace on;
ods output CrossTabFreqs=p(keep=&group.&zzname.rowpercent frequency rename=(rowpercent=p)where=(not missing(&group.)and not missing(&zzname.)))CrossTabFreqs=percent(keep=percent &zzname.);
proc freq;
tables &group.*&ZZNAME.;
run;
ods output close;
/*生成p和rr*/
data p1;
set p(rename=(frequency=a)where=(&group.="&group1."));
run;
data p2;
set p(rename=(&group.=group1 p=p1 frequency=c)where=(group1="&group2."));
run;
data _temper;
merge p1 p2;
run;
data rr(keep=&zzname.rr lowerrr upperrr where=(not missing(rr)));
set _temper;
b=32-a;
d=33-c;
rr=p/p1;
SE=1/a+1/b +1/c +1/d;
lowerrr=exp(log(RR)-1.96 *SE);
upperrr=exp(log(RR)+1.96 *SE);
run;
/*p和rr連接*/
proc sql;
create table unsort_forest as
select rr.*,&group.,p
from rr left join p
on rr.&zzname.=p.&zzname.;
/*排序Ae*/
data percent;
set percent(firstobs=37 obs=53);
run;
proc sort data=percent;
by descending percent;
run;
data percent;
set percent;
id=_n_;
run;
proc sql;
create table forest as
select unsort_forest.*
from unsort_forest left join percent
on percent.&zzname.=unsort_forest.&zzname.
order by id;
(2) ODS控制語句:
ods graphics/reset imagename=“&title.”noborder outputfmt=&outputfmt.width=&width.height=&height.;/*控制圖形屬性*/
ods _all_ close;/*關閉所有ODS目標*/
ods listing gpath="&gpath."style=&style.;/*只打開listing目標,控制圖形屬性*/
proc sgrender data=&data.template=forest;
run;
ods listing close;/*listing目標關閉*/
ods html;
ODS Graphics是SAS 9.2新推出的繪圖模塊,它顛覆了人們對于SAS制圖的認知。而圖形模板語言GTL是ODS Graphics System最底層的作圖代碼,它可以實現幾乎所有繪圖元素的修改。國外對于SAS GTL的介紹大多見于SAS相關會議,而國內GTL的應用文章也不多見。本研究以疫苗臨床試驗中兩種特殊圖形為例,介紹了SAS 9.4最新版本中不同圖形的SAS GTL代碼編寫及宏程序實現過程,并結合excel參數表批量賦值實現了圖形輸出自動化。GTL通過在template過程步中變換作圖語句及相應參數指定繪圖模板,編譯后結合sgrender過程步指定作圖數據實現制圖。其語法結構規范統一,代碼塊間相互嵌套,可讀性強且代碼量少。與傳統的Graph繪圖模塊相比,它將不同種類圖形的繪制匯總至同一過程步,克服了繪圖過程步分散、繪圖代碼風格混亂的缺點。需要注意的是,GTL的靈活性與復雜性相伴,大量的圖形選項[7]是學習的重點與難點。另外,利用excel參數表與宏的結合,我們可以規范化、批量化指定宏參數,這樣不僅減輕了使用者的宏程序修改難度,同時也有助于實現臨床試驗圖形制作的自動化。