こんにちは。
第3回です。今回は前回色をつけたKM曲線に、信頼区間の帯も付け加えたいと思います。
信頼区間の帯については、BANDステートメントを使用いたします。
前回同様、サンプルデータの作成、RGBマクロは同じですので、第1回、第2回をご参照ください。
ここからは少しずつ追加があります。
まずLIFETESTですが、いままで出力していたods outputのデータセットには、
生存割合の信頼区間の情報がございません。
なのでoutsurv=で信頼区間の情報が入ったデータセットも出力いたします。
ods output Survivalplot = sgplot ;
proc lifetest data=adtte METHOD= KM atrisk maxtime = 24 outsurv=out
plots = survival (outside atrisk = 0 to 24 by 3 atrisktick );
time AVAL*CNSR(0);
strata TRTPN / test = logrank;
run;
データ加工ですが、At risk用の加工の前に、sgplotとoutをmergeしていきます。
mergeした後は、今まで通りAt riskの欠測の補完と、
信頼区間の欠測(KM曲線の最後の方)の補完を行い、グラフ出力に移ります。
data out1(keep = Time SURVIVAL SDF_LCL SDF_UCL STRATUMNUM);
set out;
rename AVAL = Time
STRATUM = STRATUMNUM;
run;
proc sort data = out1; by Time SURVIVAL STRATUMNUM; run;
proc sort data = sgplot; by Time SURVIVAL STRATUMNUM; run;
data _sgplot;
merge sgplot out1;
by Time SURVIVAL STRATUMNUM;
if AtRisk = . then delete;
run;
data form ;
do StratumNum = 1 to 2 ;
do time = 0 to 24 by 3;
tAtRisk = time; output;
end;
end;
run;
proc sort data = form; by StratumNum time; run;
proc sort data = _sgplot; by StratumNum time; run;
data atrisk0;
merge form _sgplot;
by StratumNum time ;
run;
data sgplot2;
set atrisk0;
if AtRisk = . then do;
AtRisk = 0;
tAtRisk = time;
end;
retain SDF_UCL1;
if SDF_UCL^=. then SDF_UCL1 = SDF_UCL;
retain SDF_LCL1;
if SDF_LCL^=. then SDF_LCL1 = SDF_LCL;
if Time = 0 and tAtRisk = 0 then do;
SDF_UCL1 = .; SDF_LCL1 = .;
end;
Stratumnumci=Stratumnum;
run;
proc sort data = sgplot2; by StratumNum time; run;
これで出力前のデータセットは完成です。
今回は信頼区間のformatも追加します。
proc format;
value ci 1 = '95% CI(Active)' 2 = '95% CI(Control)';
run;
それでは前回のSGPLOTにBANDとformatを追加して出力を行っていきます。
proc sgplot data = sgplot2 noautolegend;
styleattrs datacontrastcolors=(%RGB(0,191,196) %RGB(248,118,109))
datalinepatterns=(1 20)
datasymbols=(triangle circle));
step x=Time y=Survival / group=StratumNum
lineattrs=(thickness=2) name="a" ;
band x = Time upper = SDF_UCL1 lower = SDF_LCL1 /
type = step group = Stratumnumci transparency=0.8 name = "b";
scatter x=Time y=Censored / group=StratumNum
markerattrs=(size=15) ;
xaxistable AtRisk / x=tAtRisk class=StratumNum
valueattrs=(size=13) labelattrs=(size=13)
title="No. at Risk" titleattrs=(size=13);
yaxis values=(0 to 1 by 0.1)
label="Probability of Overall Survival"
valueattrs=(size=13) labelattrs=(size=13);
xaxis values=(0 to 24 by 3) offsetmin=0.03 offsetmax=0.02
label="Time(Months)" valueattrs=(size=13)
labelattrs=(size=13);
keylegend "a" / location = inside position = topright
titleattrs=(size=13)valueattrs=(size=13)
acros=1 noborder ;
format StratumNum treat. ;
run;
完成図は以下になります。
ということでそれなりに綺麗めのKM曲線が出来上がりました。
検定結果や、ハザード比、中央値はINSETとかでお好みで載せてください。
ちなみにですが、ここのBANDステートメントで、
upper=Survival、lower=0で出力すると、曲線下面積を図示することもできそうですね。
もしメーカー勤務、常駐の方で発表資料に使う機会があれば是非。
ということでKM曲線シリーズは終わりです。
今年のユーザー総会でKM曲線についての発表も行いますので、
もしよろしければちらっと見ていってください。
何かネタが出てきたらまた更新したいと思います。
おわり