GTLを使いこなすためには、attribute mapを使いこなすのは必須かと思われます。
今回はなぜattribute mapが必要になるのかを説明していきたいと思います。
attribute mapとは
attribute mapとはデータとグラフオブジェクトの属性(線の色、塗りつぶし、テキストサイズなど)を紐づけるための仕組みのことです。
例えば折れ線グラフを作図するとき、被験薬のグループ(群変数=1)と対照薬のグループ(群変数=2)ごとに作図するとき、特に指定をしていなければ被験薬は青線、対照薬は赤線で表示されます。SAS内部ではグラフデータ用のデフォルト属性が12種類用意されており(GraphData1~GraphData12)、これをデータが現れる順番に従ってデータへ割り当てる仕組みとなっています。したがって属性はあくまでデータの表示順のみに従い、データの中身自体とは関係ありません。
これを被験薬=青、対照薬=赤とデータごとに色を指定する仕組みがattribute mapです。GTLでは離散変数の値に属性を紐づけるdiscrete attribute mapと、連続変数の値をグラデーションとして表現するrange attribute mapの2種類があります。
attribute mapを使わない場合
金ETFと原油ETFの終値をプロットしてみます。変数tickerは銘柄を識別する変数で、1は原油ETF、2は金ETFを示します。
attribute mapを使わない場合は以下のような結果となります。金ETFは2番目に現れるため線の色は赤(GraphData2)が割り当てられています。
proc template;
define statgraph seriesplot;
begingraph;
entrytitle "金ETFと原油ETFの比較";
layout overlay /
xaxisopts=(griddisplay=on)
yaxisopts=(griddisplay=on) ;
seriesplot x=DATE y=END_PRICE /
name="series"
group=TICKER;
discretelegend "series";
endlayout;
endgraph;
end;
run;
proc sgrender data=wk1 template=seriesplot;
run;
仮に原油ETFの価格が取得できず欠損となってしまった場合、上記のコードのままだと以下のようになります。
線の色が赤から青に変わってしまいました。これは金ETFのデータが最初に現れるため、自動的にGraphData1(青色)の属性が割り当てられたためです。
臨床試験の場合ですとデータが得られず欠損となってしまうことがありますが、attribute mapを使用しないとデータによっては同じ群のデータなのにもかかわらず作図する度に属性が変わってしまいます。
これは困りますね。
attribute mapを使用した場合
そこでattribute mapを使用します。attribute mapを使用して 原油ETFに青、金ETFに赤の属性を紐づけ、先ほどと同様に金ETFの価格を作図してみます。
proc template;
define statgraph seriesplot;
begingraph;
*--attribute map定義----------------------------------;
discreteattrmap name="tick";
value "1671 WTI原油価格連動型上場投信" / lineattrs=GraphData1;
value "1540 純金上場信託(現物国内保管型)" / lineattrs=GraphData2;
enddiscreteattrmap;
*attribute mapと群変数からattribute variableを作成;
discreteattrvar attrvar=grp var=ticker attrmap="tick";
*-----------------------------------------------------;
entrytitle "金ETFと原油ETFの比較";
layout overlay /
xaxisopts=(griddisplay=on)
yaxisopts=(griddisplay=on)
;
seriesplot x=DATE y=END_PRICE / name="series" group=grp;
discretelegend "series";
endlayout;
endgraph;
end;
run;
線の色が赤になりました。これでデータの欠損にかかわらず金ETFのデータ系列は必ず赤線で表示されます。
この仕組みによりデータごとにテンプレートの修正をする必要がなくなり、テンプレートの再利用が可能になります。
ちなみにsgplotではSTYLEATTRSステートメントにより群ごとに色を指定できますが、これはあくまでデータの表示順に従い属性リストを指定するだけで、データと属性を紐づけているわけではありません。
なのでSTYLEATTRSステートメントを使用してもattribute mapを使用しなかった場合と同じ問題が発生します。sgplotを使用する場合であってもattribute mapは必須といってよいでしょう。
SASでグラフを効率よく作成したいのであればattribute mapは避けて通れません。必ず覚えるようにしましょう。
次回はattribute mapの使用方法を解説してきます。