FC2ブログ

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

徒然なるままにSAS暮らし

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

« 続・RWI:ODS LAYOUTとの比較編  |  もうひとつのWaterfallプロット »

コメント
コメントの投稿
Secret

トラックバック
トラックバックURL
→http://sasboku.blog.fc2.com/tb.php/54-a07264d2
この記事にトラックバックする(FC2ブログユーザー)

プロフィール

最新記事

最新コメント

最新トラックバック

月別アーカイブ

カテゴリ

訪れた人

▲Page top