SAS

SASでカプランマイヤープロットを作図する(2)カスタマイズ

lifetestプロシジャでもカプランマイヤープロットは作成できますが、もう少しカスタマイズしたいときはデータセットを出力して作図プロシジャでグラフを出力したほうが良いです。
sgplotでも実現できますが、ここではGTLを利用したカスタマイズ法をご紹介します。

打ち切りと生存曲線をプロットする

実はlifetestプロシジャでは作図用のデータセットを内部で生成しています。outsurvオプションで生存率を出力するのも手ですが、内部で生成されたデータセットを利用したほうが前処理の手間がなくらくちんです。
また格納される変数は常に同じ変数名なので、dynamic variableを利用する必要もありません。このデータセットはodsを利用して「survivalplot」という名のデータセットを参照すれば任意の名前のデータセットとして出力できます。

ods output survivalplot=plotdata; 
proc LIFETEST data=Bmt2 ; 
time T*Status(0); 
strata Group ; 
run;

カプランマイヤープロットのような階段状の曲線を作図するにはstepplotステートメントを使用します。引数とオプションはseriesプロットとほぼ同じです。

stepplot x=x変数 y=y変数 / < options >;

打ち切りは散布図のマーカーで表現します。lifetestプロシジャではマーカーはプラス記号を使っていますが、markerattrsオプションで任意のマーカーに変更できます。

proc template; 
define statgraph survival; 
begingraph; 
   layout overlay / 
      xaxisopts=(label="Time" 
         linearopts=(viewmin=0 viewmax=2750 
            tickvaluesequence=(start=0 end=2750 increment=250)
         ) 
      ) 
      yaxisopts=(label="survival probability" 
         linearopts=(viewmin=0 viewmax=1 
            tickvaluesequence=(start=0 end=1 increment=0.25)
         )
      ); 

      stepplot x=time y=survival / 
         group=stratum; 
      scatterplot x=time y=censored /
         group=stratum 
         markerattrs=(symbol=plus); 
   endlayout; 
endgraph; 
end; 
run; 

proc sgrender data=plotdata template=survival; 
run;
実行結果

信頼区間をプロットする

信頼区間はoutservオプションで指定したデータセットに格納されており、通常は上記のsurvivalplotデータセットとマージして値を加工すれば作図データセットを作成できます。
しかしplotsオプションでsurvival(cl)を指定することでsurvivalplotデータセットに最初から前処理がされた状態で出力されます。

前処理の工程が少なく済むのでこちらのほうが楽です。

信頼区間の作図にはbandplotステートメントを使用します。bandplotによる信頼区間の表示は以前の記事にて紹介しています。

GTLで信頼区間と予測区間を作図する bandplotステートメント前回パラメータの推定値から濃度応答曲線を作図しました。この時応答の信頼区間と予測区間も推定していますので、それをグラフに反映してみます。...

stepplotの信頼区間の場合はtype=stepを指定するのがポイント。信頼区間に塗りを適用する場合はdatatransparencyオプションで透過度を上げておくと見やすいです。塗りは非表示にする場合はdisplay=(outline)を追加します。

また複数の系列を表示する場合はattribute mapを使用することをお勧めします。

proc template; 
define statgraph survival; 
begingraph; 
discreteattrmap name="group" / discretelegendentrypolicy=attrmap; 
   value "ALL" / lineattrs=GraphData1 
                 markerattrs=GraphData1(symbol=plus) 
                 fillattrs=GraphData1; 
   value "AML-Low Risk" / lineattrs=GraphData2 
                          markerattrs=GraphData2(symbol=plus) 
                          fillattrs=GraphData2; 
   value "AML-High Risk" / lineattrs=GraphData3 
                           markerattrs=GraphData3(symbol=plus) 
                           fillattrs=GraphData3; 
enddiscreteattrmap; 
discreteattrvar var=stratum attrmap="group" attrvar=_grp; 

legenditem type=fill name="CI" / 
   fillattrs=(color=grey)
   label="95% Confidence interval" ; 

legenditem type=marker name="censor" / 
   markerattrs=(symbol=plus color=grey) 
   label="Censored"; 

   layout overlay / 
      xaxisopts=(label="Time" 
         linearopts=(viewmin=0 viewmax=2750 
            tickvaluesequence=(start=0 end=2750 increment=250)
         ) 
       ) 
      yaxisopts=(label="survival probability" 
         linearopts=(viewmin=0 viewmax=1 
            tickvaluesequence=(start=0 end=1 increment=0.25)
         )
      ); 

      stepplot x=time y=survival / 
         name="surv" 
         group=_grp; 

      bandplot x=time limitlower=SDF_LCL limitupper=SDF_UCL / 
         group=_grp 
         type=step 
         datatransparency=0.7; 

      scatterplot x=time y=censored /
         group=_grp ; 

      discretelegend "CI" "censor" / 
         location=inside 
         autoalign=(topright bottomright bottomleft) 
         across=1 ; 
 
      discretelegend "surv" / 
         location=outside ; 

endlayout; 
endgraph; 
end;
run; 

proc sgrender data=plotdata template=survival; 
run;
実行結果