SAS

GTLでフォレストプロットを作成する (4)列データにインデントを適用する

今回もフォレストプロットの話です。
前回の記事はこちら

GTLでフォレストプロットを作成する (1)フォレストプロットはリスク比やハザード比を視覚化するときによく使われます。臨床研究では頻出の作図ですので押さえておくと後々楽です。 ...

フォレストプロットの作図例を見るとサブグループの行だけグループ名にインデントを挿入して見やすくしているものがあります。
インデントを挿入するには列データにインデントを直接挿入する方法もありますが、axistableステートメントにはインデントを挿入するオプションがあります。

公式ブログで公開されているけど・・・

フォレストプロットの作図方法は以下の記事にて公開されています。

またSAS社コンサルタントであるlexjansen氏の発表でforestplotの作図方法が紹介されています。

SASの公式ブログではフォレストプロットの作図例がいくつか公開されているのですが、highlowplotやscatterplotでテーブルを作成しています。

この作図はhighlowプロットとscatterplotを使って作成しています。たぶん古いバージョンでも動作するように設計しているのでしょう。(highlowplotって古いバージョンでも動くのでしょうか?)古いバージョンの場合この方法でOKですが、SAS9.4ならhighowplotは必要ありません。
またSASブログの方はサブグループの各水準の文字列に直接インデントを挿入していますが、これもaxistableであれば必要ありません。データセットを加工してインデントの挿入する手間は不要です。

わざわざデータセットの文字列を加工すると後で別の作図に流用したいときにまた手を加えなければならなくなります。

axistableのみでインデントを再現する

同じフォレストプロットをaxistableとscatterplotステートメントで作図してみました。プロットエリア内のテキスト表示はtextplotステートメントを使用しましたが、scatterplotプロットでも同じことができます。

作図データ

変数説明
IDフォレストプロットの各行を識別する番号、上の行から連番を振る。axistableとscatterplotのY変数として使う
Meanハザード比
lower信頼下限
upper信頼上限
COL1サブグループ名 または水準名
COL2患者数と割合
COL3PCIgroupの累積イベント発生率
COL4groupの累積イベント発生率
COL5P値
indent水準名のレコードは1を、サブグループ名のレコードは0を格納する
fill塗りを適用したいレコードの場合、IDを格納する
textプロット中にテキストを配置する。今回は一番下に空のレコードを挿入し、 そこにテキストを2つ配置する(PCIbetter, Thrapy better)
xテキストの配置位置(X座標)

作図コード

proc template; define statgraph forest3; 
begingraph; 

discreteattrmap name="group"; 
   value "0" / textattrs=(weight=bold); /* code 1*/ 
enddiscreteattrmap; 
discreteattrvar attrmap="group" var=indent attrvar=_grp; 

layout lattice / rows=2 rowweights=(3 97); 
   entry halign=right "4-Yr cumulative event rate" / pad=(right=5) textattrs=(size=10 weight=bold); 
/* code 2*/ 

layout overlay / walldisplay=none 
   yaxisopts=(type=discrete reverse=true display=none) 
   xaxisopts=(linearopts=(viewmin=0 viewmax=2) 
      display=( ticks line tickvalues) 
      displaysecondary=(line label) /* code 3*/ 
      label="Hazard ratio" 
      labelattrs=(size=10)); 

innermargin / align=left; 
   axistable y=ID value=COL1 / 
      indentweight=indent 
      textgroup=_grp 
      labelattrs=(size=10) 
      valueattrs=(size=10) ; 

/* code 4*/ 
   axistable y=ID value=COL2 / 
      labelattrs=(size=10) 
      valueattrs=(size=10); 

endinnermargin; 

referenceline y=fill / 
   lineattrs=(thickness=18 color=cxf0f0f7); 

/* code 5*/ 

   scatterplot x=mean y=ID /
    /* code 6*/ 
       xerrorlower=lower 
       xerrorupper=upper 
       errorbarcapshape=none 
       markerattrs=(symbol=squarefilled color=cx003399) 
       errorbarattrs=(color=cx003399); 

   referenceline x=1; 
   textplot x=x y=ID text=text / 
      textattrs=(size=10 weight=bold); 

/* code 7*/ 
   innermargin / align=right; 
      axistable y=ID value=COL3/ 
         labelattrs=(size=10 ) 
         valueattrs=(size=10) 
         valuejustify=center; 
/* code 8*/ 
      axistable y=ID value=COL4/
         labelattrs=(size=10) 
         valueattrs=(size=10) 
         valuejustify=center; 
  
      axistable y=ID value=COL5/
         labelattrs=(size=10 ) 
         valueattrs=(size=10) 
         valuejustify=center; 

   endinnermargin; 

endlayout; 
endlayout; 
endgraph; 
end; 
run; 

ods graphics /width=20cm height=15cm; 
proc sgrender data=raw2 template=forest3; 
run;

実行結果

実行結果

解説

作図コードのうちCode1~Code7についての解説です。

Code 1

attributemapでサブグループの文字列のフォントを設定します。サブグループ名は太字で表示されるようにしました。ただしフォントサイズは指定できません。

Code2

layout latticeステートメントでグラフエリアを2行に分割し、一行目にプロット右側列のタイトルを設置します。

Code 3

displaysecondaryオプションでlabel表示を有効にするとプロットの上側にラベルを設置できます。これを利用しプロットのタイトルを設置します。

Code 4

indentweightオプションで指定した変数に1が格納されている場合、サブグループ名は1段階のインデントが挿入されます。textgroupオプションでcode1で作成したattributemapを指定することで、サブグループ名(インデントされていない)は太字になります。

Code 5

変数fillに格納されたY軸の値のみ塗りが適用されます。

Code6

scatterplotでドットプロットを作成します。errorbarcapshapeオプションでnoneを指定するとエラーバーの先端はラインのみとなります。

Code7

textplotでプロット内にテキストを配置します。