當研究之連續變項沒有臨床上的切點時,大多數會將其均分成3或4組,此處用3個連續變項均分成3組來示範:
方法一
利用SAS macro可以快速找出多個變項的百分位點,此處以找最小值,第33百分位,第66百分位及最大值為例:
data a;
do i=1 to 100;
HT=round(145+(190-145)*rand('uniform'));*四捨五入取整數;
WT=round((40+(100-40)*rand('uniform')), 0.1);*取至小數後1位;
output;
end;
run;
data a1;set a;
BMI=WT/(HT/100)**0.5;* "**"表示次方,如: A**2,代表A平方;
run;
proc print data=a1(obs=5);*只列印前五筆資料;
run;
%macro p(n,var);
proc univariate data=a1;
var &var.;
output out=per&n.
pctlpts=0 33 66 100
pctlpre=pct_;
run;
data per&n.;set per&n.;var="&var.";run;
%mend;
%p(1, HT);
%p(2, WT );
%p(3, BMI );
data per;set per1-per3;
proc print;run;
data a2;set a1;
%macro ter(var, t1, t2);
if &var.<&t1. then &var._c=0;
if &t1.<&var.<=&t2. then &var._c=1;
if &t2.<&var. then &var._c=2;
%mend;
%ter(HT, 161.5, 173);
%ter(WT, 62.25, 77.85);
%ter(BMI, 47.087, 59.649);
run;
proc means data=a2 n min max maxdec=2;var HT;class HT_c;run;
proc means data=a2 n min max maxdec=2;var WT;class WT_c;run;
proc means data=a2 n min max maxdec=2;var BMI;class BMI_c;run;
data a2;set a1; %macro ter(var, t1, t2); if &var.<&t1. then &var._c=0; if &t1.<&var.<=&t2. then &var._c=1; if &t2.<&var. then &var._c=2; %mend; %ter(HT, 161.5, 173); %ter(WT, 62.25, 77.85); %ter(BMI, 47.087, 59.649); run; proc means data=a2 n min max maxdec=2;var HT;class HT_c;run; proc means data=a2 n min max maxdec=2;var WT;class WT_c;run; proc means data=a2 n min max maxdec=2;var BMI;class BMI_c;run;
方法2
proc rank data=a1 out=b1 group=3;
var HT WT BMI;
ranks HT_c WT_c BMI_c;
run;
proc means data=b1 n min max maxdec=2;var HT;class HT_c;run;
proc means data=b1 n min max maxdec=2;var WT;class WT_c;run;
proc means data=b1 n min max maxdec=2;var BMI;class BMI_c;run;
總結
1. 2種方法僅有一些誤差,可能是proc univariate & proc rank 計算百分位的定義不同,但都達到均分成3組的目的
2. 方法2 明顯比 方法1 快得多,但不知切點: 第33百分位,第66百分位 的值
3. 方法1 可以運用在擷取任何百分位點上
延伸閱讀:
SAS 和 SPSS 四分位數有何不同? (What difference of Quartiles between SAS and SPSS)
留言列表