疫学系院生ブログ

統計、因果推論、プログラミングなどの備忘録です。

SGPLOTプロシジャ ①経時測定データ編

SGPLOTプロシジャは非常に柔軟にグラフを作成できる大変便利なプロシジャです。作成できるグラフは多岐に渡るので、何回かに分けてまとめていきたいと思います。第1回目は経時測定データです。

まずデータセットの作成です。

data d1;
 call streaminit(915);  /*乱数再現可能な乱数シードの設定*/
 do ID=1 to 100;
  group=rand("table", 1/2, 1/2);  /*2群の乱数生成*/
  do visit=1 to 5;
   bp=rand("normal", 150-(visit)*group , 10 );  /*各時点での正規乱数による値の生成*/
   output;
  end;
 end;
run;

proc format;            /*出力時のラベルを指定*/
 value groupf  1="対照群" 2="介入群"; 
run;

proc print data=d1;
 format group groupf. ;  /変数groupのラベルをgroupfに*/
run;


Obs ID group visit bp
1 1 対照群 1 147.659
2 1 対照群 2 141.000
3 1 対照群 3 146.824
4 1 対照群 4 140.422
5 1 対照群 5 133.076
6 2 介入群 1 130.799
7 2 介入群 2 169.138
8 2 介入群 3 158.752
9 2 介入群 4 131.655
10 2 介入群 5 138.241


上記のプログラムでは乱数生成の際にシードを設定しています。これは乱数生成を開始する初期値を与えているのです。同じシードを設定すれば毎回同じデータを生成できます。


ここからSGPLOTプロシジャでグラフを作成します。まず2群の平均値の推移をグラフで表現します。

proc sgplot data=d1;  
 vline visit /          /*vlineステートメント:折れ線グラフの表示(X軸の変数指定)*/
   response=bp                  /*responseオプション:y軸の変数の指定*/
   group=group                 /*groupオプション:グループ変数の指定*/
   stat=mean                      /*statオプション:プロットする統計量(平均値)*/ 
   markers                          /*markersオプション:プロットに◯を表示*/
   limitstat=stddev;            /*limitstatオプション:SD, SE, CIのどれかを表示*/
 format group groupf.;       /*formatプロシジャで設定したラベルの指定*/
run;

f:id:MisakiF:20200916155622p:plain

統計量の推移をグラフ化するのに使用するのがVLINEステートメントです。これは折れ線グラフの図示に使用されるもので、経時測定データの平均値推移のグラフでよく使用されます。


これだと標準偏差のバーが2群間で重なっていて見づらいかもしれません。その場合はgroupdisplayオプションで分けることができます。またグラフ内に各時点での平均値を表示したい場合は、Xaxistableステートメントで表示可能です。

proc sgplot data=d1;  
 vline visit / response=bp
  group=group stat=mean limitstat=stddev 
  groupdisplay=cluster       /*groupdisplayオプション:2群のプロットをずらして表示*/
   markers;
 xaxistable bp/      /*Xaxistableステートメント:表示する変数の指定*/
  separator          /*グラフと平均値表を線で分ける*/
  stat=mean        /*表示する統計量の指定*/
  loaction=inside;   /*locationオプション:表示位置の指定(inside, outside)*/
 format group groupf.;
run;


f:id:MisakiF:20200916162419p:plain


以上のプログラムは一部のオプションしか紹介できていませんが、VLINEステートメントだけでも非常に多くのオプションがあります。まずはよく使うものだけ覚えて、適宜ヘルプで調べるのが良いでしょう。


場合によっては平均値ではなく、個人ごとの推移をみたい場合もあるかもしれません。
その場合は時系列プロットが可能なseriesステートメントの出番です。

proc sgplot data=d1;
 series x=visit y=bp/ group=group ;
 format group groupf.;
run;

f:id:MisakiF:20200916165238p:plain


今回のデータでは非常に見づらくなっていますが、研究によっては個人ごとの推移が見たい場合もあります。



●困ったときのSASヘルプ
https://documentation.sas.com/?docsetId=grstatproc&docsetTarget=n0yjdd910dh59zn1toodgupaj4v9.htm&docsetVersion=9.4&locale=en

SASのSGPLOTとRのGGPLOT2を比較する面白い資料
https://www.sas.com/content/dam/SAS/ja_jp/doc/event/sas-user-groups/usergroups2016-b-02-06.pdf