今天很久沒有聯絡的學妹突然傳 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);
這問題還滿有點挑戰性的,所以當作自我鍛鍊就答應幫她了。問題的大意如下:
有一群病人被診斷出七種症狀,但不是每個人都會出現所有症狀。考慮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);
文章標籤
全站熱搜

版大您好,我在查詢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, 我是一點也不驚訝啊 這麼多變數 要有足夠的樣本來支撐 否則自由度不夠 參數和檢定當然做不出來
沒有樣本不足夠啦.. 我只是跑 兩兩的交互作用,充其量不過C100 取2,但是我是測試模擬資料,所以樣本數我可以自由模擬個數:) 哈 謝謝版大,我去找找看text utility macro