近期受託處理客戶申請的臺灣人體生物資料庫全基因體定型資料(Whole-genome genotyping),此資料庫研究個案計27000人;欲納入檢驗之情感性精神疾患相關基因序列亦有近13000組。我們在不斷試誤此研究個案甚多、檢驗變項也甚多的資料後,深感精煉精確的建置統計語法的重要性,在此分享我們的分析經驗,提供大家後續面對大筆資料時可以使用有效率且節省系統資源的處理方式。
猶記第一步要跑出個案逐個基因型分布(proc freq),以定義出主要表現型或是次要表現型就卡關甚久,我們第一版的語法
%macro gene(x,y);
ods output OneWayFreqs=a.freq_&y.;
proc freq data=a.genedata;
table gene_&x.;
run;
ods output close;
%mend;
%gene(rs7922016,1);
%gene(rs79221181,2);
........
%gene(rs7922387,13000);
上述語法的最大的問題在於跑語法過程會產生無數的暫存檔,當單個資料夾的SAS檔案一超過百個,就會拖慢運算速度,以致用此語法的資料運算估計時間越拉越長(約需9-10天才跑得完13000組基因頻率表),語法不修不行,二版語法的修改重點
- 「基本檔案」建立後,「後續生成檔案」使用疊代法一一套疊進去「基本檔案」,使整個運算過程中僅會產生「基本檔案」及「後續生成檔案」兩個檔案,不會產生過多暫存檔。
- 善用SAS語法中的%macro ; %do n=2 %to XXXXX,將基因的命名序位化,取名為gene_1, gene_2,……..gene_XXXXX,SAS在抓取欄位時可更有效率。
ods output OneWayFreqs=freq;
proc freq data=a.genea;
table gene_1; /*基因命名序位化*/
run;
ods output close;
data freq ; set freq;
length name $ 10. ;
name="gene_1" ;
run ;
proc sort data=freq;
by name Frequency ;run;
data a.freq_all; set freq; /*基本檔案*/
by name;
if last.name;
run;
%macro ma ;
%do n=2 %to 13000;
ods output OneWayFreqs=freq;
proc freq data=a.genedata;
table gene_&n.;
run;
ods output close;
data freq ; set freq;
length name $ 10. ;
name="gene_&n." ;
run ;
proc sort data=freq;
by name Frequency ;run;
data a.freq; set freq; /*後續生成檔案*/
by name;
if last.name;
run;
data a.freq_all; set a.freq_all a.freq;run; /*疊代法: 「後續生成檔案」依序一一疊代覆蓋「基本檔案」*/
%end;
%mend;
%ma ;
改用第二版語法,分析時間大大縮減為2天左右。此方法亦可應用於推論統計如邏輯斯迴歸或存活分析等等。讀者可以動手試試,祝各位語法書寫順利,報表順利產出。