2.7K Views
March 26, 24
スライド概要
[第9回大阪SAS勉強会] 山野辺 浩己
SAS言語を中心として,解析業務担当者・プログラマなのコミュニティを活性化したいです
解析結果RTFの検証 マルホ株式会社 臨床開発部DSグループ 山野辺浩己
免責事項 本発表における内容は、発表者個人の考えです。 所属団体・所属組織とは一切関連ありません。
解析結果RTFとは ・臨床試験データの解析結果は、RTF(Rich Text Format)で作成されることが常 (RTF: Wordで開くことができるタグセット言語で構成されるファイル) ・SASで解析した結果を、 SASデータセット化し、 ODS RTF+PROC REPORTを使って作成されることが一般的 ・実際の解析結果作成は、CRO(受託臨床試験機関)へ委託することが多い 解析結果 SASデータセット PROC REPORT + ODS RTF 解析結果RTF
解析結果RTFの検証 ・依頼者側でも、一部の解析結果を同様に再現し、出力結果を突き合わせる必要性 ・SASの解析結果であれば、PROC COMPAREが有効??? しかしPROC REPORTを用いてRTFを作成することから、 「ソースSASデータセット」との比較は以下の点で難しい ・集計されている可能性(REPORTにおけるSUM機能) ・順序が想定していない形となる可能性(REPORTのorderに左右される) ・データセットにあっても、出力されているとは限らない ・そもそも解析結果SASデータセットが入手不可の可能性 _ 解析結果 SASデータセット ≠ 解析結果RTF
解析結果RTFの検証 ・新たな環境下で解析結果RTFの確認をするも・・・ ・従前のやり方:「担当者に一存」 :「目視であってればそれでいいよ」 :「検証用の結果も、RTF, Excel, SASデータセットお好きに」 ・従前の結果 :ここ数年、結果固定後の修正が多発 機械的検証をしてみては? →SAS Compareに慣れていないため、反発が生じる エクセル比較というニーズを満たすところに着地!
解析結果RTFの検証 ・作成された[解析結果RTF]をSASデータセット化し、比較することに! C R O 解析結果 SASデータ セット PROC REPORT + ODS RTF 解析結果RTF 変 換 依 頼 者 解析結果 SASデータ セット 比較 解析結果 SASデータ セット
事例 ・同様の検証方法は過去に何度も検討されている PharmaSUG2010 – Paper TT13 %rtf2data : A utility macro to convert RTF Table to SAS® dataset PharmaSUG China 2017 – Paper 64 How to read RTF files into SAS® datasets? SASユーザー総会2022 – PythonとSASを活用して解析結果比較作業を効率化 etc… ・手法も様々 →RTFタグセットを読みほどき、SASデータセット化 →RTFファイルをエクセルやワードへ変換してから、PROC IMPORT →RTFファイルをワードへ変換してからPython(SASPY)でSASデータセット化
手法検討 ・従前は目視での確認だったため、社内解析結果の出力が担当者により異なる 例:SASデータセット、RTF、エクセル ・RTF->SASデータセット変換を加えると微妙な差分が最終時にも残る ・(新たなことに積極的でない担当者も) 抵抗なく受け入れられる検証方法
手法検討 ・採用された案:(橙色枠) RTF→SASデータセット:RTFをINFILEで読み込み、情報を抽出 (社内調整の末Pythonはインストール不可) 比較環境:エクセルに出力し、エクセル関数で比較 解析結果 SASデータ セット C R O 依 頼 者 PROC REPORT + ODS RTF 解析結果RTF S A S 解析結果 SASデータ SAS セット EXCEL 比較 EXCEL SAS 解析結果 SASデータ セット
実際の処理 解析結果 SASデータ セット C R O 依 頼 者 -RTF TO SAS PROC REPORT + ODS RTF 解析結果RTF S A S 解析結果 SASデータ SAS セット EXCEL 比較 EXCEL SAS 解析結果 SASデータ セット
実際の処理 セル内改行の場合 ー -RTF TO SAS 複数行にわたり処理が記載 セル内改行情報を 1セルにまとめなおす TRT A [\line] (N=99) [\line] n (%) ↓ TRT A|(N=99)|n(%)
実際の処理
セル内改行の場合
ー
-RTF TO SAS
複数行にわたり処理が記載
filename ext "&RTF_FILE.";
INFILEで読み込み
data wk1;
infile ext dlm='0A'x;
length raw $2000.;
input raw$;
セル内改行情報を
var1=tranwrd(raw,"{\line}","|");
1セルにまとめなおす
[略]
TRT A [\line]
if re_flg then output;
(N=99) [\line]
run;
filename ext;
n (%)
↓
TRT A|(N=99)|n(%)
実際の処理 -RTF TO SAS 列順序の情報を整理 下図橙色枠のケースは、 下記にように構成される \cell 1 TRT A (N=99){\cellx 1} \cell 1 \cell 123 \cell 321 Day 1{\cellx 1} 99{\cellx 123} 99{\cellx 321}
実際の処理
-RTF TO SAS
data wk3(where=(^missing(COLNUM)));
set wk2_body;
** line;
行の区切り、
if var2="{\row}" then BR=1;
{\raw}の検知
if var2="{\row}" then LINE+1;
[略]
var3=scan(var2,2,"{}");
COLUMNNUMBER=input(scan(tranwrd(var2,"\cellx","|"),2,"|"),?? best.);
length _temp1-_temp99 8.;
retain _temp1-_temp99 .;
array a_temp _temp1-_temp99;
if BR then call missing(of _temp1-_temp99 id miss_id);
if ^missing(COLUMNNUMBER) then do;
id+1;
a_temp[id]=COLUMNNUMBER;
delete;
end;
if missing(COLUMNNUMBER) and ^missing(id) then do;
miss_id+1;
COLUMNNUMBER=a_temp[miss_id];
end;
[略]
run;
列順序の情報を整理
下図橙色枠のケースは、
下記にように構成される
\cell 1
TRT A (N=99){\cellx 1}
\cell 1
\cell 123
\cell 321
Day 1{\cellx 1}
99{\cellx 123}
99{\cellx 321}
実際の処理 -RTF TO SAS ダブルバイト文字は文字 コードで格納されている。 腹 {\'95\'A0}
実際の処理
-RTF TO SAS
ダブルバイト文字は文字
コードで格納されている。
腹
[略]
ima=cats("'",substr(zan,1,4),"'x");
[略]
‘9999’x
の形で格納
{\'95\'A0}
if _N_ eq 1 then call execute("data &out_ds.(rename=(VAL=&out_var.)); length VAL$200.;");
call execute(VAL2||"output;");
if last then
call execute("run;");
Call executeで
データセット化
実際の処理 解析結果 SASデータ セット C R O 依 頼 者 -SAS TO EXCEL PROC REPORT + ODS RTF 解析結果RTF S A S 解析結果 SASデータ SAS セット EXCEL 比較 EXCEL SAS 解析結果 SASデータ セット
実際の処理 -SAS TO EXCEL 事前に比較用のコードを仕込んだ Templateを用意 シートはそれぞれ Main: CROから提供され、 RTF TO SASの処理済みのDSを出力 Sub: 社内で解析した検証用DS
実際の処理 -SAS TO EXCEL 事前に比較用のコードを仕込んだ Templateを用意 シートはそれぞれ Main: CROから提供され、 RTF TO SASの処理済みのDSを出力 Sub: 社内で解析した検証用DS Diff: MainとSubのシートを比較するための関数
実際の処理 -SAS TO EXCEL Diffには差分が生じたところに “Mainの値]||[Subの値]” の形式で出力
やってみて ・人的検証方法(目視)を機械的検証(excel比較)に移すことはできた ・Proc reportの書き方によってRTFのタグ構造が微妙に変化するため、SASプログ ラムによって微修正が生じることが分かった ・わざわざ試験単位でカスタマイズコストを考えると、 そのコストをRTF化へかけて、[CRO提供解析結果RTF]vs[社内解析結果RTF]を検討 する必要性も。
御礼 ご清聴ありがとうございました
参考 PharmaSUG2010 – Paper TT13 %rtf2data : A utility macro to convert RTF Table to SAS® dataset PharmaSUG China 2017 – Paper 64 How to read RTF files into SAS® datasets? SASユーザー総会2022 – PythonとSASを活用して解析結果比較作業を効率化 連絡先: [email protected] マルホ株式会社 臨床開発部DSグループ 山野辺浩己