ODS 機能と REPORT プロシジャを用いた解析帳票の作成 これから業務で利用を始める人のために 太田裕二マルホ株式会社データサイエンス部 Creation of Tables using ODS and REPORT Procedure -For Users Begin to Work in Earnest- Yuji Ohta Data Science Dept., Maruho Co, Ltd.
要旨 : Ver.9.4 で ODS 機能と REPORT プロシジャを用いて解析帳票を作成する 法を整理した 私と同様にこれから業務で利用を開始する を対象に紹介する キーワード :ODS RTF REPORT プロシジャ スタイル要素 スタイル属性 インラインフォーマット 2
本日の内容 背景 ODS 機能 一般的なプロシジャ レポート作成プロシジャ 解析帳票作成プログラムの紹介 ODS RTFとREPORTプロシジャの主なステートメント 有効性の解析帳票を例として 複数ページにまたがる解析帳票を例に 3
背景 ( いまどき RTF??) 電子データ提出対応の業務フローの検討 解析帳票の英語化 従来からのMWの要望 Wordとの親和性の高い RTF 形式の解析帳票 RTF 形式対応の解析帳票テンプレート集の作成 被験者背景 有効性連続値 有効性カテコ リ 有効性二値 有効性生存時間 安全性 症例一覧表 第 II 相以降の試験で想定される解析帳票を一通り用意 4
解析帳票の要件 書式の統一フォント ; Courier New フォントサイズ ; 8pt 背景色 ; 白文字 ; 総括報告書の本文中に編集なしで貼付用紙の向き ; 縦向き余白 ; 上下 3cm 左右 2.5cm 脚注 ; 表の直下に表示 1 ページの出 データ 多 出 ページ 少 複数の出 項目を同一列に表示セル間やセル内の余分なスペースを省く 間の区切りは罫線 私のこれまでの経験 DDE 機能を用いた Excel 形式の解析帳票の作成が中心 ODS 機能は使うとしても ODS OUTPUT でプロシジャ結果をデータセットに格納 ODS RTF で 持ち検討用レベルの資料作成 5
まずは情報収集 閲覧可能な役 つODS 関連の情報はいろいろある 過去のSASユーザー総会や海外 SASユーザーの論文 発表資料 ODSによるレポート作成のトレーニングテキスト SASユーザーのHP SAS User Guide が しかし 簡単には思い通りの解析帳票は作れるはずもなく トライ & エラーの繰り返し で なんとか 解析帳票テンプレート集を一通り作れるようになった 理解した内容をまとめたので 私のようにこれまでに RTF の解析帳票の経験があまりない に紹介 6
本日の内容 背景 ODS 機能 一般的なプロシジャ レポート作成プロシジャ 解析帳票作成プログラムの紹介 ODS RTFとREPORTプロシジャの主なステートメント 有効性の解析帳票を例として 複数ページにまたがる解析帳票を例に 7
一般的なプロシジャ ODS 機能はプロシジャや DATA ステップからの結果を様々な形式の外部ファイルに出 できる SAS プロシジャ ( 一部のプロシジャ除く ) の出 プロセス テンプレートストア SAS プロシジャ テーブルテンプレート ( 出 構造の定義 ) スタイルテンプレート ( ファイル全体の体裁の定義 ) データコンポーネント ( 数値や文字 ) 出 オブジェクト 出 先 (RTF HTML PDF など ) 8
スタイル要素出 ファイルの特定部分に適用するスタイル属性 ( フォント 色 罫線などのスタイルの特徴 ) の集まり SystemTitle Header のような部分ごとに定義 SystemTitle 体裁をコントロールするためには該当部分の スタイル要素名 と定義すべき スタイル属性 を特定 ProcTitle Body Header Data RowHeader 全スタイル要素及び全スタイル属性は SAS 9.4 Output Delivery System: User's Guide の Chapter 11 及び Chapter 12 で参照可能 9
ODS MARKUP ステートメントで特定プロセスを簡略化 ods markup file = 'ODS MARKUP.html' /* 出力 Body ファイル名 */ stylesheet = 'StyleSheet.css' /* 出力スタイルシートファイル名 */ type = style_popup /* スタイル要素表示オプション */ style = Styles.HTMLblue ; /* スタイルテンプレート名 */ ods select Moments ; proc univariate data = SASHELP.CLASS ; var WEIGHT ; run ; ods markup close ; スタイル要素をダブルクリックすると全属性が表示されるウインドウが開く ポインタをかざすとスタイル要素名を表示 10
レポート作成プロシジャ レポート作成プロシジャ (REPORT PRINT 及び TABULATE ) の出 プロセスは 他のプロシジャと少し異なる レポート作成プロシジャ ファイル体裁の定義 出力構造の定義 テンプレートストア スタイルテンプレート ( ファイル全体の体裁の定義 ) データ ( 数値や文字 ) テ ータコンポーネントと呼ぶのかは未確認 出 先 (RTF HTML PDF など ) 出 構造はテーブルテンプレートではなくプロシジャで定義プロシジャ内のステートメントでデフォルトから任意の出 構造に変更可 プロシジャ内のステートメントでスタイル属性も変更可 11
本日の内容 背景 ODS 機能 一般的なプロシジャ レポート作成プロシジャ 解析帳票作成プログラムの紹介 ODS RTFとREPORTプロシジャの主なステートメント 有効性の解析帳票を例として 複数ページにまたがる解析帳票を例に SAS Ver. 9.4 12
ODS RTF と REPORT プロシジャの 主なステートメント ods rtf file = ' 出力ファイル名 ' style = スタイルテンプレート名 notoc_data ; 目次データの出 制御オプション proc report data = 出力データ名 missing 他のオプション ; column レポート項目 1 レポート項目 2 ; define レポート項目 / オプション ; compute 場所もしくはレポート項目 ; SAS ステートメント ; endcomp ; break タイミングブレーク変数 / オプション ; run ; ods rtf close ; 欠測値を有効値として扱うオプション レポート対象となる変数 各レポート項目の役割と表示 法 compute ブロック ; compute-endcomp 間の SAS ステートメントを実 ブレーク時 ( ブレーク変数の値が変わった時 ) にオプションに指定したアクションを実 注 ; 解析帳票テンプレート集の作成に用いたものに限定 13
有効性の解析帳票を例として 並 群間プラセボ対照試験における有効性の部分集団解析 出 データセット 年齢カテゴリ投与群解析時期投与群 時期統計量 本発表ユーザー定義スタイルテンプレートは用いずに REPORT プロシジャ及びグローバルステートメントのみでスタイル属性を指定する 法を紹介する ユーザー定義スタイルテンプレートを用いて同体裁の解析帳票を作成するプログラムは論文集の付録で紹介している 14
出 構造の変更 ods rtf file = " 有効性の解析帳票 _01.rtf" notoc_data style = Styles.Default ; proc report data = DATA missing split = ' ' ; column AGEGR1N AGEGR1 TRT_VISITN TRT_VISIT ヘッダー部分ラベル追加 LSMEAN SE ('95% CI' LOWER UPPER) 複数列にわたるラベル1 ('Comparison to Placebo' C_LSMEAN C_SE ヘッダー部分ラベル追加 ('95% CI' C_LOWER C_UPPER)) ; 複数列にわたるラベル2 define AGEGR1N / order noprint ; 出 順データの役割をORDERとし NOPRINTオプションで非表示 ヘッダー部分のラベル define AGEGR1 / 'Age' ; define TRT_VISITN / order noprint ; define TRT_VISIT / 'Treatment Visit' ; define LSMEAN / 'LS Mean' ; define C_UPPER / 'Upper'; run ; ods rtf close ; ヘッダー部分ラベルのセル内改 15
proc report data = DATA ( 省略 ) spanrows ; define AGEGR1 / order 'Age' ; compute after _page_ ; line '95% confidence interval' ; endcomp ; run ; 各出 ページの最後に脚注を表示 制御されたセルの結合 同じデータの繰り返し出 を制御 ページごとに処理を実 する COMPUTE ブロック構文 compute after / before _page_ ; SAS ステートメント ; endcomp ; 16
スタイル属性の変更 プロシジャ内のステートメントでスタイルテンプレートで定義されているスタイル属性を変更することができる REPORT プロシジャでは Location ごとあるいは特定のセルごとにスタイル属性を指定 REPORT プロシジャ内のスタイル定義の記述 法にはいくつかの 法があり 目的に応じて使い分ける Report 本発表で取り扱う Location は図の 4 種類のみ REPORT プロシジャで指定することができるスタイル属性は Base SAS 9.4 Procedures Guide の Table 55.9 で参照可能 Header Column Lines 17
PROC REPORT ステートメントで記述 STYLE(Location) オプションを用いてテーブル全体に影響するスタイル属性 すべてのレポート項目に共通するスタイル属性を指定 style(location) = { スタイル属性 1 スタイル属性 2 } proc report data = DATA missing split = ' ' spanrows style(report) ={just=left テーブルの表示位置をファイル内で左寄せ bordercolor=black borderstyle=solid borderwidth=1pt 罫線の色 線種 太さ frame=hsides テーブル枠の罫線を上下のみ表示 rules=groups テーブル内の罫線を Header と Column の間 Column と Lines の間のみ表示 cellpadding=0 cellspacing=0} STYLE オプション構文 セル内の左右上下のスペースとセル間のスペースを削除 つづく 18
つづき style(header) ={asis=on vjust=bottom background=white foreground=black font=('courier New', 8pt)} style(column) ={asis=on vjust=top background=white foreground=black font=('courier New', 8pt)} style(lines) ={asis=on just=left vjust=top background=white foreground=black font=('courier New', 8pt) borderbottomstyle=none} ; run ; 脚注セルの下部罫線を非表示 ヘッダー部分 データ部分 脚注部分のスタイル属性を指定 属性の種類 属性の値 内容 asis on 先頭の空白と改 を無視せず表示する vjust bottom テキストの縦 向の位置揃えを下揃えにする top テキストの縦 向の位置揃えを上揃えにする background white セルの背景色を白にする foreground black セルの前景色 ( 主にテキストの色 ) を にする font ('Courier New', 8pt) フォントを 'Courier New' サイズを 8ptにする borderbottomstyle none セル下部の罫線を表示しない just left テキストの横 向の位置揃えを左揃えにする right テキストの横 向の位置揃えを右揃えにする 19
ASIS 背景色 前景色 フォントは style(report) では指定しない style(header) & style(column) & style(lines)= {asis=on background=white foreground=black font=('courier New', 8pt)} style(report)={bordercolor=black borderstyle=solid borderwidth=1pt} style(header)= {vjust=bottom} style(report) ={just=left} style(report)= {frame=hsides} style(report)= {rules=groups} style(column)= {vjust=top} style(lines)= {just=left vjust=top} style(report) ={cellpadding=0 cellspacing=0} style(lines)={borderbottomstyle=none} 注 ;style(report)={frame=hsides} と指定しておりテーブル最下部に罫線が表示されるはずだが style(lines)={borderbottomstyle=none} が優先されているため 罫線は表示されていない 20
DEFINE ステートメントで記述 STYLE(Location) オプションを用いて特定のレポート項目のスタイル属性を指定 define AGEGR1N / order noprint ; define AGEGR1 / order style(column)={just=left cellwidth=1.6cm} run ; style(column)= {just=left} セル幅 (cellwidth) は style(header) ではなく style(column) で指定する AGEGR1 のセル幅を1.6cm データ部分を左揃え style(header)={just=left} ヘッダー部分を左揃え 'Age' ; style(header) ={just=left} style(column) ={cellwidth=1.6cm} 21
PROC REPORT ステートメントでの記述との比較 PROC REPORT ステートメントで記述した場合はすべてのレポート項目に影響を与える重複してスタイル属性が指定されているレポート項目では DEFINE ステートメントでの指定が優先 proc report ( 省略 ) style(header) ={just=center} ; レポートの全ヘッダーに影響する column ( 省略 ) ; define AGEGR1 / style(header) ={just=left} ; AGEGR1 のヘッダーにのみ影響する run ; DEFINEステートメントの指定が優先されるため AGEGR1のヘッダーは左揃えになる 22
CALL DEFINE ステートメントで記述 COMPUTE ブロック内で CALL DEFINE ステートメントを使用してセルのスタイル属性を指定 CALL DEFINE ステートメント構文 call define( 対象カラム, 'style', 'style=[ スタイル属性 1 スタイル属性 2 ] ') 対象カラムの記載方法特定の列のみを対象 ; 引用符囲みのレポート項目名あるいは _Cn_(n は列数 ) ( 例 ;"AGEGR1" "_C3_") すべての列を対象 ; _row_( 引用符不要 ) COMPUTE ブロック内では IF ステートメントが使用できるため 組み合わせて使用することで 及び列を特定してスタイル属性を指定することが可能 23
column AGEGR1N AGEGR1 TRT_VISITN TRT_VISIT ( 省略 ) _LINE_IND ; ブロック COMPUTE ブロック define AGEGR1N / order noprint ; define _LINE_IND / display noprint ; compute _LINE_IND ; if _LINE_IND = 10 then _LINE_IND=10 のOBSの AGEGR1のセルに下部罫線 call define('agegr1', 'style', 'style=[borderbottomwidth=1pt]') ; _LINE_IND=1 のOBSの TRT_VISITのセルにインデント if _LINE_IND = 1 then call define('trt_visit', 'style', 'style=[marginleft=0.4cm]') ; if _LINE_IND = 21 then do ; call define('trt_visit', 'style', TRT_VISIT 以降のすべてセルに下部罫線 'style=[borderbottomwidth=1pt marginleft=0.4cm]') ; call define('lsmean', 'style', 'style=[borderbottomwidth=1pt]') ; call define('c_upper', 'style', 'style=[borderbottomwidth=1pt]') ; end ; endcomp ; OBS 特定のための変数をレポート項目として追加 役割をデフォルトの ANALYSIS から DISPLAY に変更し かつ非表示設定 _LINE_IND=21 の OBS の TRT_VISIT のセルにインデント If ~~~~~ then do ; ~~~ ; end ; で複数の CALL DEFINE ステートメントを記述可能 24
AGEGR1 のグループ内の最後の OBS(8OBS 目 ) ではなく最初の OBS(1OBS 目 ) に 10 を格納していることに注意 データセット抜粋 ( 変数 _LINE_IND 追加 ) 出 結果 if _LINE_IND = 10 then call define('agegr1, 'style', 'style=[borderbottomwidth=1pt]') ; if _LINE_IND = 1 then call define('trt_visit', 'style', 'style=[marginleft=0.4cm]') ; if _LINE_IND = 21 then do ; call define('trt_visit', 'style', 'style=[borderbottomwidth=1pt marginleft=0.4cm]') ; call define('lsmean', 'style', 'style=[borderbottomwidth=1pt]') ; end ; 25
if _LINE = 1 then call define('agegr1', 'style', 'style=[borderbottomwidth=1pt]') ; if _LINE = 2 then do ; call define('trt_visit', 'style', 'style=[borderbottomwidth=1pt]') ; end ; if _INDENT = 1 then call define('trt_visit', 'style', 'style=[marginleft=0.4cm]') ; ひとつの OBS において ひとつのレポート項目に対して複数回 CALL DIFINE ステートメントを指定できない最後に実 された CALL DIFINE ステートメントが有効となり それ以外は無視されることに注意 26
インラインフォーマット機能 エスケープ文字とインラインフォーマット関数を用いてテキストとセルのスタイルを定義できる エスケープ文字は ODS ESCAPECHAR ステートメントで任意の文字を指定 インラインフォーマット関数構文と主な関数エスケープ文字 { インラインフォーマット関数引数 } 関数名引数内容例 ( エスケープ文字は ^ と表示 ) SUPER 上付きにする文字 文字を上付きに設定 'cm^{super(2)}' NEWLINE 改 したい 数 セル内改 を挿 'SOC^{newline 1}PT' PAGEOF なし 現在のページと総 'Page ^{pageof}' ページを挿 THISPAGE なし 現在のページを挿 'Page ^{thispage} of ^{lastpage}' LASTPAGE なし 総ページを挿 'Page ^{thispage} of ^{lastpage}' この他の関数は SAS 9.4 Output Delivery System: User's Guide の Table 6.4 で参照可能 27
テキストフィールドでのスタイル定義 ラベル タイトル及びフットノートのようなテキストフィールドでスタイルを定義できる テキストフィールドのスタイル定義の構文 ' エスケープ文字 S={ スタイル属性 1 スタイル属性 2 } テキスト ' エスケープ文字に '~ ods escapechar = '~'; ( チルダ ) を指定 column AGEGR1N AGEGR1X TRT_VISITN TRT_VISIT LSMEAN SE LOWER UPPER) ( 省略 ); define AGEGR1N / order noprint ; define AGEGR1X / ( 省略 ); ('~S={just=center borderbottomwidth=1pt}95% CI~{super[a]}' ヘッダーセルのスタイル ( 横 向表示位置と下部罫線 ) を定義 AGEGR1X のデータ 12-16~{newline 1}(years) 17-64~{newline 1} (years) 65-~{newline 1} (years) SUPER インラインフォーマット関数で上付き 28
ページ設定 タイトル フットノート /* ページ設定 */ options nodate nonumber /* 日時非表示 ページ番号非表示 */ papersize = "A4" /* 用紙サイズ ;A4 */ orientation = portrait /* 用紙の向き ; 縦 ( 横はlandscape) */ topmargin = 3cm bottommargin = 3cm /* 余白上下 ;3cm */ leftmargin = 2.5cm rightmargin = 2.5cm ; /* 余白左右 ;2.5cm */ タイトルとフットノートはどの Location にも属していないためプロシジャ内でスタイルを指定できない テキストフィールド内で横 向表示位置 背景色 前景色 フォントを指定 /* タイトル フットノートの指定 ( 位置 フォント サイズ テキスト )*/ title1 '~S={just=left background=white foreground=black font=("courier New", 8pt)} Table 9.9.9 Subgroup Analysis, MMRM for Percent Change from Baseline in VAS by Age Group' ; title2 '~S={just=left background=white foreground=black font=("courier New", 8pt)} Full Analysis Set' ; footnote1 '~S={just=right background=white foreground=black font=("courier New", 8pt)}Page ~{pageof}' ; PAGEOF インラインフォーマット関数でフットノートに Page XX of XX と表示 29
30
用紙余白 用紙のサイズと向き フォント 色の統一 Age Treatment Visit をキーに昇順 ヘッダー部分のセル内改 字下げ表示 繰返し出 制御 & セル結合 データ部分のセル内改 上付き文字 複数列にわたるラベルの表示 Age カテゴリごと Treatment ごとに罫線表示 セル内 セル間のスペースを削除 セル幅の指定 文字表示位置の指定 ( 縦横 ) 脚注出 テーブルを左寄せ表示 現在のページと総ページを表示 用紙余白 31
複数ページにまたがる解析帳票を例に 改ページの挿 BREAKステートメントとPAGEオプションを用いた下記構文により ブレーク時 ( ブレーク変数の値の変更時 ) に改ページを挿 することができるブレーク変数はCOLUMNステートメントし DEFINEステートメントで役割をORDERあるいはGROUPにする break after ブレーク変数 / page ; 臨床検査の解析で 検査項目の変数 (PARAMN など ) をブレーク変数にすると 1 ページに 1 つの検査項目のみ出 することができる 32
ページごとにヘッダーを変更する 各ページの最初に実 される COMPUTE ブロック内にて LINE ステートメントでレポート項目名とその出 フォーマットを指定することで データを各ページの最上部に出 することができる proc format ; value F_PARAMN 1 = 'Parameter Name 1' 2 = 'Parameter Name 2' run ; c compute before _page_ ; line PARAMN F_PARAMN. ; endcomp; 必ず出 フォーマットを指定しなければならない 追加された部分の Location は Header ではなく Lines 33
Word の表示機能を用いた改ページ 有害事象一覧表を例に Page 1 プログラム上では改ページを挿 しない Page 2 症例を識別するレポート項目の役割を ORDER とし さらに SPANROWS オプションでセル結合 3 件ほど表示できるスペースはあるが Word の 表のプロパティ の の途中で改ページする オプションを無効にした状態で出 ファイルを閲覧 Page 1 にはまだ 3 件ほど AE を表示することが可能だが 次の症例は 5 件の AE があり Page 1 だけには収まらないため Page 2 に表示される 34
最後に 今回のテーマは多少時代遅れの感がありますが 私が取り組み始めた際に理解に苦しんだ点を紹介しております また 弊社の解析帳票テンプレート集を作成するなかで使用したステートメントやオプションも一通り網羅しています これから RTF 形式の解析帳票の作成にチャレンジされる 々に参考になるのではないかと思います 一 すでに慣れ親しんでいる には物足りなかったかもしれず また より効率的な 法もあるとのご指摘もあるかもしれませんが ご容赦いただけますと幸いです もちろんご意 頂戴するのは大歓迎です 35
参考資料 今野聡富永一宏高橋伸枝.ODS RTFとREPORTプロシジャを用いた一覧表の出.SASユーザー総会 2011 論文集 SAS 9.4 Output Delivery System: User's Guide, Fifth Edition Base SAS 9.4 Procedures Guide, Seventh Edition ODSによるレポート作成 1(SASセミナー ODSによるレポート作成コースドキュメント ) ODSによるレポート作成 2(SASセミナー ODSによるレポート作成コースドキュメント ) Lori S. Parsons.Enhancing RTF Output with RTF Control Words and In-Line Formatting.SAS Global Forum 2007 http://www2.sas.com/proceedings/forum2007/151-2007.pdf 36