2020年2月29日土曜日

[PROC SORT] オブザベーションの並べ替え(ソート)




SORTプロシジャで、オブザベーションの並べかえをすることが出来ます。





構文

PROC  SORT   DATA=対象データセット名   OUT=出力データセット名;
     BY   変数1  変数2 ...;
RUN;


DATA=」のデータセットを「BY」に指定した変数値順にオブザベーションを並べ替え、結果を「OUT=」に指定したデータセット名で出力します。




重要なポイント






/* Sample */
data test;
input a b c$;
cards;
2 1 aa
2 2 bb
1 2 cc
1 1 dd
;










/* PROC SORTの例 */
proc sort data=test out=test2;
   by a b;
run;




2020年2月19日水曜日

【SGPLOT】POLYGONステートメントの描き方いろいろ





SGPLOT の POLYGONステートメント でポリゴンを描画できます。
今回はこのステートメントの色々な書き方を紹介していきたいと思います。





1. POLYGONステートメントの基本




以下の例をご覧ください。

/* 座標を定義 */
data test;
input segment x y;
cards;
1 1 1
1 5 1
1 5 5
1 1 5
;

/* ポリゴンを描画 */
proc sgplot data=test;
   polygon x=x y=y id=segment / fill outline;
   xaxis min=0 max=6;
   yaxis min=0 max=6;
run;




  • 最初にデータステップでx軸とy軸の座標を定義
  • SGPLOT の POLYGONステートメントで、座標間に順番に線を引いていって形をつくる(以下のようなイメージ)









2. 複数のポリゴンを描画する


/* 座標を定義 */
data test;
input segment x y;
cards;
1 1 1
1 2 1
1 2 2
1 1 2
2 3 3
2 4 3
2 4 4
2 3 4
;

/* ポリゴンを描画 */
proc sgplot data=test;
   polygon x=x y=y id=segment / fill outline;
   xaxis min=0 max=6;
   yaxis min=0 max=6;
run;


POLYGONステートメントで「id=segment」と指定しています。
この「ID=」に指定した変数の値ごとにポリゴンを別々に描画することが出来ます。
今回はSEGMENTという変数の値ごとに2つポリゴンを描画しています。




ちなみに、以下のようにポリゴンを重ねることも可能です。

/* 座標を定義 */
data test;
input segment x y;
cards;
1 1 1
1 5 1
1 5 5
1 1 5
2 3 3
2 6 3
2 6 6
2 3 6
;

/* ポリゴンを描画 */
proc sgplot data=test;
   polygon x=x y=y id=segment / fill outline;
   xaxis min=0 max=6;
   yaxis min=0 max=6;
run;





3. 穴を作る


/* 座標を定義 */
data test;
input segment x y;
cards;
1 1 1
1 5 1
1 5 5
1 1 5
1 . .
1 2 2
1 4 2
1 4 4
1 2 4
;

/* ポリゴンを描画 */
proc sgplot data=test;
   polygon x=x y=y id=segment / fill outline;
   xaxis min=0 max=6;
   yaxis min=0 max=6;
run;



上で作成したデータセットのように、

  • まず外側のポリゴンを定義した後、
  • x軸とy軸が欠損値の行を用意することで、そこから穴の始まりを示すことが出来る。
  • その後の定義は穴として描画される。





ちなみに、穴をちょっとずらして定義すると、以下のように面白い感じになる。

/* 座標を定義 */
data test;
input segment x y;
cards;
1 1 1
1 5 1
1 5 5
1 1 5
1 . .
1 3 3
1 6 3
1 6 6
1 3 6
;

/* ポリゴンを描画 */
proc sgplot data=test;
   polygon x=x y=y id=segment / fill outline;
   xaxis min=0 max=6;
   yaxis min=0 max=6;
run;




2020年2月6日木曜日

グラフのマーカーや線などの属性をGROUP毎に設定する【Attribute Map Statement 編】



「Attribute Map Statement」を利用して、GTLでマーカーや線などの属性を定義する方法を紹介。



と、その前に、以前「Attribute Map Dataset」を紹介しました。
グラフのマーカーや線などの属性をGROUP毎に設定する【Attribute Map Dataset 編】


今回はもう1つの方法として「Attribute Map Statement」を紹介していきます。
(※Attribute Map StatementはGTLのみの機能となります)



さっそくサンプルプログラム

proc template ;
     define statgraph MYTEMP ;
     begingraph;

     /* Attribute Map を定義 */
     discreteattrmap name="mymap";
        value "11" "12" / markerattrs=(color=blue    symbol=starFilled        size=11);
        value "13" "14" / markerattrs=(color=yellow symbol=TriangleFilled  size=11);
        value other       / markerattrs=(color=red      symbol=CircleFilled     size=11);
     enddiscreteattrmap;

     /* 「Attribute Map」と「グループ変数」を関連付ける */
     discreteattrvar  var=age attrmap="mymap" attrvar=myvar;

     /* 「Attribute 変数」の使用 */
     layout overlay;
          scatterplot x=HEIGHT y=WEIGHT / group=myvar grouporder=ascending name="leg1";
          discretelegend "leg1" / title="Age";
     endlayout;

     endgraph;
     end;
run;

proc sgrender data=SASHELP.CLASS template=MYTEMP;
run;


上の例では以下のような設定をしています。
  • 年齢(AGE)をグループ変数として、マーカーの種類と色を以下に設定
  • AGEが「11」「12」の時、青色の星マーク
  • AGEが「13」「14」の時、黄色の三角マーク
  • AGEが上記以外の時、赤色の丸マーク


ではどのように設定しているか見ていきましょう。




Step1. 「Attribute Map」を定義する


まずは、グループ変数の値にどういった書式(属性)を割り当てるのか?を定義します。

構文
DISCRETEATTRMAP  NAME="Attribute Mapの名前";
     VALUE  "グループ変数の値1"  /  属性;
     VALUE  "グループ変数の値2"  /  属性;
     …
ENDDISCRETEATTRMAP;


今回は以下のように書いています。

discreteattrmap name="mymap";
   value "11" "12" / markerattrs=(color=blue    symbol=starFilled        size=11);
   value "13" "14" / markerattrs=(color=yellow symbol=TriangleFilled  size=11);
   value other       / markerattrs=(color=red      symbol=CircleFilled     size=11);
enddiscreteattrmap;

  • 「mymap」というAttribute Map を定義
  • グループ変数の値が「11」「12」の時、青色の星マーク
  • グループ変数の値が「13」「14」の時、黄色の三角マーク
  • グループ変数の値が上記以外の時、赤色の丸マーク


ちなみに属性には「マーカー」や「塗りつぶし」といった設定を行う以下の属性オプションが用意されています(GTL書いたことある人ならお馴染みの書き方)

  • MARKERATTRS=()
  • FILLATTRS=()
  • LINEATTRS=()
  • TEXTATTRS=()


重要ポイント

グループにする変数にFORMATが割り当てられている場合、FORMATを当てた後の値を指定する事。
例えば年齢をグループ変数とする場合、11 = "11歳" のようにFORMATが当てられている場合、"11歳" の方を指定する。

discreteattrmap name="mymap";
   value "11歳"  / markerattrs=(color=blue symbol=starFilled  size=11);
enddiscreteattrmap;




Step2. 「Attribute Map」と「グループ変数」を関連付ける


次に、先ほど定義した「Attribute Map」と「実際のグループ変数」を関連付けます。


構文
DISCRETEATTRVAR
    VAR              = グループ変数
    ATTRVMAP  = "グループ変数と関連付けるAttribute Map"
    ATTRVAR     = グループ変数とAttribute Mapの関連付けに対して、任意の名前を定義
;


今回は以下のように書いています。

discreteattrvar var=age attrmap="mymap" attrvar=myvar ;

「グループ変数=AGE」と「Attribute Map="mymap"」を「myvar」という名前(Attribute変数)で関連付けています。



Step3. 「Attribute変数」の利用


あとはPLOTするときに、グループ変数として「Attribute変数」を指定すればOK

scatterplot x=HEIGHT y=WEIGHT / group=myvar grouporder=ascending ;

これで、Attribute Mapの定義に基づいてマーカーの種類や色などの属性を展開してPLOTしてくれます。

注意:
SAS9.4M3より前のバージョンでは、この機能 (Attribute Map Statement) と一緒に、PLOTステートメント (SCATTERPLOTやSERIESPLOTなど) でも属性を定義している場合、結果のプロット部分と凡例部分の属性が一致していないおかしな状態になってしまうことがある?らしいので注意。