【SAS系列】 SAS新手的第一步:SAS的基礎規則與本系列的臨床試驗資料
「學SAS之前先搞懂規則和資料,不然後面每一步都會像踩到樂高一樣痛。」
這篇文章帶你從零開始認識SAS,先理解語法規則,再熟悉後續會使用的臨床試驗模擬資料,這不是教科書,而是我自己一路摸索後整理出的「新手友善版」SAS入門指南系列文章的第二篇。內容包含:
- SAS的四大功能到底在做什麼:
- 用很白話的方式理解資料進入、資料管理、資料分析、資料呈現
- 讓你知道 SAS 其實就是一間資料加工廠
- SAS語法規則的基本功:
- 變項命名怎麼取才不會讓SAS生氣
- 缺值長什麼樣子、分號為什麼這麼重要
- RUN和QUIT的差別用生活化方式講清楚
- DATA與PROC兩個Statement的分工:
- DATA:負責整理資料
- PROC:負責分析資料
- Dataset的兩種面貌:
- Descriptor portion:資料的身分證
- Data portion:真正的觀測值
- 本系列使用的臨床試驗模擬資料介紹:
- DM、EX、CM、VS、AE 五大資料表的用途
- 每個資料表的欄位邏輯與常見錯誤
- 讓你之後練習資料清理時更有感覺
目錄
前言
SAS的四大功能:SAS到底在做什麼?
SAS程式語法的基本規則
Dataset的結構:Descriptor portion vs Data portion
本系列使用的臨床試驗資料
結語和預告
FAQ
前言
雖然過了許久,不過在上一篇的SAS系列文章中,我們一起完成了SAS Studio的帳號申請以及登入,因為時間有點久遠了,這邊提供上一篇的連結幫你回憶一下XD。
當你申請完了SAS Studio的帳號,從那一刻開始你就已經正式站在了SAS的入口了。
而在接下來的這篇文章中,我想要陪你做兩件事情:
第一件事情是,把SAS這個分析軟體他的基本規則打好基礎,這些基本規則如果沒有注意到的話,他會在後面寫程式的時候或多或少會有一些「小麻煩」,提前先有認知的話,會讓你在後面寫程式的時候更有方向感。
第二件事情是,我們要花一點時間與篇幅來介紹後面幾個系列會使用到的虛擬分析資料,因為從下一篇開始,你會跟這份資料一起成長。
附帶一提,這整個系列後續都會以SAS Studio作為主要的操作環境,所有的示範、截圖和資料處理都會在SAS Studio裡面完成。
有些使用者可能可以使用的是SAS Base或是SAS EG,不過這兩個其實就是差別在介面的長相不太相同,其他其實是大同小異的,觀念彼此可以互通。
也因此在SAS Studio裡面學習到的觀念、知識與分析方法,其實一樣可以在SAS EG還有SAS Base裡面做操作。
你只需要跟著文章的節奏,一步一步往前走就好。
SAS的四大功能:SAS到底在做什麼?
你接觸到SAS的契機是什麼呢?最早以前我接觸到SAS是在學校上生物統計課的時候,當時有「上機」的要求,需要把課本上面學習到的統計分析知識,使用SAS來協助分析。
我記得在一開始接觸到SAS的時候,不管是對於他的介面也好、coding的方式也好,都覺得非常陌生難以親近,甚至是有點困擾的。
經歷過了一段不小時間的摸索以後,總算讓自己比較可以擅長應用SAS,甚至可以靠這一個技能吃上飯了。
這樣的困擾,也是促成了為什麼會想要寫這篇文章的原因。
因此,我完全可以體會當你剛開始接觸SAS的時候,一定會覺得有距離感。
但其實SAS的核心功能非常直覺,基本上可以用四句話來理解:
資料進入(Data Access)
要進行後續所有的動作,自然需要準備資料。
不管這個資料是屬於臨床試驗的資料、環境監測的資料等等,只是要來自於現象的觀察,都是屬於SAS可以分析的資料的一個種類。
當然SAS本身也提供許多資料種類可以帶入系統,不管你是.csv檔案、.xlsx檔案、資料庫等等,都是可以透過不同的方式將資料「匯入」SAS系統中。
因此所謂的資料進入的功能,說白了就是把資料帶進SAS中。
資料管理(Data Management)
我們可能會得到很多不同的資料表,或是品質不好的資料、不合理的資料等等,因此在真正進到最後的統計分析以前,我們必須要把資料透過一定程序的清理、轉換、合併、切割、分類、補值、偵錯等。
而這些資料的清理過程可能會有數學理論知識支撐我們怎麼處理(像是超過幾倍標準差),或是有其他領域的知識協助我們處理(小於偵測極限的數值)等等。
資料的管理除了仰賴SAS本身的coding技術以外,還會仰賴對於每一種不同資料的敏銳度。
資料管理的部分,是SAS這個軟體相對來說很強悍的地方,以我自己來說也是最有趣的跟最有挑戰的地方。
如果可以把一個資料清理乾淨到可以進行後續的分析,是很考驗一個SAS programmer的知識跟技術。
資料分析(Data Analysis)
我們之所以會需要前面兩個步驟,其實最重要的就是為了要做這一個步驟的統計分析。
同時也是教科書上面著墨最多的地方,不管是描述性的統計分析像是求平均值、標準差、信賴區間等等,或是推論統計分析像是假設檢定、迴歸、多變量、時間序列等等的分析,都是SAS可以進行的。
但需要注意的事情是,好的資料分析的結果是建立在高品質的資料之上。
因此我們不會說資料分析會比資料管理重要,而是這兩個是同等重要的。
資料呈現(Data Presentation)
而當分析完了資料以後,我們可能會需要把分析的結果呈現出來。
而有時候的分析結果未必會是終點,很有可能我們會需要利用這個分析結果來進一步進行下一個階段的資料管理與分析。
最典型的例子就像是我們會求得某個資料的平均值以後,進一步利用這個平均值來做額外的分析。
因此除了輸出表格、整理圖表這種圖形化的內容以外,我們甚至很有可能需要匯出的是Excel的.xlsx檔案或.csv的檔案,也有可能需要匯出成特定的資料庫讓SAS可以進一步擷取到特定的數值。
這個部份雖然不是一般來說會特別強調的SAS的強項,但是如果能夠學會怎麼有效匯出資料,那會是特別特別強悍的資料處理技巧。
一言以蔽之,你可以把SAS想像成是一個完整的資料處理工廠:資料進來 → 整理 → 分析 → 輸出,就是他要做的事情。
SAS程式語法的基本規則
在看完了前面以後,我猜你已經躍躍欲試的想要開始你的SAS的coding之旅了,但是先別急,在開始寫程式以前,我想先陪你把SAS的語法規則和注意事項先釐清好。
這些規則雖然看起來很基本,但是他們會陪你走完整個系列的文章,直到你SAS旅程的最後一刻。
SAS中的變項命名規則
SAS中的變項,指得是用來儲存每一筆資料的欄位名稱與內容,目前在SAS的規範中SAS變項的名稱只能包含以下:
- 英文字母。
- 數字。
- 底線「_」。
- 而且對於變項的命名有以下的幾個限制:
- 不能使用數字做為開頭。
- 變項的命名最多32個字元。
因此可以被接受的變項名稱如下:
Age
Visit_Date
_AEcount
Height_cm
但是像以下的變項名稱基本上來說就是不被允許的:
$Amount
Drug-Name
123Value
附帶一提,SAS自己也會使用底線開頭的名稱作為變項,最典型的就是在統計結果中表示個數的「_N_」。
所以如果你自己也會用底線開頭的變項的話,要注意不要跟SAS內建的常用變項名稱混淆了。
資料缺值的表示方式
在SAS中,資料缺值指得是某個變項在觀測資料中沒有有效的值。
在文字變項中,資料缺值會直接顯示為「 」也就是空白,但是在數字變項中,資料缺值則是現呈現「.」。
這樣的表示方式在做資料的清理與確認的時候會非常有用,因為有一些分析後續只能夠使用特定種類的資料,這樣的缺值表示方式可以讓我們清楚知道資料的類型。
分號的重要性
在SAS裡面每一段敘述我們會稱之為「Statement」,他是指用來告訴SAS要執行什麼動作的程式語句,作為SAS程式基本單位語法的基本單位。
每一個Statement都有對應特定的功能,很可能是輸入資料或讀取資料、定義變數或是進行分析等等。
而每一個Statement都必須要用「;」來做結尾,否則SAS就會把下一行敘述也吃進去,然後log就會出現一堆錯誤了。
這邊示範一個應該要有分號但是沒有分號的時候,log會發生什麼事情,我前面先吃了一筆示範用的簡化資料,然後我嘗試使用SORT這個Statement來做排序。
DATA test;
INPUT name $ student $ before after;
CARDS;
voice S3 4 7
rice S1 3 12
;
RUN;
PROC SORT DATA=test /*這裡本來應該要有分號*/
BY name student /*這裡也本來應該要有分號*/
RUN;
然後你就會發現跑出來的log紀錄會有很多紅色的部分,就是報錯。
RUN和QUIT之間的差異
在SAS裡面,RUN跟QUIT扮演著不同的角色。
「RUN;」本身是用來啟動一段DATA Step或PROC Step的執行,是SAS用來判定「這段程式已經寫完,可以開始跑了」的訊號。
多數的情況下,就算你忘記寫「RUN;」在程式的尾端,SAS也會在讀到下一段程式碼時自動補上,讓前一段能順利執行。
但如果這段程式碼剛好位於所有程式碼的最後,因為SAS沒有辦法再往後找了,SAS就不會自動替你補上「RUN;」來做執行。
不過在比較近期的版本,對於比較大型的程式SAS還是會在後面自動補上「RUN;」讓程式去執行,沒有這麼嚴格了。
DATA test;
INPUT name $ student $ before after;
CARDS;
voice S3 4 7
rice S1 3 12
;
PROC SORT DATA=test;
BY name student;
RUN;
從上面的code你就可以知道,就算DATA Step裡面本身沒有「RUN;」,但是因為往下找還可以找到PROC SORT的Statement有,所以程式還是會執行。
相較之下,「QUIT;」的功能並不是執行,而是結束。
有一些PROC的Step,像是PROC SQL等,會進入一種持續等待指令的互動模式,SAS會假設你還會輸入更多語句,因此不會自動結束這些程序。
這個時候就必須要很明確的指令告訴SAS:「這個PROC已經完成,可以關閉了。」
並不是所有的PROC都會需要「QUIT;」,只有特定會持許等待的程序才會需要。
簡單來說,「RUN;」是讓SAS開始執行一段程序,而「QUIT;」則是用來結束某一些不會自動停止的PROC。
SAS的兩大主角:DATA和PROC Step
在SAS裡面,整個程式的運作主要會由兩種主要的區塊組成:DATA Step和PROC Step。
DATA Step主要負責的功能是處理資料,你可以在這個地方讀取原始資料、建立變數、篩選觀察值以後,產生一個新的資料集。
PROC Step則會接手這一份整理好的資料,進行分析、統計或產生報表。
理解這兩者的分工,就是掌握SAS的第一步。
/*下面是DATA Step*/
DATA test;
INPUT name $ student $ before after;
CARDS;
voice S3 4 7
rice S1 3 12
;
RUN;
/*下面是PROC Step*/
PROC SORT DATA=test;
BY name student;
RUN;
Dataset的結構:Descriptor portion vs Data portion
在SAS裡面,Dataset基本上就是分析的核心,我們會有不同的變項,以及每一筆觀察值在不同變項的內容。
在不涉及到描述性統計分析下,Dataset本身有兩種不同呈現資訊的形式:
描述資料的資訊(Descriptor portion)
描述資料的資訊比較像是在說明這個資料本身有些什麼東西,讓你比較可以知道整個Dataset的樣貌。
他會包含以下的資訊:
- Dataset的名稱。
- Dataset的建立時間。
- Dataset裡面的變項數量。
- Dataset裡面觀測值的數量:也就是列的數量。
- Dataset每一個變項的類型、長度和格式。
關於資料的描述資訊,我們可以利用PROC CONTENTS這個程序來做查看,後續會提到相關的用法,這一篇文章中我們先讓你看一下跑出來的畫面。
真正的資料內容(Data portion)
真正的資料內容,就是會有一筆一筆觀測值的資料,他的第一列會是變項的名稱,而往下的每一列都是每一筆的觀測值。
下圖是一張隨意找的資料檔,可以看到第一列就是變項的名稱,第二列開始就是一筆一筆觀測值。
你在這個真正的資料內容裡面,並沒有辦法直接看到每一個變項的詳細特性說明,但是可以很明確地看到不同觀測值,這個就是單純資料描述是做不到的。
本系列使用的臨床試驗資料
在後續的SAS介紹以及學習中,我們會介紹許多關於資料的匯入、資料的清理以及統計分析等知識與技巧。
為了方便你可以直接練習我們教的內容,我們在這邊必須要先正式介紹後續系列文章裡面可能會使用到的資料檔。
由於我自己曾經是臨床試驗產業的SAS programmer,主要比較熟悉的電子資料擷取系統(Electronic Data Capture, EDC)是原本的IBMCD,後來的Zelta。
因此方便起見,這篇文章參考了Zelta的運作方式和資料結構,「模擬」出了一個臨床試驗研究的模擬資料。
這一筆資料完全是使用Copilot並且提供特定的試驗背景下,模擬生成的資料,並無實際任何的真實數據。
讓你可以在學SAS的同時,也能夠一窺臨床試驗資料可能的長相。
不過需要特別注意的事情是,由於我已經不在臨床試驗這個產業大概有兩年的時間,雖然之後會再回歸,但有可能Zelta這個EDC本身有做調整,跟我以前的認知不太相同。
當然資料架構也會隨著臨床試驗的複雜性、選用的EDC不同而有所不同,因此我們主要的重點還是在SAS的學習上面。
至於真正的臨床試驗資料,仍然要以實際上的運作為主喔!
相關的資料檔如下,你可以先下載下來看一看資料的長相:
由於我們只是資料的練習,因此資料的模擬上會比一般的臨床試驗還要簡單非常多。
試驗資料概述
這是一份關於帶狀皰疹(Herpes Zoster)口服用藥,我們稱之為A藥品的真實世界試驗的模擬資料。
總共有60位受試者,分成用藥組(A drug)以及安慰劑組(Placebo)。
資料會包含5大不同的內容:
- DM(Demographics)人口學資料。
- EX(Exposure)投藥資料。
- CM(Concomitant Medication)伴隨用藥資料。
- VS(Visit-based efficacy)訪視資料。
- AE(Adverse Events)不良事件資料。
這個模擬的臨床試驗主要是要觀察被確診為帶狀皰疹的患者,在服用A藥品以後症狀的改善、誘發的不良事件並且比較用藥以及安慰劑的差異。
在知道這些背景以後,會讓你在後續的SAS分析學習上面會更有感覺。
另外,為了讓你可以練習資料的清理,這些資料中也刻意地加入少量的不合理值,例如:
- 日期顛倒。
- 劑量缺失或負值。
- 不良反應的時間重疊或重複。
這些錯誤其實都非常輕量,讓你可以在後面的系列文章中去練習資料清理。
接下來的每一個Dataset,我會用最簡潔的方式介紹欄位與設計的邏輯,讓你大概知道每一份資料會長什麼樣子。
DM(Demographics)人口學資料架構與介紹
人口學的資料是每一位受試者在加入試驗的時候,所留下的基本資料。
包含了我們為了確保受試者隱私因此給予的受試者編號(Subject_ID)、性別(Sex)、年齡(Age)、種族(Race),以及正式進入臨床試驗的日期(Enrollment_Date)。
當然對於一些常見紀錄的過往病史(Comorbidities),例如高血壓(Hypertension)與糖尿病(Diabetes)這些資訊也會被記錄下來。
當然,身高(Height_cm)與體重(Weight_kg)通常也會包含在這個資料裡面,因為它們可能會影響藥物代謝或劑量調整。
EX(Exposure)投藥資料架構與介紹
投藥資料本身記錄的是受試者實際上接受的治療,在這個資料中,會清楚地寫出來不同的受試者(Subject_ID)是被分配到A藥品(A drug)組還是安慰劑(Placebo)組,這個部分會是用藥物名稱的變項(Drug_Name)來做區別。
A藥品的劑量(Dose_mg)會落在250到1000(mg)之間,而安慰劑組的劑量則是0(mg)。
當然因為我們都是口服用藥的緣故,所以在途徑(Route)中不管是哪一組的內容都是口服(Oral)。
同時你也可以看到這個資料裡面會有每一位受試者開始用藥(Start_Date)與結束用藥(End_Date)的日期。
在這筆資料中我們會刻意放入一些小小的錯誤,例如劑量的缺失或是負值,讓你在資料的清理和品質檢核時可以發現異常。
將來在臨床試驗一旦進到了Go-Live以後,定期的資料就需要透過這種品質檢核來發現可能的問題,他可能會來自於第一線資料的登錄錯誤,這個時候就要發出Query來做確認。
因此學會怎麼做資料的初步品質檢核,是非常重要的一件事情。
當然啦不會只有EX資料可能會有登錄錯誤的問題,每一種資料可能都會有的。
CM(Concomitant Medication)伴隨用藥資料架構與介紹
伴隨用藥的資料裡面記錄的是受試者在試驗期間同時使用的藥物(Concomitant_Drug_Name),因為我們這個模擬的臨床試驗是關於帶狀皰疹,因此這些藥物可能會是止痛藥、抗病毒藥、抗發炎藥,甚至是疫苗接種史(Vaccination_History)。
當然我們也會記錄用藥的期間資訊(Start_Date、End_Date)。
這些藥物的記錄可能會影響到療效以及安全性,所以在臨床試驗資料的分析上是不可忽略的資訊。
當然,我們也在CM資料裡面設計了一些常見的資料品質問題,像是少數記錄有出現「結束日期比開始日期還早」的情況,這些都是臨床試驗裡面非常常見的情況。
VS(Visit-based efficacy)訪視資料架構與介紹
訪視資料一般我們會稱呼為VS資料,是以訪視的次數來記錄的資料。
試驗中的每一位受試者會在固定的時間點回診,在這個臨床試驗中每一位受試者固定會有4次的訪視要求,分別為第3天、第7天、第14天和第28天,分別會以不同的訪視次數來做記錄(Visit_No)。
受試者會在每一次的回診記錄一些和療效相關的指標,以我們模擬的試驗來說,主要有皮膚病灶的嚴重程度(Skin_Lesion_Score)、疼痛分數(Pain_Score),以及生活品質問卷的結果(PRO_QoL)。
你可以從VS的資料裡面去觀察到每一位受試者從第3天到第28天是否有逐漸改善病症,同時也可以比較A藥品組和安慰劑組之間的差異。
AE(Adverse Events)不良事件資料架構與介紹
不良事件的資料,同時也是AE的資料,記錄的是受試者在試驗期間發生的所有不良事件,不良事件的記錄是安全性分析的核心,如果有重大不良反應的時候甚至會需要通報。
我們當然希望在試驗的過程中都不要有受試者產生不良反應,但在真實的情況是,受試者或多或少還是會產生一些與治療相關,或是與治療無關的不良反應。
我們這個模擬的資料中,有不良反應本身的態樣(AE_Term),不良反應的開始時間(AE_Start_Date)和結束時間(AE_End_Date),每一筆AE都會標示嚴重程度(AE_Severity),以及是否和治療相關(AE_Relationship)。
為了後續的教學用途,我們刻意在模擬的AE資料裡面放入了重複事件和重疊事件,甚至是日期錯誤的資料,尤其是重複事件跟重疊事件,這會是在資料品質檢核上面一個很重要的練習。
結語和預告
這篇文章到了這裡,你已經大致上來說完成了兩件事情:
- 掌握了SAS語法的基本規則。
- 認識了整個系列會使用到的臨床試驗模擬資料。
下一篇文章,我們就要開始學習怎麼把資料匯入到SAS中,讓你可以看到我們模擬出來的臨床試驗資料在SAS裡面呈現的樣子。
從下一篇開始,你就會真正開始可以「動手做」。
我們慢慢來,一步一步地往前走,你會發現SAS沒有想像中那麼可怕,而且你會越來越有成就感。
那麼,我們就下一篇文章見囉!
FAQ
我剛開始學SAS,要先學什麼?
先理解語法規則(變項命名、分號、RUN/QUIT),比直接寫程式更重要。
為什麼要先介紹臨床試驗資料?
因為後面所有練習都會用到,先熟悉資料長相,寫程式才不會像在黑暗中摸索。
SAS的DATA和PROC兩個statement到底差在哪?
DATA負責整理資料,PROC負責分析資料,兩個一起合作才跑得起來。
Dataset的Descriptor portion有什麼用?
就像資料的身分證,讓你快速知道變項類型、長度、筆數等重要資訊。
這篇文章看完後,我可以開始寫SAS了嗎?
可以開始動手,我們會從下一篇開始教你怎麼把資料匯入SAS,會更有方向!
若芽🌱 / 馮馮
延伸資源推薦
馮馮/若芽的高中物理線上課程開課啦!讓從物理被死當的馮馮老師告訴你怎麼有效率的學習物理,沒有笑話、不需要雞湯,透過生動的動畫跟緩坡式的題目安排,讓你建立好的學習邏輯,從容應對大考的各種變化題。你可以只購買你最卡關的章節,用最少的時間,拿回學習的主導權,並且親手寫出第一題,讓物理成為你最得心應手的科目!
從現在就開始變強吧!





