SAS

GTLでヒートマップを作図する heatmapステートメント

ヒートマップは2次元データの各数値の大きさを色で表現したグラフです。DNAマイクロアレイのデータやWEBのアクセス解析でよく使われます。
GTLではheatmapステートメントとheatmapparmステートメントで作図することが可能です。

heatmapparmは事前に決めておいたビン毎に集計する必要があります。

heatmapステートメント

heatmapステートメントであれば事前の集計をしなくてもSASが自動でビンを最適な大きさに設定し、頻度集計してくれます。
x軸の変数とy軸変数を指定するだけなので簡単です。

今回はnumpyを使って2変量正規乱数を生成し、乱数の発生頻度をヒートマップとして表現してみます。

proc template ; 
define statgraph heatmap; 
begingraph; 
layout overlay / 
   xaxisopts=(linearopts=(viewmax=7 viewmin=-7 
      tickvaluesequence=(start=-7 end=7 increment=1)
      )
   ) 
   yaxisopts=(linearopts=(viewmax=2 viewmin=-2 
      tickvaluesequence=(start=-2 end=2 increment=1))
   ) ; 

      heatmap x=x y=y / 
         nxbins=50 
         nybins=50 
         name="heat"; 

   continuouslegend "heat"; 
endlayout; 
endgraph; 
end; 
run; 

ods graphics / width=15cm height=15cm; 
proc sgrender data=bivariate_norm template=heatmap; 
run;
heapmpステートメントの使用例

特にオプションを指定しなくても作図できるのですが、見やすくするため軸設定とビンの設定を追加しています。
赤い部分が乱数の発生頻度が多い箇所です。

なおビンの設定は以下のオプションを使用すると細かく指定することができます。

オプション名説明
NXBINSX軸のビンの個数
NYBINSY軸のビンの個数
XBINSIZEX軸のビンの大きさ
YBINSIZEY軸のビンの大きさ
XBINSTARTX軸のビンの開始位置
YBINSTARTY軸のビンの開始位置
XVALUEXBINSTARTの値の定義

MIDPOINT=ビンの中央
LEFTPOINT=ビンの左境界
RIGHTPOINT=ビンの右境界

YVALUEYBINSTARTの値の定義

定義方法はXVALUEと同様

XBOUNDARY値がX軸ビンの境界上にあった場合の設定

UPPER=大きいほうのビンとして集計する
LOWER=小さいほうのビンとして集計する

YBOUNDARY値がY軸ビンの境界上にあった場合の設定
定義方法はXBOUNDARYと同様

なおdisplayオプションでallを設定するとビンの枠線を表示してくれます。
グラデーションの設定方法は前回紹介した等高線プロットと同様です。

GTLで等高線プロットを作図する contourplotparmステートメント地図でおなじみの等高線ですが、科学分野においても三次元データを平面に図示する際に利用されます。 等高線はGTLでも作図することができま...

heatmapparmステートメント

heatmapparmステートメントは事前に集計したデータを用意する必要があります。複雑な集計が必要な場合や、すでに集計済みのデータを入手できる場合はheatmapparmステートメントを利用するとよいでしょう。

今回は飛行機の乗客数のの推移をヒートマップで表現してみます。

proc template ; 
define statgraph heatmap2; 
begingraph; 
entrytitle "旅客機の搭乗人数"; 
   layout overlay ; 
      heatmapparm x=year y=month colorresponse=passengers/
         name="heat" ; 
      continuouslegend "heat"; 
   endlayout; 
endgraph; 
end; 
run; 

proc sgrender data=import2 template=heatmap2; 
run;
heatmapparmステートメントの使用例

これでも十分なのですが、各ビンの集計結果も同時に表示させてみます。すでに集計済みの変数をtextplotステートメントで表示させればできるのですが、数値変数を表示するとスペースが自動で挿入されて
表示位置がずれてしまうので、eval関数を使って乗客数を文字列型に変換して表示します。

proc template ; 
define statgraph heatmap2; 
begingraph; 
entrytitle "旅客機の搭乗人数"; 
   layout overlay ; 
      heatmapparm x=year y=month colorresponse=passengers/
         name="heat" ; 

      /*集計結果の表示*/ 
      textplot x=year y=month text=eval(strip(put(passengers,8.0))); 
      
      continuouslegend "heat"; 
   endlayout; 
endgraph; 
end; 
run; 

proc sgrender data=import2 template=heatmap2; 
run;
集計結果の同時表示

ラザニアプロット

ヒートマップはラザニアプロット(Lasagna plot)という作図にも使われます。これは個別の被験者の時系列データをヒートマップとして表現したものです。縦軸は個別の被験者、横軸は時間、応答変数の大きさはヒートマップの色として表現します。同様の作図にスパゲッティプロット(Spaghetti plot)がありますが、ラザニアプロットはスパゲッティプロットとことなり個々のデータが重ならないため可読性に優れています。

ラザニアプロットはheatmapparmステートメントで作図すれば作成できますが、heatmapparmはデフォルトでは文字列変数のような離散変数を軸変数として利用することができません。
xaxisoptsまたはyaxisoptsオプションで軸タイプをdiscreteに変更した後、heatmapparmのdiscretexまたはdiscreteyオプションをtrueに設定すると、離散軸であってもヒートマップを作成することができます。

スパゲッティプロットは以下の記事で紹介しています。

GTLでSpaghetti plotを作図するSpaghetti plotは一見seriesplotステートメントを使えば簡単なように見えますが、いくつか工夫が必要です。 Spag...

まずスパゲッティプロットで作図した例を紹介します。

スパゲッティプロット

今回は被験者数が少ないから各被験者の動向はわかりやすいですが、被験者が多くなってくるとラインが重なりすぎてわかりにくくなります。
同じデータをラザニアプロットで可視化すると以下のようになります。

proc template; 
define statgraph lasagna; 
begingraph; 
   layout overlay / 
      yaxisopts=(display=(label) 
      reverse=true type=discrete); 

      heatmapparm x=time y=usubjid colorresponse=response/ 
         discretey=true 
         name="heat"; 

      continuouslegend "heat" / 
         title="response" 
         orient=horizontal 
         valign=bottom; 
   endlayout; 
endgraph; 
end; 
run; 

proc sgrender data=sample template=lasagna; 
run;
ラザニアプロット

データ同士が重ならないので、どの被験者が異常値を出しているか、あるいは全体的な時間推移を把握しやすいグラフとなっています。range attribute mapを併用すれば、興味のある応答変数の閾値や上限・下限値を特定の色として表現できるようになるため、よりデータの状態がわかりやすくなります。