目前分類:SAS程式編輯武功秘笈 (31)

瀏覽方式: 標題列表 簡短摘要

 

 健保資料分析時,會遇到循環性的資料處理步驟,以1:1個案配對(individual matching)的資料處理過程為例,1個暴露個案(cohort study exposure)1個病例個案(case-control study 中的 case)依特定條件配到1個對照個案,此時要將該對照個案從對照組的抽樣母體中扣除,再繼續找下一個exposurecase的對照個案,直到對照組的個案建立完成,因此是由巨集指令(Macro Language)的迴圈進行此連續動作。而扣除的方式是以身份證號(ID)以及生日(ID_birthday)做為關鍵變項(key variable),將被抽中者從抽樣母體中扣除,因此在對照組的抽樣母體中再也找不到該位病人的資料,因此不會被之後的exposurecase再抽中,以致相同的對照個案有重覆出現的情形。

 

如果在過程中,其中的一個exposurecase找不到對照個案,就毋需從對照組的抽樣母體中做任何排除的動作,但必須有程式作為判斷機制,若未抽中對照組,下一個抽樣步驟所使用的對照組之抽樣母體與前一個步驟的抽樣母體相同。但問題是,要如何判斷該進行扣除的動作,還是下一個步驟延用前一步驟的對照組抽樣母體?沒有抽中符合條件的對照個案,log視窗(日誌)中將出現類似以下的訊息:


NOTE: There were 55759 observations read from the data set F.CONTROL_1.

NOTE: The data set WORK.CONTROL_1 has 0 observations and 12 variables.

 

f.control_1為某retrospective cohort study(回溯性世代研究)的第一個exposure之對照組抽樣母體,依據特定編號的exposure的配對條件進行資料截取後,發現截取出來的筆數是0筆,檔名是work.control_1

 

文章標籤

estat 發表在 痞客邦 留言(0) 人氣()


以下介紹的範例取材自已絕版的『SAS 程式技巧』(作者:陳坤芳; 1996 6-12~6-13)中的一段程式應用,主要的指令為RETAIN搭配FIRST.VARIABLE、LAST.VARIABLE,所要執行的任務為『分組資料的加總』,在之前的部落文─『SAS中的描述性統計: PROC MEANS指令曾提到以描述性統計的語法:PROC MEANS計算分組的描述性統計量,有興趣,可以比較兩種方法的差異。

【程式一】中,建立了9筆資料,prodid為產品編號,sales為銷售額


【程式一】

estat 發表在 痞客邦 留言(0) 人氣()

 

過去曾經介紹過以SASIFN(), LAG()等函數將資料向下垂直移動,但SAS可否有LAG()函數的相反函數,也就是將資料垂直向上移動的函數,答案應該是沒有的,但可透過PROC EXPAND程序執行資料的垂直向上以及向下的移動,甚至是移動數個列數,該語法屬於Time series(時間序列)的應用。

【程式一】建立範例資料,資料中包含ID(身份證號)sex(性別)Birthday(生日)date (就醫日期)

 

【程式一】

data aa;
        input id $ sex $ birthday yymmdd10. +1 date yymmdd10.;
        format birthday date yymmdd10.;
cards;
A01 F 1958-01-04 2001-02-03

estat 發表在 痞客邦 留言(0) 人氣()

 

在資料分析時,經常遇到資料格式不是我們預期的,例如日期為文字型態,因此無法計算研究對象的年齡、或與時間有關的所有日期資料,或是資料合併時,發現兩個檔的資料型態不同,以致資料無法合併。以下將簡介SAS中的PUT()INPUT()等函數的應用。

PUT( )函數的通式:PUT(SOURCE, INFORMAT),可將數值型態的資料轉成文字型態的資料。

INPUT( )函數的通式:INPUT(SOURCE, INFORMAT),可將文字型態的資料轉成數值型態的資料。

函數中的SOURCE指的是變項名稱,INFORMAT指的是想要轉換的資料格式,以下以程式建立一筆資料,共4個變項,n. fee, date, date1,讀入的資料格式如下。

 

【產生範例資料檔】

data aa;
       input n fee $ date $ date1;
cards;

estat 發表在 痞客邦 留言(0) 人氣()

 

   若研究者想做一張單變項的回歸分析表, 當要看的影響因子愈多, 要進行的單變項回歸分析次數愈多, 於是要反覆執行很多的model, 透過巨集指令功能,即能快速執行完所有的model

    以下同樣要介紹SAS的巨集指令, 以及搭配ODS(Output Delivery System)功能, 以快速產生COX-REGRESSION的統計表格

   如果研究者想看某族群的環境污染劑量與癌症的關係,於是進行劑量效應關係分析(DOSE-RESPONSE EFFECT),並利用在圖表中的範例資料進行分析, 該檔有幾個主要變項:stdno (研究序號), gender (性別), inage(開始曝露於環境污染源的年齡), foloow_up(觀查時間:), dose (環境污染物的劑量), ca1-ca22(各種癌症的欄位名稱, 且欄位中的1為有發生, 0為未發生)。(僅呈現10筆)


 Cox-regression  


estat 發表在 痞客邦 留言(0) 人氣()

 

分層抽樣之基本觀念請參考另篇文章:分層隨機抽樣 (Stratified Random Sampling)  

 

以下為分層不等比例隨機抽樣之SAS的應用:

 

[程式一]中建立30筆資料, 變數包括no, age, sex,檔名為AA,其中男性10女性20尼曼配置法 (Neyman allocation)估算,女性將抽出7個樣本,男性將抽出2個樣本

  [程式一];

data aa;

文章標籤

estat 發表在 痞客邦 留言(0) 人氣()

 

分層抽樣之基本觀念請參考另篇文章:分層隨機抽樣 (Stratified Random Sampling)

以下為分層等比例隨機抽樣之SAS的應用:

 

[程式一]中建立30筆資料, 變數包括no, age, sex,檔名為AA,其中男性10女性20筆,欲抽出30%的樣本,根據比例配置法(Proportional allocation),女性將抽出6個樣本,男性將抽出3個樣本

 [程式一];

data aa;
input no age sex $ @@;
cards;

文章標籤

estat 發表在 痞客邦 留言(0) 人氣()

 

首先在[程式一]建立10筆資料,包含no, age ,sex等變項。

[程式一]

data aa;
input no age sex $ ;
cards;
1 23 F
2 24 F
3 52 M

文章標籤

estat 發表在 痞客邦 留言(0) 人氣()

 

在健保資料中,若要看每年的承保人數、醫護人員數、慢性病盛行人數,若未留意這些資料在各年是不連貫的, 例如承保檔只存在加保與退保的記錄, 若無變更, 中間的各年間是不會有資料的;

在健保資料庫中定義了糖尿病的發生資料,若想看糖尿病的盛行趨勢, 若中間有未就醫的記錄, 例如就醫年份為1997,1998,2000,2001,2003,2004,2005,但19992002年未就醫,對於一旦確定是糖尿病的患者,若非死亡的因素,應該一直為疾病盛行人口, 但患者若有一段時間未就醫, 如何觀察盛行率的長期趨勢?

以下介紹簡單的補值, 程式中建立2筆資料, 資料的起迄年份為IN_YEAR, OUT_YEAR, 利用DO /END的迴圈,以及OUTPUT指令即可將中間各年的資料補上。

迴圈自IN_YEAR跑到OUT_YEAR, 迴圈每跑一圈, 年份自動加 1, 新產生的年份置入新變數YEAR, 此時以OUTPUT將新的迴圈結果輸出, 一直遞迴至迴圈結束為止。 



文章標籤

estat 發表在 痞客邦 留言(0) 人氣()

 

以下將介紹以Transpose將資料橫轉直的簡單語法。

[程式一] 建立資料檔AA中,為同一個人在不同時間的分數, 包含ID(身份證號), SEX, score(分數), 等欄位。

[
程式一]
data aa;
input id $ sex $ score1-score6;
cards;
A01 F 63 75 68 86 77 91

文章標籤

estat 發表在 痞客邦 留言(0) 人氣()

 

時間的運算是許多研究中會遭遇到的問題,特別是探討值大夜班,或工作至翌日凌晨的職業醫學之相關研究。今日將介紹時間的資料格式與相關的函數,且依2種情形進行時間計算:

1. 計算24小時內的時間差

2. 跨夜的時間差

 

再依時間是否與日期結合,分為3種狀況:

1. 若時間與日期為不同變項

2. 若時間與日期已結合為同一個變項

3. 僅有時間資料(只能計算24小時的時間差,無法計算跨夜的時間差)

 

文章標籤

estat 發表在 痞客邦 留言(0) 人氣()

 

上次以PREFIX=指定轉置後的欄位名稱為以流水號型式命名的名稱,今日將介紹的是以ID指定轉置後的欄位名稱。

[程式一在資料檔中AA中包含CLASS(班級), SEX, 成績(SCORE)等欄位。


程式一]


data aa;
input class $ sex $ score;
cards;
文章標籤

estat 發表在 痞客邦 留言(0) 人氣()


SAS的資料轉置依資料的結構與轉置的目的不同, 語法略有不同, 以下介紹Transpose資料直轉橫的簡單語法。


[程式一] 是健保資料庫常見的資料型態, 同一個人在不同時間有好幾筆就醫記錄, 在資料檔中AA中包含ID(身份證號), SEX, AGE, FEE(費用), IN_DATE(住院日期)等欄位。


[ 程式一]

data aa;
input id $ sex $ age fee in_date yymmdd10.;
format in_date yymmdd10.;
cards;

文章標籤

estat 發表在 痞客邦 留言(0) 人氣()

 

通常研究者所收集的資料會有缺失值(Missing value)的情況在任何統計軟體中若不善用函數直接以『+-*/ 』符號進行數學運算,會發生無法計算的情形。

以下的例子為1筆資料3個變數其中var3為缺失值如何利用函數進行數學運算呢請參考圖片表格。函數中的參數可以是變數,或直接寫入數字或計算式。

其中四捨五入的整數小數位數第1小數位數第2, ...之取法依序為 1..1, .01....

data aa;
input var1 var2 var3 ;
cards;

文章標籤

estat 發表在 痞客邦 留言(0) 人氣()

 

本日介紹的是大批資料的匯出,且供資訊人員作為資料庫使用,若搭配網站的架設與資料查詢頁面的製作,即可完成特定資料庫的查詢網站。

為示範程式語法與說明結果,資料為範例資料,請勿引用統計結果或作其他延伸 !!

 

[任務說明]

先說明今日要完成的任務,資料匯出前,有10年的資料,包括20032012年,且有25個縣市別,為提供日後資訊人員建置資料庫,將產生250個資料檔,若再分性別,包括男性、女性、男女合計,將產生750個檔,若結合SAS的巨集指令(MACRO LANGUAGE)ODS(OUTPUT DELIVERY SYSTEM),再將資料轉為HTML格式,將節省表格產出的時間,而HTML的表格自網站下載後,可直接貼至EXCEL中,再作後續的使用。以下要完成的任務條列如下:

1. 輸出的表格必須有表頭(TITLE),表頭需包括(1)年份、(2)縣市別代碼、(3)縣市別,以及(4)表格內容說明。

2. 清楚的變項中文說明

3. 註解要清楚明確, 其中[1] 要說明(1)年份、(2)縣市別代碼、(3)縣市別,以及(4)每年的死亡人數。

4. 表格、表頭與註解要左靠

文章標籤

estat 發表在 痞客邦 留言(0) 人氣()

 

若想將整個欄位的資料移動到下一格,可使用函數LAG(),若想直接計算上下兩筆資料間的數值差,可使用函數DIF(),請參考以下的示範:

利用以下程式建立一個資料檔aa, 若想計算前後兩次門診的時間間隔,可直接利用dif(opd_date)計算兩次門診的時間差,若想將門診日期向下移動,可利用lag(opd_date)

[程式一]
data aa;
        input opd_date yymmdd10.;/*-門診日期-*/
                 lag_date=lag(opd_date);

文章標籤

estat 發表在 痞客邦 留言(3) 人氣()

 

以下為簡易的Dummy variable(虛擬變項)的建立,在回歸分析中,當解釋變數為類別型資料,例如藥物的濃度分為4類,其中一類為參考組,則每一組將與參考組作比較,比較的組數有3組。在回歸模式中不能直接放該類別變項(CON_GRP),否則會視同連續型資料。

因此需要設3Dummy variable,例如以下程式的CON_1~CON_3,當3個變項為0(0,0,0),該組為參考組,當CON_11(1,0,0),為第一組與參考組間的比較,其他以此類推。而Dummy variable的程式語法如[程式一]CON_GRP=1時,CON_1=1CON_GRP=2時,CON_2=1CON_GRP=3時,CON_3=1,其他非1的數值,自動生成為0

[程式一]

data aa1;
set aa;
CON_1=(CON_GRP=1); /*Dummy variable*/
CON_2=(CON_GRP=2);
CON_3=(CON_GRP=3);
run;

文章標籤

estat 發表在 痞客邦 留言(0) 人氣()

 

Logistic Regression與線性迴歸最大的不同是依變項性質的不同,使得兩者在參數估計與假設上也有所不同,前者的結果變項(outcome)為類別型資料(categorical data),後者為數值型資料(numeric data)Logistic Regression分析的假定:觀察值樣本在依變項上的機率分配呈S型分佈,此分佈又稱Logistic分配。

Logistic Regression
最常應用在流行病學的Case-Control study,常見的指標是勝算比(Odds Ratio),其意義為得病的人有暴露與未暴露的比值(勝算; odd)相對於未得病的人有暴露與未暴露的比值,該值=1表示疾病與暴露間的相關性不高。由exp(β)可求得Odds RatioβLogistic Regression的估計參數。

SAS
的程式如下:以proc logistic程序分析,dependent為結果變項, 通常1為有病,0為沒病,Group為解釋變數,在此為組別,通常為有暴露(EXPOSURE)或沒暴露(NON- EXPOSURE)於特定風險的兩個組別。descending為設定dependent=0為參考組,RISKLIMITS為列出95%信賴區間。以SASODS功能(Output Delivery System)parameterestimates(參數估計值)存成SAS檔,包含p value也一起存出來,存成檔案pp;以ODS oddsratio及其95%信賴區間存出,存成檔案qq

最後利用merge指令將參數估計值與oddsratio的結果合併成一個檔案,即可直接整理至發表要用的表格上,如表格所示。

[
程式一]

文章標籤

estat 發表在 痞客邦 留言(1) 人氣()

 

如果收回的問卷,在日期部份將年、月、日各別輸入資料檔中,但當要計算時間或年齡時卻不知所措,該怎麼辦?SASMDY(month,day,year)函數可以將年月日重新組成一個新的日期,如此就可進一步計算了。

以下建立一個資料檔為AA,輸入(INPUT) YEAR, MONTH, DAY等變數。利用MDY()產生一個新變項BIRTHDAY,這個變數是透過YEAR, MONTH, DAY所組成,年月日變數依MDY()中的MONTH,DAY, YEAR順序依序放入,再以FORMAT指令將BIRTHDAY變數轉成YYMMDD10.的格式,即西元年--日,就完成日期的組合(參見程式與結果)

[ 程式 ]

data aa;
input year month day;
birthday=mdy(month,day,year);
format birthday yymmdd10.;

文章標籤

estat 發表在 痞客邦 留言(0) 人氣()

 

時間間隔的計算,在許多研究中是很重要的,包括用藥時間、存活時間、居住時間、曝露在特定污染環境的時間、住院時間等。所使用的SAS函數為INTCK('interval',from,to)'INTERVAL'為起迄時間的時間間隔,單位可以是day, week, month, quarter, year等。FROMTO各是「起」與「迄」的時間。

[程式一] 建立一組起迄時間,依序是start_date, end_date,日期格式是yymmdd10.,即西元年-
-日的格式。

[程式二] 在程式二中產生了5個變項(VARIABLE)DAY, MONTH1, MONTH2, YEAR1, YEAR2DAY為介於起迄間的天數;MONTH1為以SAS
預設的MONTH算起迄間的月數,從結果可知SAS將取整數的月數(128個月),小數點會被捨去(即無條件捨去)MONTH2為以DAY除以30.475計算精準的月數(128.263個月);同樣地YEAR1為以SAS預設的YEAR計算的起迄間的年數,從結果可知,SAS將取整數的年數(10),小數點會被捨去(即無條件捨去)YEAR2為以DAY除以365.25(4年潤年一次)計算精準的年數(10.6886)

[
程式一];
data aa;
input id $ start_date yymmdd10. end_date yymmdd10.;

文章標籤

estat 發表在 痞客邦 留言(3) 人氣()

1 2