SAS

GTLのdynamic variableを使いこなす

GTLはデータセットに応じて柔軟にグラフを作成する仕組みが組み込まれています。その仕組みの一つがDynamic variableです。

Dynamic variableとは

GTLで作成したテンプレートを使ってグラフを作成するとき、読み込むデータセットによって作図に使用する変数を変更したい時があると思います。また表題もグラフごとに変更したいこともあるでしょう。

その場合sgplotの場合はプロシジャの設定を直接書き換える必要があります。もしくはsgplotをマクロ化して変数や表題を引数として定義し、マクロ実行時に適宜引数を書き換えるといったこともできます。

GTLのDynamic variableはこの時のマクロ変数と同等の働きをします。

データセットに応じて変更したい部分をDynamic variableに置き換えて、Sgrender実行時に使用する変数や文字列を指定することで、テンプレートは変更せずに使用する変数のみを変えてグラフ出力することができます。

Dynamic variableの使用方法

GTLのstatgraphブロック内でdynamicステートメントを使用することで、Dynamic variableを定義します。この時区別しやすいように先頭にアンダーバーを付与すると良いと思います。ここでは表題、散布図のX軸、Y軸をデータセットの変数ではなくDynamic variableを使用しています。

proc template;
define statgraph mygraph;
dynamic _NAME _TIME _RESPONSE;

begingraph;
entrytitle _NAME;
   layout overlay;
      scatterplot x=_TIME y=_RESPONSE;
   endlayout;
endgraph;
end;
run;

次にsgrenderプロシジャで作成したテンプレートを基にグラフを作成します。

データセットds1には時間変数”TIME”と応答変数”RESPONSE”が格納されています。

dynamicステートメントでテンプレートのdynamic variableに代入する変数あるいは文字列、マクロ変数などを指定します。データセットの変数を指定する場合はクォーテーションで囲みましょう。この点はマクロ変数とは異なります。

data ds1;
   do TIME=0 to 50;
      RESPONSE=sin(TIME/constant('pi'));
      output;
   end;
run;

proc sgrender data=ds1 template mygraph;
   dynamic _NAME="テスト" 
         _TIME ="TIME" _RESPONSE="RESPONSE";
run;

sgrenderプロシジャを実行するときにdynamic variableに相当する部分を自由に変更できます。このため表題を変える時もテンプレートを修正する必要はありません。

上記のコードを実行結果は以下の通り。

上記のコードの実行結果

実行結果

マクロ変数との違い

マクロ変数は%letステートメントかcall symutで初期化されますが、Dynamic variableはsgrender実行時に初期化されます。

マクロ変数を使用しても同じことができますが、マクロ変数を使用するとテンプレートを毎回コンパイルする必要があるため、おそらくマクロ変数を使用すると処理速度が遅くなると思います。

このあたりは試したことはないので、テストしてみても良いかも