今天很久沒有聯絡的學妹突然傳 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);
全站熱搜
留言列表