SAS

attribute mapを極める(1) なぜattribute mapが必要なのか

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;
attributeなし

仮に原油ETFの価格が取得できず欠損となってしまった場合、上記のコードのままだと以下のようになります。

金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;
attribute mapを使用

線の色が赤になりました。これでデータの欠損にかかわらず金ETFのデータ系列は必ず赤線で表示されます。

この仕組みによりデータごとにテンプレートの修正をする必要がなくなり、テンプレートの再利用が可能になります。

ちなみにsgplotではSTYLEATTRSステートメントにより群ごとに色を指定できますが、これはあくまでデータの表示順に従い属性リストを指定するだけで、データと属性を紐づけているわけではありません。
なのでSTYLEATTRSステートメントを使用してもattribute mapを使用しなかった場合と同じ問題が発生します。sgplotを使用する場合であってもattribute mapは必須といってよいでしょう。

SASでグラフを効率よく作成したいのであればattribute mapは避けて通れません。必ず覚えるようにしましょう。

次回はattribute mapの使用方法を解説してきます。