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

徒然なるままにSAS暮らし

----

スポンサーサイト  

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Posted on --/--/-- --. --:-- [edit]

CM: --
TB: --

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

0819

申請時電子データ提出にかかる実務担当者のためのワークショップ  

9月28日に東京で、来年から開始される新薬製造販売承認申請時の電子データ提出に携わる実務者向けに「申請時電子データ提出にかかる実務担当者のためのワークショップ ~CDISC準拠データを中心に~」が開催されます。日本製薬工業協会及び日本CRO協会、医薬品医療機器総合機構(PMDA)の共催ですが、多数の来場者を見込んで800人収容可能な会場にて実施されます。SASユーザー総会のCDISC企画セッションに引き続き、ADaMのトレーサビリティやバリデーションについて一演題発表させて頂くことになりました。個人的な感覚ですが、新薬審査プロセスにおいて、PMDAはFDAよりも積極的なADaMの利用を進める姿勢を見せていますので、今後ADaM関連の議論を活発化させるきっかけになればと思います。

他にもPMDAなど注目すべき発表が結構あるので、都合のつく方は足を運んでみると有益な情報収集ができると思います。いよいよあと一年という感じで、このような大きなワークショップも開催され、業界の注目度も増してきているのが実感できますね。

Posted on 2015/08/19 Wed. 21:35 [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

0815

ADaM関連の文書  

ADaMを勉強するにあたって目を通しておくべき文書を挙げておきます(漏れもありそうですが)。ADaMを理解するためにはSDTMの知識はもちろん必要ですが、SDTM関連の文書までカバーすると広がりすぎるので省いてます(もちろん規制当局絡み、Define.xmlやOpenCDISC等は共通ですが)。現在はドラフト版ですが、併合解析用のADSLもそのうちリリースされるでしょう。

CDISCのHPのADaMに関する文書
ADaM(Analysis Data Model)V2.1
 ADaMの概要や,ADaMで申請する際に求められるデータセットやメタデータの内容を包括的に定義している資料
ADaMIG(ADaM Implementation Guide)V1.0(及びV1.1ドラフト)
 実際にADaMデータセット及びメタデータを作成する際の変数や格納方法等の詳細が事例とともに紹介されているドキュメント.
OCCDS V1.0
 有害事象や併用薬の解析用のデータセットの定義を詳細に解説している資料.IGとともに実際の作業には必須となる.一般形としてOCCDSに統合される.
ADTTE V1.0
 生存時間解析用のデータセットの定義を詳細に解説している資料.IGとともに実際の作業には必須となる.
ADaM Validation Checks V1.3
 自動的に適合性の確認が可能な項目を定義している.OpenCDISCのADaMのConfigファイルの元となる文書.
Examples in Commonly Used Statistical Analysis Methods
 臨床試験で一般的に用いられる解析手法に対するADaMデータセットの例示
CDISC Define-XML Specification Version 2.0及びAnalysis Results Metadata (AResM) V1.0
 Define.xmlの定義とDefine.xmlの一部である解析結果メタデータ用の定義

②その他、関連する文書等
ADaM Controlled Terminology
 SDTMに比べると非常に少ないが定義されている.
Analysis Data Reviewer's Guide (ADRG)
 PhUSEから発行されたReviewer用のADaM関連の説明文書(試験ごとに作成)
OpenCDISC Validator
 CDISC標準の適合性確認(バリデーション)に使用される世界標準のツール
PMDA の通知類
 PMDAの申請時電子データ提出に関する要求事項を記載
FDAのガイダンス類
 FDAの申請時電子データ提出に関する基本的・詳細な要求事項を記載
FDA,CDISC,製薬企業のパイロット試験
 e-Data submissionの本番を想定し,必要な成果物を一通り作成したパイロット試験
PhUSEのWhite Paper等
 PhUSEでは,医薬品開発におけるDM・統計関連の様々なトピックのBest Practiceを議論し,CDISC関連のトピックも多く,White Paper等が発出されている.
TAスタンダード
 疾患領域ごとに定義されるモデルで、最近ADaMが定義される事例も増えてきた(TQT、DM、Dyslipidemia等).

余力があれば一つ一つ解説したいですね。CDISCでは脇役のADaM関連だけでもこんなに沢山の情報を収集する必要があるため、SDTMを含めて電子データ提出関連を全て習得するとなると、やはりそれ相応の年月が必要です。

参考:
CDISC
PMDA 次世代審査・相談体制について(申請時電子データ提出)
FDA Study Data Standards Resources
PhUSE
OpenCDISC
CDISC Terminology (NCI)

Posted on 2015/08/15 Sat. 00:39 [edit]

CM: 0
TB: 0

0814

申請時電子データ提出におけるADaMの位置付け  

申請時電子データ提出の制度開始まで1年ちょっとになりました。実は最近は、一応「ADaMをそこそこ知ってる人」としての活動ばかりしているので、ほんの触りだけADaMの位置付けの紹介をさせて頂きます。最初は片手間でやってたんですがそういうわけにもいかず・・・。

・ADaMとは・・・
 Study Data Tabulation Model (SDTM)から作成される統計解析用データの標準形式
・ADaMでは・・・
 SDTM同様,メタデータをDefine.xml形式で格納する.
 SDTMに比べて少ないものの,Controlled Terminology(CT)が存在する.

PMDAから色々と通知が発出されておりますが、日本におけるADaMの位置付けは・・・
・申請時に提出する解析用データセットは基本的にADaM形式
・データセットとともに、Define.xml、ADRGも提出が必要
・ADaM作成プログラム及び解析結果作成プログラムも提出が必要
 ⇒解析結果作成プログラムは解析結果メタデータとして、Define.xmlに含める形での提出が望まれている。
・併合解析用(ISS/ISE)のデータセットについても,基本的にADaM形式での提出が求められる.
 ⇒作るタイミング、作り方等、この話は奥が深いのでおいおい。
・SDTM同様,基本的に英語のみのデータセットの提出が求めれらる。
 ⇒日本語データセットの提出方法についてもおいおい。。
・例外的にADaM形式以外の形式が認められる場合があるが,PMDAと相談が必要
 ⇒とにかく色んなパターンがあるのでとにかくPMDAと相談することを心掛けましょう。

ADaMのメタデータとは・・・(全てDefine.xmlとして作成する)
・解析データセットメタデータ(Analysis dataset metadata)
・解析変数メタデータ(Analysis variable metadata)
・解析パラメータ値メタデータ(Analysis parameter value-level metadata)
・解析結果メタデータ(Analysis results metadata)

ADaMデータセットの基本原則は・・・
・解析データセットとそれに関連するメタデータは:
- 臨床試験において実施される統計解析をサポートするデータセットのコンテンツとソースについて,明確で曖昧さがなく,情報交換できなければならない.
- 解析データセットとソースデータ(SDTM)間のトレーサビリティを提供する.
- 一般的に利用可能なソフトウエアツールによって簡単に使用できる.
・解析データセットは:
- メタデータで関連付けられていて,メタデータは理想的にはmachine-readableである.
- Analysis-ready(すぐに解析可能)である.

電子データ提出の主役はSDTMというイメージがありますが、ADaMも重要な位置付けになるので、色々と情報共有できればと思います。

Posted on 2015/08/14 Fri. 20:29 [edit]

CM: 0
TB: 0

0814

続・RWI:ODS LAYOUTとの比較編  

前回に引き続き、RWIで遊んでみました。内容は例のごとくSAS忘備録で紹介されているもので、今回はODS LAYOUTによるグラフの出力をRWIでも実行してみました。出力内容は2013年のSASユーザー総会の「ODS LAYOUTによるワクチンの臨床開発におけるDashboardの作成」の例示の部分です(資料はユーザー登録すればSASプレミアムラウンジからダウンロード可能です)。
自動車関連の情報を格納したsashelp.carsデータセットを用いて、馬力、価格、燃費等を要約した4個のグラフを白黒で2行2列のレイアウトに出力します。
①ODS LAYOUTで出力
2x2のグリッドを定義して、PDFファイルに4個のグラフを出力する。この際に作成したグラフを所定のフォルダに保存しておく(ods listingのgpathオプション、imagenameオプション)。
②RWIで出力
①で保存した画像ファイルを2x2のレイアウトで出力する。

まずは白黒スタイル作成部分。SAS9.4では以前紹介したstyleattrsステートメントを使用すればSGプロシジャ内で定義できますが、ここでは分けて記述します。
options nocenter nodate nonumber papersize=A4 orientation=landscape nofmterr mprint ;

*** グレースケール用のスタイルテンプレート ;
proc template ;
define style Mystat ;
parent=styles.statistical ;
class Graphdata1 /
contrastcolor = black linestyle = 1 linethickness = 1px markersymbol = "trianglefilled" foreground = CXdcdcdc ;
class Graphdata2 /
contrastcolor = black linestyle = 1 linethickness = 1px markersymbol = "circlefilled" foreground = CXb7b7b7 ;
class Graphdata3 /
contrastcolor = black linestyle = 1 linethickness = 1px markersymbol = "diamondfilled" foreground = CX808080 ;
class Graphdata4 /
contrastcolor = black linestyle = 1 linethickness = 1px markersymbol = "triangle" foreground = CX555555 ;
class Graphdata5 /
contrastcolor = black linestyle = 1 linethickness = 1px markersymbol = "circle" foreground = CX3f3f3f ;
class Graphdata6 /
contrastcolor = black linestyle = 1 linethickness = 1px markersymbol = "diamond" foreground = black ;
end ;
run ;

続いて、メインのグラフ作成部分です。まずODS LAYOUTで出力し、RWIではimageメソッドで作成した画像ファイルを指定してPDFに出力します。
*** 1. ODS LAYOUTのグリッドでグラフを出力する ;
ods graphics on / width=5.3in height=3.5in imagename="test" ; *--- testという名前の連番で画像ファイル保存 ;
ods listing gpath="/test" style=Mystat dpi=150 ; *--- 画像ファイル作成の際に白黒適用 ;
ods pdf file="/test/test.pdf" style=Mystat nogtitle dpi=150 ; *--- PDF出力に白黒適用 ;

title "ODS LAYOUT statement" ;
ods layout start columns=2 rows=2 ; *--- 2x2のグリッドを定義 ;
ods region ; *--- 1個目の領域 ;
proc sgpanel data=sashelp.cars ;
panelby TYPE / novarname ;
hbar Origin / response=Horsepower group=Origin stat=mean datalabel dataskin=gloss ;
label Horsepower="Horsepower (ps)" ;
format Horsepower 7.1 ;
run ;

ods region ; *--- 2個目の領域 ;
proc sgplot data=sashelp.cars ;
hbar Origin / response=MSRP group=Type stat=sum datalabel dataskin=gloss groupdisplay=cluster ;
label MSRP="MSRP($)" ;
run ;

ods region ; *--- 3個目の領域 ;
proc sgplot data=sashelp.cars ;
vbar Origin / response=MPG_City group=Type stat=mean datalabel dataskin=gloss groupdisplay=cluster ;
label MPG_City="Miles per Gallon" ;
format MPG_City 7.1 ;
run ;

ods region ; *--- 4個目の領域 ;
proc template ;
define statgraph CreatePie ;
begingraph ;
layout region ;
piechart category=Type response=MSRP
/ group=Origin groupgap=5 dataskin=sheen name="pie" ;
discretelegend "pie" / border=true ;
endlayout ;
endgraph ;
end ;
run ;

proc sgrender data=sashelp.Cars template=CreatePie ;
run ;

title ;

ods layout end ;
ods pdf close ;
ods graphics / reset=all ; *--- filenameの連番リセットだけならreset=index ;

*** 2. 上記で作成したグラフをRWIで出力する ;
ods pdf file="/test/test2.pdf" style=Mystat dpi=150 ;
title "layout_gridded method in RWI" ;
data _null_ ;
dcl odsout rwi() ;
rwi.layout_gridded(rows: 2,columns: 2) ; *--- 2x2のグリッドを定義 ;
rwi.region() ; *--- 1個目の領域 ;
rwi.image(file: "C:\test\test.png") ; *--- 1個目のグラフ(画像ファイル) ;
rwi.region() ; *--- 2個目の領域 ;
rwi.image(file: "C:\test\test1.png") ; *--- 2個目のグラフ(画像ファイル) ;
rwi.region() ; *--- 3個目の領域 ;
rwi.image(file: "C:\test\test2.png") ; *--- 3個目のグラフ(画像ファイル) ;
rwi.region() ; *--- 4個目の領域 ;
rwi.image(file: "C:\test\test3.png") ; *--- 4個目のグラフ(画像ファイル) ;
rwi.layout_end() ;

run ;
title ;
ods pdf close ;

結果は以下になります。titleが異なるのと、少しだけODS LAYOUTのほうが綺麗に出力されている気がしますが、dpiも同じ値にしてるし理由は分かりません。また、ODS LAYOUTでは当然ながらグラフの作成と出力が同時に実行できますが、今回の例のように、RWIは一度グラフを画像ファイルで保存しておくしかないのだとしたら、ひと手間余計に掛かってしまうことになります。もしDATAステップの中でSGPLOTを実行して出力ファイルをRWIで使用できるなんていう離れ業が1ステップで実現できれば、RWI以外にも様々な可能性が広がりそうですね。
RWI_02_1.png
RWI_02_2.png

Posted on 2015/08/14 Fri. 01:28 [edit]

CM: 0
TB: 0

0812

Report Writing Interface (RWI)を試してみる  

SASによるレポート作成機能は豊富に用意されていて、一つ一つ挙げていくとキリがありませんが、SAS忘備録で詳細に解説されているReport Writing Interface (RWI)を試してみました。評価版ではこれまでも使用できたみたいですが、恥ずかしながら存在を知りませんでした。レポートの作成については、tabulateプロシジャやreportプロシジャ、templateプロシジャ、ODS等の組み合わせで大抵カバーできると感じていて、何となくマンネリ化して新しいものを取り入れるモチベーションに欠けておりましたが、SAS忘備録のせいで片足突っ込んでしまいました。ちなみにSAS忘備録の人はそのままSASユーザー総会でRWIをポスター発表されており、立ち話ついでに少しだけご指導して頂きました。この場を借りて御礼申し上げます。

詳細はSAS忘備録に任せますが、大ざっぱに言うと、RWIは、DATAステップで、スタイルのカスタマイズを含めてtemplateプロシジャや単純なreportプロシジャの機能を実現できるものです。最大のメリットは、やはり「DATAステップ」という点でしょう。if文等、データの条件に応じてDATAステップの文法で出力レイアウト等を指定できるため、ロジックを組み立てる上で他の方法よりはるかに理解しやすいと思います。もちろんtemplateプロシジャやreportプロシジャでも同様のことはできるのですが、cellstyle asやcompute等、それぞれDATAステップとは異なる条件分岐の文法を習得する必要があります。

注意点というか残念な点は、RWIは、Printer Family、つまり通常使うフォーマットだと、PDF出力にしか対応していないようなので、業務でRTFではなく、PDF出力が必須の方がメインのユーザーとなるでしょう。

今回は、臨床試験において継時的に測定された体重変化量の要約表を作成します。
1. テストデータ作成
2. summaryプロシジャで変化量の要約統計量を算出
3. レポートの作成(①templateプロシジャのみ、②reportプロシジャのみ、③RWIのみ)
という流れでプログラムを作成します。

レポートは上記3種類で出力してみます。Style Templateを明示的に指定するのは①のみです。

<レポートの作成要件>
・表のタイトルは表の上に出力し、左寄せで下線のみ。
・"Summary Statistics"を要約統計量の代表タイトルとして要約統計量の上部真ん中に出力。
・VisitとTreatmentのヘッダーの上だけ罫線を引かない。
・罫線は基本行ごとに出力するが、Visitは重複出力せずに下線を出力しない、またはセルをまとめる。
・投与群と要約統計量は各行でフォーマットを指定して出力。
・文字列は左寄せ、数値は右寄せ(ヘッダーも同じ)。

データ作成・要約統計量算出部分のプログラムは以下になります。
options nocenter linesize=200 nodate nonumber ;
*** 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 ;


レポート作成部分のプログラムは以下になります。
*** PDFへの出力 ;
ods listing close ;
ods pdf startpage=no ;
title ;

*** 1. templateプロシジャ ;
proc template ;
define table xxx ;
style={rules=rows frame=below} ;
header H1-H4 ; *--- 表のタイトル,Summary Statistics,列タイトル ;
define H1 ; text "1. template procedure" ; style={just=l} ; start=VISIT ; end=SD ; end ;
define H2 ; text "Summary Statistics" ; style={just=c} ; start=N ; end=SD ; end ;
define H3 ; text "Visit" ; style={just=l} ; start=VISIT ; end=VISIT ; end ;
define H4 ; text "Treatment" ; style={just=l} ; start=GRP ; end=GRP ; end ;
column VISIT GRP N MEAN SD ; *--- 各変数の定義 ;
define VISIT ;
print_headers = off ;
style = {width=80pt just=l} ;
format = VISITF. ;
blank_dups = on ;
cellstyle GRP = 1 as {borderbottomstyle=none borderbottomwidth=0} ; *--- PDFは効かない... ;
end ;
define GRP ; print_headers=off ; style={width=80pt just=l} ; format=GRPF. ; end ;
define N ; header="N" ; style={width=60pt just=r} ; format=best. ; end ;
define MEAN ; header="Mean" ; style={width=60pt just=r} ; format=8.1 ; end ;
define SD ; header="SD" ; style={width=60pt just=r} ; format=8.2 ; end ;
end ;
run ;
data _null_ ;
set _OUT ;
file print ods=(template="xxx") ;
put _ods_ ;
run ;

*** 2. reportプロシジャ ;
proc report data=_OUT nowd spanrows
style(report)={rules=rows frame=below}
style(header)={just=l} ;
columns ("2. report procedure" VISIT GRP ("Summary Statistics" N MEAN SD)) ;
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 ;
run ;

*** 3. RWI ;
data _null_ ;
set _OUT end=_EOF ;
if _n_ = 1 then do ; *--- Header部分の定義 ;
declare odsout rwi() ; *--- オブジェクトの宣言 ;
rwi.table_start(style_elem: "table", style_attr: "rules=rows frame=below") ; *--- 表の作成 ;
rwi.head_start() ; *--- 表のタイトル ;
rwi.row_start() ;
rwi.format_cell(data: "3. Report Writing Interface (RWI)", style_attr: "just=l", column_span: 5) ;
rwi.row_end() ;
rwi.head_end() ;
rwi.row_start() ; *--- "Summary Statistics"のタイトル出力 ;
rwi.format_cell(data: "", inhibit: "BLR") ;
rwi.format_cell(data: "", inhibit: "BLR") ;
rwi.format_cell(data: "Summary Statistics", inhibit: "LR", column_span: 3, style_attr: "just=c") ;
rwi.row_end() ;
rwi.row_start() ; *--- 列のタイトルと列幅 ;
rwi.format_cell(data: "Visit", inhibit: "LR", style_attr: "cellwidth=80pt just=l") ;
rwi.format_cell(data: "Treatment", inhibit: "LR", style_attr: "cellwidth=80pt just=l") ;
rwi.format_cell(data: "N", inhibit: "LR", style_attr: "cellwidth=60pt just=r") ;
rwi.format_cell(data: "Mean", inhibit: "LR", style_attr: "cellwidth=60pt just=r") ;
rwi.format_cell(data: "SD", inhibit: "LR", style_attr: "cellwidth=60pt just=r") ;
rwi.row_end() ;
end ;
rwi.row_start() ; *--- データ行の定義(データ,フォーマット,罫線,左右寄せ) ;
if GRP = 1 then rwi.format_cell(data: VISIT, format: "VISITF", inhibit: "LRB", style_attr: "just=l") ;
else rwi.format_cell(data: "", inhibit: "LR", style_attr: "just=l") ;
rwi.format_cell(data: GRP, format: "GRPF", inhibit: "LR", style_attr: "just=l") ;
rwi.format_cell(data: N, format: "best", inhibit: "LR", style_attr: "just=r") ;
rwi.format_cell(data: MEAN, format: "8.1", inhibit: "LR", style_attr: "just=r") ;
rwi.format_cell(data: SD, format: "8.2", inhibit: "LR", style_attr: "just=r") ;
rwi.row_end() ;
if _EOF then rwi.table_end() ; *--- 表の作成終了 ;
run ;

ods pdf close ;
ods listing ;


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

まだRWIの詳細を理解していないので直観的な感想になってしまいますが、以下に個人的な見解をまとめておきます。

<総評>
PDF出力に限定し、帳票の細部までカスタマイズを行いたい・拘りたい場合については、RWIは十分に第一選択肢になり得る。

<詳細>
・罫線の制御について、PDF出力では、templateプロシジャやreportプロシジャよりも細かくカスタマイズできる。実際、今回の例でもパーフェクトに要求を満たしているのはRWIのみであった。
・RTFの出力に対応していない点は、実用面から考えるとかなりマイナス。この点は今後の発展に期待するしかない。
・実務的には、「templateプロシジャ+●●」という組み合わせになると思われるが、標準のレイアウトのカスタマイズはRWIも他と比べて遜色ないレベル。
・ODS LAYOUTと同様の機能を持ち、複数帳票のレイアウトもカスタマイズできるため、RWIは様々な機能を1DATAステップ内で実行できる。

まだまだ分からないことだらけですが、何となく、久々に実務で使ってみたいなと思った機能ですので、細々と勉強を続けたいと思います。

Posted on 2015/08/12 Wed. 18:11 [edit]

CM: 0
TB: 0

プロフィール

最新記事

最新コメント

最新トラックバック

月別アーカイブ

カテゴリ

訪れた人

▲Page top

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。