前回に引き続きフォレストプロットの続きです。フォレストプロットの作図方法の解説は日本語ではほとんどないので個々のコードを説明していきたいと思います。
前回の記事はこちら
axistableはsgplotでも作図できるのですが、今回のグラフは列タイトルが二段になっているのでGTLでないと作図できません。
ネットの作図事例を見る限りここ最近はフォレストプロットをGTLで作図するケースが増えているようです。私がsgplotではなくてGTLをおすすめするのもこれが理由。
グラフエリアの分割
layout latticeステートメントを使うことで列数が異なる行を複数作成することができます。
layout latticeステートメントでグラフエリアを分割し、各区画にオブジェクトを配置しています。まずはグラフエリアを3行に分割します。上から列タイトル1、列タイトル2、テーブルとグラフが作図されます。
layout lattice /rows=3 rowweights=(7.5 7.5 85);
layout lattice / columns=7 columnweights=(3 2.8 2.8 1.4 3 1 6);
< 列タイトル1の定義 >
endlayout;
layout lattice / columns=9 columnweights=(3 1.4 1.4 1.4 1.4 1.4 3 1 6) ;
< 列タイトル 2の定義 >
endlayout;
layout lattice / columns=9 columnweights=(3 1.4 1.4 1.4 1.4 1.4 3 1 6);
< テーブル、グラフの定義 >
endlayout;
endlayout;
rowsオプションで行数を、rowweightsオプションで各行の高さの比率を指定します。今回は7.5:7.5:85になるようにグラフエリアを3行に分割しました。比率の指定は必ず正の数値で指定し、スペースで区切ります。
分割されたエリアを色分けすると以下のようになります。
列も同様ににして各列の中にlayout latticeを設置して横方向に分割します。
列数はcolumnsオプション、各列幅の比率をcolumnweightsオプションで指定します。
タイトルの作成
各列のタイトルはentryステートメントで作成します。列の数だけ文字列を指定しましょう。
halignオプションはtextattrsオプションはそれぞれ文字列の配置とフォント設定を指定するものですが、表示文字列の前に記載するのがポイント(”/”の後ろではないです)。
列タイトル1は文字列が表示されていない区画がありますが、その部分は欠損値を挿入します。entryステートメントは省略できません。
/*列タイトル1*/
entry halign=center textattrs=(size=12 weight=bold)"";
entry halign=center textattrs=(size=12 weight=bold)"intervention";
entry halign=center textattrs=(size=12 weight=bold)"control";
entry halign=center textattrs=(size=12 weight=bold)"";
entry halign=center textattrs=(size=12 weight=bold)"Odds ratio";
entry halign=center textattrs=(size=12 weight=bold)"";
entry halign=center textattrs=(size=12 weight=bold)"Odds ratio";
/*列タイトル2*/
entry halign=center textattrs=(size=12)"Study or Subgroup";
entry halign=center textattrs=(size=12)"Events";
entry halign=center textattrs=(size=12)"Total";
entry halign=center textattrs=(size=12)"Events";
entry halign=center textattrs=(size=12)"Total";
entry halign=center textattrs=(size=12)"Weight";
entry halign=center textattrs=(size=12)"M-H Fixed, 95"{unicode '0025'x}"CI";
entry halign=center textattrs=(size=12)"year";
entry halign=center textattrs=(size=12)"M-H Fixed, 95"{unicode '0025'x}"CI";
表の作成
表はaxistableステートメントで作成します。layout overlayステートメントにはaxistableを複数設置できるのですが、列タイトルとの位置がずれてしまうため、layout overlayステートメントを列数分だけ設置し、その中にaxistableステートメントを1つずつ設置しています。
この時軸は非表示にしてY軸を反転させるのがポイント。こうしないとデータセットとは逆の順序でデータが配置されます。
textgroupオプションはクラス変数ごとに文字列の設定を変更したいときに使います。今回は統合解析の文字列を太字になるように設定しました。
設定はattribute mapを使用しています。(attribute mapは別記事で紹介します。)
表示する値の配置はvaluejustyオプションで指定し、padオプションで左右の余白を調整しています。この調整はSASが自動ではやってくれないので手動で調整しています。
今回は数値を右に寄せて左右の余白を調整することで、数値の末尾をそろえた状態で列の中央に配置するようにしています。
/* control events */
layout overlay / walldisplay=none
xaxisopts=(display=none)
yaxisopts=(display=none reverse=true);
axistable y=ID value=COL4 /
valuejustify=right
valueattrs=(size=10)
pad=(left=25)
display=(values);
endlayout;
ドットプロット
ドットプロットはscatterplotステートメントで作成します。
xaxisoptsでtype=logにすることで、対数軸に変更できます。
errorbarshape=noneにすることでエラーバーの先端形状を非表示にすることができます。sizeresponseは指定した変数の数値の大きさによってマーカーサイズが変わります。
今回は各研究のサンプル数に応じてマーカーサイズが変わるようにしており、サンプル数の相対的な割合(weightに相当)が視覚的にわかりやすくなります。
また信頼区間が1をまたぐかどうかが注目されるポイントとなるため、x=1の参照線を引いています。
layout overlay / walldisplay=none
xaxisopts=(type=log logopts=(viewmin=0.01 viewmax=100))
yaxisopts=(display=none reverse=true);
scatterplot x=odds_ratio y=ID /
group=_grp
xerrorlower=lower
xerrorupper=upper
sizeresponse=total
errorbarcapshape=none;
referenceline x=1;
endlayout;
統合結果マーカー
前回でも触れましたが、統合結果のマーカーは散布図のマーカーとして作図することができません。そのためひし型の頂点の座標を算出してpolygonplotステートメントで
作図する必要があります。
polygonplot id=図形ID x=頂点のx座標 y=頂点のy座標 / display=(fill) ;
座標は以下の通り、dはひし形の縦幅を決める数値です。IDはフォレストプロットの行識別変数であり、axistableのy変数として使用します。
ひし形の頂点を指定するため、軸タイプは必ず線形に設定する必要があります。
座標を計算しているため普通にめんどくさいんですよね。。マーカーとエラーバーで代用したほうが現実的かも
次の記事はこちら