僕の頁 <SASと臨床試験と雑談と>

徒然なるままにSAS暮らし

0830

bubble plot (バブルプロット)  

SAS9.3から対応されたbubbleプロットの紹介です。頑張ればGPLOTプロシジャでも作成できますが、やはり見栄えはSGPLOTプロシジャのほうが優れています。自動車関連の情報が格納されたsashelp.carsデータセットについて、車種、企業の地域ごとに街中の燃費をbubbleの大きさとしてグラフを作成します。bubbleステートメントで、X軸、Y軸、サイズ変数をそれぞれX=,Y=,size=で指定します。さらに、カテゴリ変数ごとに色を変えて出力したい場合はgroupオプションにカテゴリ変数を指定します。
*** 車種, メーカーの地域ごとの燃費の平均値算出(miles per gallon) ;
proc summary data=sashelp.cars nway ;
class type origin ;
var mpg_city ;
output out=_OUT(drop=_TYPE_ _FREQ_) mean=mean ;
run ;
*** sgplot: Bubble statement ;
title "[SGPLOT] bubble plot for Meen MPG (City)" ;
proc sgplot data=_OUT noborder ;
styleattrs datacolors=(red green blue) datacontrastcolors=(red) ; *--- 地域ごとに色を変える ;
bubble x=origin y=type size=mean / group=origin dataskin=sheen ; *--- bubble plot ;
xaxis offsetmin=0.3 offsetmax=0.3 display=(noline noticks) ;
yaxis offsetmin=0.2 offsetmax=0.2 display=(noline noticks) grid ;
run ;

結果は以下になります。地域ごとに色分けされたバブルプロットが出力されています。Asiaにしかありませんが、テストデータでもHybridの燃費が良いことが一目で確認できます。
bubble_SG.png

ちなみに従来のグラフ作成プロシジャではGPLOTプロシジャのbubbleステートメントを使用します。やはりSGPLOTプロシジャには見劣りします。また、そこまで深く調べてませんが、グループごとの色分けは簡単にはできないかもしれません。
*** gplot: Bubble statement ;
title "[GPLOT] bubble plot for Meen MPG (City)" ;
axis1 offset=(20, 20)pct length=70pct ;
axis2 offset=(10, 10)pct length=70pct ;
proc gplot data=_OUT ;
bubble type*origin=mean / haxis=axis1 vaxis=axis2 bfill=solid bcolor=red ;
run ;
quit ;

bubble_GPLOT.png
スポンサーサイト

Posted on 2015/08/30 Sun. 23:24 [edit]

CM: 0
TB: 0

0822

datapanelステートメントとdatalatticeステートメント  

Graph Template Language(GTL)で分類変数のカテゴリごとのグラフを出力する場合に用いるdatapanelステートメントとdatalatticeステートメントを紹介します。双方のステートメントでほとんど同じオプションが使用できるのですが、datapanelステートメントが3個以上の分類変数を指定できるのに対して、datalatticeステートメントはその名の通り格子型の出力を想定しているので、行と列の2変数までの指定となります。もちろんSGRENDERプロシジャのby変数で他のカテゴリ変数のカテゴリごとに出力することは可能です。

・GTL内の主な構文
proc template ;
define statgraph _XXX94 ;
begingraph ;
entrytitle <"タイトル"> ;
layout datapanel<またはdatalattice> classvars=(変数1 変数2・・・) ;
layout prototype ;
plotステートメント ;
endlayout ;
sidebar ;
DiscreteLegendステートメント ;
endsidebar ;
endlayout ;

endgraph ;
end ;
run ;


・datapanelステートメントとdatalatticeステートメントの主な違い
項目datapaneldatalattice
分類変数の指定classvars=(変数1 変数2…)columnvar=列の分類変数 rowvar=行の分類変数
レイアウトカテゴリが各セル上部に表示される。行側・列側に格子状にカテゴリが表示される。
sparseオプション全てのカテゴリの組み合わせについて、true(空セル出力)またはfalse(空セル非出力)なし
skipemplycell(行と列の数と分類変数のカテゴリ数が一致しない場合)true(空セル出力)またはfalse(空セル非出力)true(空セル出力)またはfalse(空セル非出力)


datapanelステートメントとdatalatticeステートメントを使用して、以下の条件で生成した架空の臨床試験データ(変数VAL)で3群の平均値推移図を作成します。
・200例の被験者
・被験者ごとに2個の分類変数(CAT1, CAT2)
・3治療群、4時点の継時的なデータ(GRP, VISIT)

テストデータ作成
*** テストデータ作成 ;
data test ;
do I = 1 to 200 ;
GRP = rantbl(100,1/3,1/3,1/3) ;
CAT1 = rantbl(100,1/2,1/2) ;
CAT2 = rantbl(100,1/3,1/3,1/3) ;
do VISIT = 1 to 4 ;
VAL = 10 + GRP + CAT1 + CAT2 + GRP*CAT1 + GRP*CAT2 + VISIT + rannor(100) ;
output ;
end ;
end ;
run ;

*** 要約統計量の算出 ;
proc summary data=test nway ;
class CAT1 CAT2 VISIT GRP ;
var VAL ;
output out=_OUT(drop=_TYPE_ _FREQ_ ) mean=mean ;
run ;


続いて、GTLによるグラフ作成部分を以下に示します。細かいオプションは余力があれば別途紹介したいと思います。
①datapanelステートメント
proc template ;
define statgraph _XXX94 ;
begingraph / datacontrastcolors = (orange purple blue)
datalinepatterns = (1)
datasymbols = (circlefilled trianglefilled diamondfilled) ; *--- SGPLOTのstyleattrsに対応 ;
entrytitle "test" ;
layout datapanel classvars=(CAT1 CAT2)
/ start = topleft border = false headerlabeldisplay = namevalue skipemptycells = false sparse = false
columnaxisopts = (type=discrete display=(line ticks tickvalues label) label="Visit")
rowaxisopts = (display=all label='VAL (mg/dL)')
columndatarange = unionall rowdatarange = unionall
columngutter = 5 rowgutter = 1
columns = 3 rows = 3 ;

layout prototype ;
SeriesPlot X=VISIT Y=mean
/ group=GRP Lineattrs=(Thickness=1px) name="G" legendlabel="Group" groupdisplay=overlay display=(markers) ;
endlayout ;
sidebar / align=right ;
DiscreteLegend "G" "S" / displayclipped=true location=outside across=1 title="Group" border=false ;
endsidebar ;
endlayout ;

endgraph ;
end ;
run ;
*** グラフ出力 ;
proc sgrender data=_OUT template=_XXX94 ;
run ;


結果は以下になります。
datapanel_1.png

②datalatticeステートメント
*** datalatticeステートメント ;
*** 2変数指定の場合,行列の出力レイアウトが決まるのでdatalatticeにはsparseオプションは存在しない ;
proc template ;
define statgraph _YYY94 ;
begingraph / datacontrastcolors = (orange purple blue)
datalinepatterns = (1)
datasymbols = (circlefilled trianglefilled diamondfilled) ; *--- SGPLOTのstyleattrsに対応 ;
entrytitle "test" ;
layout datalattice columnvar=CAT1 rowvar=CAT2
/ start = topleft border = false headerlabeldisplay = namevalue skipemptycells = false
columnaxisopts = (type=discrete display=(line ticks tickvalues label) label="Visit")
rowaxisopts = (display=all label='VAL (mg/dL)')
columndatarange = unionall rowdatarange = unionall
columngutter = 5 rowgutter = 1
columns = 3 rows = 3 ;

layout prototype ;
SeriesPlot X=VISIT Y=mean
/ group=GRP Lineattrs=(Thickness=1px) name="G" legendlabel="Group" display=(markers) ;
endlayout ;
sidebar / align=bottom ;
DiscreteLegend "G" / displayclipped=true location=outside across=3 title="Group" border=false ;
endsidebar ;
endlayout ;

endgraph ;
end ;
run ;
*** グラフ出力 ;
proc sgrender data=_OUT template=_YYY94 ;
run ;


結果は以下になります。どちらも柔軟なレイアウトを指定できますので、カテゴリの出力レイアウトや分類変数の数でdatapanelとdatalatticeを使い分けましょう。
datalattice_1.png

Posted on 2015/08/22 Sat. 23:38 [edit]

CM: 0
TB: 0

0821

GTLでstyleattrsと同様のグループ属性を指定する  

先日、SGPLOTプロシジャのstyleattrsステートメントを紹介しましたが、同様の出力をGTL(Graph Template Language)で実現する方法を紹介します。GTLでは、begingraphステートメントでdatacontrastcolors等のオプションを指定することができます。まず、テストデータとして、カテゴリ変数2個と色分けしたいグループ変数、Visit変数、分析対象の変数を作成し、平均値をseriesプロットで描画します。GTLではdatalatticeステートメントでカテゴリ変数のパネルごとにグラフを作成し、SGPANELプロシジャで同様のグラフを作成します。datalatticeステートメントについては別途紹介したいと思います。

・テストデータ作成と要約統計量算出
*** テストデータ作成 ;
data test ;
do I = 1 to 200 ;
GRP = rantbl(100,1/3,1/3,1/3) ;
CAT1 = rantbl(100,1/2,1/2) ;
CAT2 = rantbl(100,1/3,1/3,1/3) ;
do VISIT = 1 to 4 ;
VAL = 10 + GRP + CAT1 + CAT2 + GRP*CAT1 + GRP*CAT2 + VISIT + rannor(100) ;
output ;
end ;
end ;
run ;
*** 要約統計量の算出 ;
proc summary data=test nway ;
class CAT1 CAT2 VISIT GRP ;
var VAL ;
output out=_OUT(drop=_TYPE_ _FREQ_ ) mean=mean ;
run ;


・GTLによるグラフ作成(青字部分がグループ変数GRPのスタイル指定箇所)
*** 1. GTLによるGroupのカテゴリごとのスタイル指定 ;
proc template ;
define statgraph _XXX ;
begingraph / datacontrastcolors = (orange purple blue)
datalinepatterns = (1)
datasymbols = (circlefilled trianglefilled diamondfilled)
; *--- SGPLOT/SGPANELのstyleattrsに対応 ;
entrytitle "test" ;
layout datalattice rowvar=CAT1 columnvar=CAT2
/ start = topleft border = false headerlabeldisplay = namevalue skipemptycells = true
columnaxisopts = (type=discrete display=(line ticks tickvalues label) label="Visit")
rowaxisopts = (display=all label='VAL (mg/dL)')
columndatarange = unionall rowdatarange = unionall
columngutter = 5 rowgutter = 1
columns = 3 rows = 2 ; *--- 行と列の数や隙間を指定 ;
layout prototype ;
seriesplot x=VISIT y=mean
/ group=GRP lineattrs=(Thickness=1px) name="G" legendlabel="Group"
groupdisplay=overlay display=(markers) ; *--- lineにmarkersymbolを重ねる ;
endlayout ;
sidebar / align=bottom ;
DiscreteLegend "G" / displayclipped=true location=outside across=3 title="Group" border=false ;
endsidebar ;
endlayout ;
endgraph ;
end ;
run ;
*** グラフ出力 ;
proc sgrender data=_OUT template=_XXX ;
run ;


・結果は以下になります。
GTL_vs_styleattrs_1.png

・SGPANELプロシジャによるグラフ作成(青字部分がグループ変数GRPのスタイル指定箇所)
*** 2. sgpanelのstyleattrs ;
title "test" ;
proc sgpanel data=_OUT ;
styleattrs datacontrastcolors = (orange purple blue)
datalinepatterns = (1)
datasymbols = (circlefilled trianglefilled diamondfilled) ;

panelby CAT2 CAT1 / layout=lattice columns=3 ;
series x=VISIT y=mean / group=GRP name="leg" legendlabel="Group" markers ;
keylegend "leg" / position=bottom title="Group" noborder ;
colaxis label="Visit" type=discrete ;
rowaxis label="VAL (mg/dL)" ;
run ;


・結果は以下になります。グラフの間の隙間部分以外、GTLとほとんど同様の出力になります。選択肢が広がって便利です。
GTL_vs_styleattrs_2.png

参考サイト:http://blogs.sas.com/content/sgf/2014/05/30/assigning-graph-style-attributes-easily/

Posted on 2015/08/21 Fri. 01:12 [edit]

CM: 0
TB: 0

0818

ODS出力時の罫線のカスタマイズ  

先日RWIの記事で、RWIの罫線カスタマイズが優れている話をしましたが、reportプロシジャでも頑張れば多様な罫線カスタマイズが可能という話です。もちろんreportプロシジャに限らず、tabulateプロシジャやtemplateプロシジャとの組み合わせでも様々なカスタマイズが可能です。ODS出力時のレポートのカスタマイズ全般については統計解析ソフト「SAS」でも解説しておりますので、ご興味ある方は是非ご一読ください。

テストデータの作成も前回同様、臨床試験で得られた継時的な体重の変化量を想定します。
・テストデータ作成と要約統計量算出
*** Format作成 ;
proc format ;
value GRPF 1 = "Placebo" 2 = "Active" ;
value VISITF 1 = "Week 2" 2 = "Week 4" 3 = "Week 6" ;
run ;

*** テストデータ作成 ;
data TEST ;
do I = 1 to 50 ;
do VISIT = 1 to 3 ;
do GRP = 1 to 2 ;
CHG = -1*VISIT + -0.5*VISIT*GRP + rand("normal") ;
output ;
end ;
end ;
end ;
format GRP GRPF. VISIT VISITF. ;
run ;

*** 要約統計量の算出 ;
proc summary data=TEST n mean stddev nway ;
class VISIT GRP ;
var CHG ;
output out=_OUT(drop=_FREQ_ _TYPE_) n=n mean=mean stddev=sd ;
run ;


・罫線カスタマイズ部分
罫線をカスタマイズしたい箇所に「borderbottomcolor=green borderbottomwidth=0.5」などと指定して、下線の色や太さをカスタマイズしております。対応関係を掴むために下記プログラムと出力結果の罫線の色を対応させております。header部分のwhite(プログラムの黒の太字部分)については、出力結果で罫線があたかも存在しないように見せるための指定です。
ods escapechar="\" ;
ods listing close ;
ods pdf ;
ods rtf ;
title ;

*** reportプロシジャ ;
proc report data=_OUT nowd
style(report)={rules=none frame=void}
style(header)={just=l borderbottomcolor=pink borderbottomwidth=1} ;
columns ("\S={just=l borderbottomcolor=green borderbottomwidth=0.5} report procedure"
("\S={borderbottomcolor=white borderbottomwidth=0.5}" VISIT GRP)
("\S={just=c borderbottomcolor=green borderbottomwidth=0.5} Summary Statistics" N MEAN SD)
)
DEF ;
define VISIT / order "Visit" style={width=80pt just=l} format=VISITF. ;
define GRP / display "Treatment" style={width=80pt just=l} format=GRPF. ;
define N / display "N" style={width=60pt just=r} format=best. ;
define MEAN / display "Mean" style={width=60pt just=r} format=8.1 ;
define SD / display "SD" style={width=60pt just=r} format=8.2 ;
define DEF / noprint computed ; *--- ダミー(罫線出力用) ;

compute DEF ;
if GRP =2 then do ;
call define(_ROW_,'style',"style={borderbottomcolor=purple borderbottomwidth=0.5}") ;
end ;
else if GRP =1 then do ;
call define('_C2_','style',"style={borderbottomcolor=blue borderbottomwidth=0.5}") ;
call define('_C3_','style',"style={borderbottomcolor=blue borderbottomwidth=0.5}") ;
call define('_C4_','style',"style={borderbottomcolor=blue borderbottomwidth=0.5}") ;
call define('_C5_','style',"style={borderbottomcolor=blue borderbottomwidth=0.5}") ;
end ;
endcomp ;
run ;

ods rtf close ;
ods pdf close ;
ods listing ;

出力結果は以下になります。一昔前は要件を完全に満たすことを諦めたり、膨大な時間を費やしてマニュアルを漁ったりしてましたが、罫線のカスタマイズはどんどん進化していて、この先もどんな新しい機能が出てくるか楽しみです。症例一覧表のカスタマイズなんかも今ゼロから書いてみると全く違うプログラムで綺麗なレポートが出力できたりするんでしょうね。。

・PDF出力
罫線_01

・RTF出力
罫線_02

Posted on 2015/08/18 Tue. 00:11 [edit]

CM: 0
TB: 0

0816

自動チャート(Auto Chart)によるグラフの自動生成  

SAS9.4から追加された「自動チャート(Auto Chart)」のお話です。例のごとく9.4が出てだいぶ時間も経っているので、知っている人にとってはなんてことのない機能ですが、とても有用で、初めて目にした際にかなり驚いた機能だったので、個人的な備忘録も兼ねて紹介させて頂きます。この機能は「ODS Graphics Designer」の一部なのですが、データステップ100万回の記事でODS Graphics Designer自体の基本的な使用方法が紹介されているので、自動チャート以外はそちらをご参照ください。また、GTLのコードが自動生成されますが、こちらは統計解析ソフト「SAS」でも少しだけ触れているのでご参照ください。さらに、SAS忘備録でも解説が始まりましたので併せて読むと理解が深まると思います。

自動チャートの作業の流れは以下になります。
①「ツール」から「ODS Graphics Designer」をクリックして起動します。
Auto_Chart_01.png
②ODS Graphics Designerの「ツール」から「自動チャート」をクリックして起動します。
Auto_Chart_02.png
Auto_Chart_03.png
③ライブラリとデータセットを選択後、分析対象となる変数を選択して自動チャートを実行します。
ここでは、SASHELPライブラリの自動車関係のデータを格納したデータセットCARSを選択し、カテゴリ変数としてTYPE、連続変数としてMSRP(自動車の希望小売価格)、MPG_CITY(街中の燃費)を選択し、グラフの種類全てにチェックを入れます。その後、「グラフの生成」をクリックすると、グラフの自動生成が始まります。今回はヒストグラムや散布図、棒グラフ、箱ひげ図等、20個のグラフが生成されました。
Auto_Chart_04.png

↓生成された後の画面
Auto_Chart_05.png

④生成されたグラフのコードを確認します。
ここからは自動チャート以外の基本的な使用方法と同様で、グラフをダブルクリックし、メニューの「表示」⇒「コード」をクリックして生成されたSASプログラムコードを確認します。もちろん表示されたコードをコピーしてそのままSAS上で実行しても同じグラフが生成されます。
Auto_Chart_06.png
↓SASコードの表示
Auto_Chart_07.png

GTLを使いこなすためには、非常に複雑なコード体系を習得する必要がありますので、自動チャートはGTLを勉強するための非常に有用なツールとなるのではないでしょうか。マクロを作成して将来的に使いまわす際のベースとなるプログラムにもなるかと思います(私も文法なんてちゃんと覚えておらず、書く度にマニュアル開いている次第です)。「SAS9.4新機能」とかのドキュメント類には取り上げられているのですが、片隅に記載されているだけなので、このような有用な機能についてはSASユーザー総会等で、「自動チャート」だけで様々な事例を交えて1時間程度発表する等、もっと宣伝すれば良いのに、と思ってしまいます(ODS Graphics Designerの発表はあったんでしたっけね、忘れました。。)。まずは「データを色んなグラフを駆使して図示し、分布や傾向を視覚的に確認する」のは、解析担当者の基本的かつ重要なステップと思いますので、今後の広がりに期待したいですね。

Posted on 2015/08/16 Sun. 10:29 [edit]

CM: 0
TB: 0

プロフィール

最新記事

最新コメント

最新トラックバック

月別アーカイブ

カテゴリ

訪れた人

▲Page top