今天很久沒有聯絡的學妹突然傳 MSN 給我,當然我知道「無事不登三寶殿」的道理,所以早就有心理準備。果不其然有 SAS 的問題,所以來我這討救兵。

這問題還滿有點挑戰性的,所以當作自我鍛鍊就答應幫她了。問題的大意如下:

有一群病人被診斷出七種症狀,但不是每個人都會出現所有症狀。考慮C7取4、C7取5、C7取6和C7取7的不同組合,共計有35、21、7和1種組合。要如何看這些組合下共計有多少病人。

由於我手邊沒有資料,所以就先用電腦來模擬一百個病人,每個病人有七種症狀(symp1~symp7),此為二分法的數值變數,1表示有症狀、0表示無症狀。另外,為了要識別不同的排列組合,又另外定義了七個文字變數(sympc1~sympc7)。當symp=1時,sympc=Y,反之則sympc=N。

接著,把symp1到symp7加總起來(Total),則此變數就可以表示每個病人出現多少個症狀。再把sympc1到sympc7用連結符號(||)給黏起來,這樣就可以替每個病人出現症狀的前後次序命名。如「NYYNYYN」表示該病人出現第二、三、五、六號症狀。

再來就是定義四個新變數(combine4~combine7)來表示病人是否出現N個以上的症狀。如果病人出現四個以上症狀(即 Total >=4,則 combine4=1,反之為零)。

把上面的變數都建立好後,就可以用 PROC FREQ 去分別對 combine4=1、combine5=1、combine6=1和combine7=1 去做次數分配表,這樣一來就可以算出每種不同組合下有多少病人了。

程式碼如下:

data test;
    array symp{7} symp1-symp7;
    array sympc{7} $1 sympc1-sympc7;
    array c{4} combine4-combine7;
    seed=1234;
    do i=1 to 100;
        do j=1 to 7;
            symp(j)=round(ranuni(seed));
            if symp(j)=1 then sympc(j)='Y';
                else sympc(j)='N';
        end;
        total=symp1+symp2+symp3+symp4+symp5+symp6+symp7;
        combine=sympc1||sympc2||sympc3||sympc4||sympc5||sympc6||sympc7;
        do k=1 to 4;
            if total>=k+3 then c(k)=1;
                else c(k)=0;
        end;   
        output;
    end;
    drop seed j k;
run;

%macro combine(indata,var,outdata);
proc freq data=&indata;
    where &var=1;
    tables combine;
    ods output OneWayFreqs=&outdata;
run;
%mend;

%combine(test,combine4,combine4freq);
%combine(test,combine5,combine5freq);
%combine(test,combine6,combine6freq);
%combine(test,combine7,combine7freq);

arrow
arrow
    全站熱搜

    cchien 發表在 痞客邦 留言(2) 人氣()