過去的文章曾介紹過ifn函數、dif函數、first.variable三種指令,這次,想以這三個指令,來介紹健保資料庫分析中的疾病定義。
在健保資料庫分析的各種疾病定義中,常聽到的一種定義方式為:任一年出現-二次某疾病診斷碼,並以此定義特定的疾病。
任一年二次以上的就醫記錄的概念,簡單來說,就是任意的兩筆資料間的天數差要小於一年,即365天。這是該定義最寬鬆的條件,因為一年內也可以有3筆或3筆以上的資料,但至少要2筆,且兩筆的天數差小於一年。如果第1筆與第2筆的就醫記錄超過365天,含365天,那麼.…我們要繼續往下找,看第2筆與第3筆間是否超過365天,並依此推算下去,直到所有就醫記錄全比對完。
1. ifn函數
首先,我們介紹ifn函數,n是numeric,數值的意思。這個函數包含4個參數,適用於數值型態的資料處理。而ifn,言下之意,就是針對數值型態的資料,在函數中寫條件句,並依不同條件執行資料處理的動作。
函數中的第一個參數是執行資料處理的條件,第二個參數是符合左列條件所要給予的正確賦值,第三個參數是不符合左列條件所要給予的錯誤賦值,最後一個是當資料為缺失值時所給予的賦值,這些值,都是可以自由定義的。
如以下範例所示:這個範例中的條件由餘數函數mod( )構成,函數中的x為被除數,2為除數,也就是x除以2的餘數為何?如果遇到資料為偶數,則為整除,餘數為0,正確賦值為1。遇到奇數,無法整除,餘數不為0,錯誤賦值為0。
ifn(mod(x,2)=0,1,0);
透過這種方式,我們可以定義資料為偶數或奇數。

2. dif函數
接下來,我們介紹第二個函數 dif,這個函數的功能在於,進行後面一筆資料與前面一筆資料的相減,因此,函數內的變數只能放數值型態的資料。例如z來自函數dif(x)。
當x變數中的第2筆:24,與第1筆的11相減,則z為13,第3筆的71與第2筆的24相減,則z為47。

3. first.variable
最後一個指令是first.variable,當一個變數有重覆值的時候,我們想取每個值的第一筆,可以採用這個指令,例如,將病人的就醫記錄歸戶,也就是一人一筆,我們可以寫first.id,id是身份證字號。
當first.id=1時,讀取每個人的第一筆資料,當first.id=0時,讀取每個人的非第一筆資料。
操作實例

紅色框框是整隻程式的核心,包含以上所介紹的三個指令,ifn函數、first.id、dif函數。
ifn函數中的條件句為first.id,即判斷是否為每一個病人的第一筆資料,若是,就给定第一筆資料為缺失值,missing。若不是第一筆,請將賦值填為當筆資料與前一筆資料的就醫天數差。由於健保資料不會有日期缺失值,因此不需要賦值。為什麼每個人的第一筆要給定缺失值呢?因為第一筆資料的前面已經沒有資料,無法計算天數差,所以,直接給與缺失值。
兩兩資料間的天數差以dif_day表示。
由於兩兩天數差的計算,必需在同一個病人的所有就醫日期中進行差值的運算,所以計算的基準是相同的身份證字號,因此,我們必須先將身份證字號排序。並在剛剛所介紹的核心程式之前,以by id表示,以下的執行動作是以身份證字號為計算的基礎。
最後,我們再下條件句把符合兩兩天數差小於一年365天的資料做上記號,這些因特定疾病就醫的病人,才是我們研究所定義的觀察族群。
您可進一步觀賞影片說明
示範程式如下
data d1;
input id $ date yymmdd8.;
format date yymmdd10.;
cards;
A01 20010305
A01 20010811
A01 20020427
A01 20020928
A01 20050103
A01 20051224
A02 20030712
A02 20051123
A03 20010416
A03 20071216
A03 20080123
A03 20081010
;
run;
以下我們將以【ifn函數】、【first.var】、【dif函數】這三個指令定義:某一疾病在【任一年中出現2次】,這部份的程式邏輯,已在前面說明過了。
proc sort data=d1;
by id;
data d2;
set d1;
by id;
dif_day=ifn(first.id,.,dif(date));
if 0<=dif_day<365 then m=1;
proc print;
run;

