今天很久沒有聯絡的學妹突然傳 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);

創作者介紹

ToTo 奇妙の冒險

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


留言列表 (2)

禁止留言
  • automemory
  • 版大您好,我在查詢SAS相關指令意外發現了您的部落格,我對這篇部分能解決我的問題感到非常開心。但我在跑回歸的變數上充滿不確定個數的情況,甚至變數個數很多,我需要跑兩兩的交互作用,也就是V1-V100之類的,我需要跑C100取2個交互作用,
    假如用SAS指令來寫,則需要V1|V2|V3|V4|...|V100@2,但是我個數不確定,土法煉鋼的打完這些字也對程式的攥寫不甚理想,

    我還是了用你提供||的方法,另外放了一個combind的資料夾,變數com之下放的就是V1*V2 V1*V3 V1*V4...V99*V100等共cC100取2個文字値。

    但我放上logistic迴歸後,發現我的這些文字卻無法使用,不知道是否適讀檔的問題還是還有更好的寫法嗎?希望版大能提供給我,非常感謝。
  • V1|V2|...|V100 這個問題可以使用text utility macro來解決
    請自行到我另一個網站SUGI CLUB裡面去找
    那個macro的效率更好

    至於跑不出logistic regression model, 我是一點也不驚訝啊
    這麼多變數 要有足夠的樣本來支撐
    否則自由度不夠
    參數和檢定當然做不出來

    cchien 於 2009/09/19 00:00 回覆

  • automemory
  • 沒有樣本不足夠啦..
    我只是跑 兩兩的交互作用,充其量不過C100 取2,但是我是測試模擬資料,所以樣本數我可以自由模擬個數:)

    哈 謝謝版大,我去找找看text utility macro