>100 Views
January 27, 26
スライド概要
SAS言語を中心として,解析業務担当者・プログラマなのコミュニティを活性化したいです
SAS Package and PharmaForest ハンズオンセミナー PharmaForestについて 森岡裕
PharmaForestはSAS Package Framework(SPF)を 使って製薬業界向けに構成されたエコシステム. PharmaverseのSAS版みたいなもので, 実際Pharmaverseと同じ,現在 Phuseのグローバル公式 のワーキングとなる予定で進行中. https://github.com/PharmaForest https://github.com/PharmaForest
実際,OSS利用に慣れていないSASプログラマにとって, オープンパッケージを利用して,研究や業務のプログラム開 発するというのがピンとこなくて,なんとなく忌避されてる 方も多いと思うので とりあえず,動かしてみて,肌感だけでも もらえればっていうのが 本日のハンズオンの主旨です 経験していって
所属組織のSASサーバーのネット接続が制限されていていたりなど, ウェブ経由でのパッケージのインストール,%installPackageが通らない場合でも 大丈夫 ① あらかじめzipファイルをローカルにダウンロードしていただいて そこに%loadPackage(パッケージ名) かけていただく ② SAS ondemand(無料のSAS webサービス)でやっていただく ③ あらかじめ本ハンズオンで使用するもの全部集めたzipをつくったので とりあえずそれを丸ごと使ってもらう
① 所属組織のSASサーバーのネット接続が制限されていて,あらかじめダウンロードして試したい方 https://github.com/yabwon/SAS_PACKAGES zipを展開して,[SPF]と[packages]を SASから参照できるローカルのどこかに置 く
https://github.com/PharmaForest/sashash 使いたいパッケージのページ(github)の直下にそのパッ ケージ名でzipファイルがあるのでそれをクリックして ダウンロードして 前ぺージで展開した「packages」フォルダの中へ filename spf “XXXX\SPF" ; %include spf(SPFinit.sas) ; filename packages “XXXXXXX\packages"; %loadPackage(sashash)
② 所属組織のSASサーバーのネット接続が制限されていて,SAS on demandで試したい方 SAS on demandのアカウントを持っていない方はまずこちらから SAS ondemandガイド(鈴木徳太さん) filename packages “/home/自身のアカウント/saspac"; filename SPFinit url "https://raw.githubusercontent.com/yabwon/SAS_PACKAGES/main/SPF/SPFinit.sas"; %include SPFinit; %installPackage(SPFinit); %installPackage(oncoplotter, sourcePath=https://github.com/PharmaForest/OncoPlotter/raw/main/)
本日のハンズオンで一緒に動かしてみるパッケージ一覧 Rawdata SDTM ADaM TLF
sas_faker( https://github.com/PharmaForest/sas_faker ) ダミーデータで,SDTM,ADaMのサンプルを作ってくれるパッケージ.群の数と群ごとの症例数を 指定可能.作成される一連のデータセットは症例番号や投与日付・検査日付が一応整合している /*インストール webアクセス可能の場合. 無理な場合は先に説明した①の方法で直にインストール*/ %installPackage(sas_faker, mirror=PharmaForest) /*パッケージのロード*/ %loadPackage(sas_faker) /*使用*/ %sas_faker(n_groups=2,n_per_group=50) これで2群で1群50例で, ダミーのDM,SV,VS,AE,ADSL,ADAE,ADTTE,ADVSがWORKにできる
sashash(https://github.com/PharmaForest/sashash) 事前のソートなしで,keyと参照先から結合したい変数をしているすると,データステップ中に何 回でもいくつものデータセットでも自由に結合できる%kvlookupや,keyが存在するかをYNでフラ グとして返せる%keycheckなどハッシュオブジェクトを利用したハンドリングパッケージ /*インストール webアクセス可能の場合. 無理な場合は先に説明した①の方法で直にインストール*/ %installPackage(sashash, mirror=PharmaForest) /*パッケージのロード*/ %loadPackage(sashash) /*USUBJIDをキーにして、VSにDMからAGEを結合*/ data wk1; set vs(keep=USUBJID VSTESTCD VSTEST VSORRES VSDTC); %kvlookup(master = dm, key = USUBJID, var = AGE) run; /*SAEが発現しているかどうかをDMからAEをみてフラグづけ*/ data dm_sae; set dm(keep=USUBJID ARM); %keycheck(master = ae, key = USUBJID, wh=%nrbquote(AESER="Y"),fl = SAEFL) run;
mergex(https://github.com/PharmaForest/mergex) 日付keyが完全一致しない場合,それに最も近い過去,または未来,あるいは過去未来の方向で一 定期間内の最も近い日付をもつレコードを結合するRolling JoinなどSASに未実装の結合をサポート /*インストール webアクセス可能の場合. 無理な場合は先に説明した①の方法で直にインストール*/ %installPackage(mergex, mirror=PharmaForest) /*パッケージのロード*/ %loadPackage(mergex) /*SAE発現の2週間以内に測定されたもっとも新しい体重*/ data AE_WEIGHT; set ADAE(keep=USUBJID AETERM ASTDT AESER); Rolling Join where AESER="Y"; ADT=ASTDT; %rolling_match(master=ADVS, wh=%nrbquote(PARAMCD="WEIGHT") , key=USUBJID, rollvar=ADT, rolltype=BACK, roll_back_limit=14, var=AVAL VSDTC); drop ADT; run;
/*重複する変数を上書きせずに_データセット名で変数をわけるマージ*/ %varconf_merge( ds1=DM , ds2=ADSL, byvars=USUBJID, output_ds=conf_merge_output(keep=USUBJID SUBJID: TRT01P: ARM:), in1=1, operator=AND, in2=1, auto_sort=N );
misc(https://github.com/PharmaForest/misc) ちょっとした便利ツールの集合体パッケージ /*インストール webアクセス可能の場合. 無理な場合は先に説明した①の方法で直にインストール*/ %installPackage(misc, mirror=PharmaForest) /*パッケージのロード*/ %loadPackage(misc) /*文字変数のLengthを必要最低限に変更する%minimize_charlen*/ %minimize_charlen(class, inlib=sashelp, outlib=work)
laglead(https://github.com/PharmaForest/laglead) あるレコードのnオブザベーション前の値やnオブザベーション後の値を取得できるパッケージ /*インストール webアクセス可能の場合. 無理な場合は先に説明した①の方法で直にインストール*/ %installPackage(laglead, mirror=PharmaForest) /*パッケージのロード*/ %loadPackage(laglead) /*USUBJIDごとに1つ前と1つ後の体重を取得する*/ data weight; set vs; where VSTESTCD="WEIGHT"; keep USUBJID VSTESTCD VSDTC VSORRES; run; data weight_1; set weight; %laglead(dataset=weight, id=USUBJID, var=VSORRES, offset=-1); %laglead(dataset=weight, id=USUBJID, var=VSORRES, offset=+1); run;
ctcae5_grader( https://github.com/PharmaForest/ctcae5_grader ) CTCAE v5.0に基づいてGradingしてくれるパッケージ /*インストール webアクセス可能の場合. 無理な場合は先に説明した①の方法で直にインストール*/ %installPackage(ctcae5_grader, mirror=PharmaForest) /*パッケージのロード*/ %loadPackage(ctcae5_grader) /*ヘモグロビン,ALT,好中球をGrading*/ data lab_testcases; length PARAMCD $12 AVALU $16; infile datalines dsd truncover; input PARAMCD :$12. AVAL AVALU :$16. ANRLO ANRHI BASE MFRHI; datalines; HGB, 14.5,g/dL, 12, 13.5, ., . HGB, 15.4,g/dL, 12, 14.0, ., . HGB, 17.0,g/dL, 12, 12.5, ., . HGB, 7.5,g/dL, 12, 13.5, ., . ALT, 70, U/L, ., 40, 30, . ALT, 900, U/L, ., 40, 60, . NEUT, 0.8, 10^9/L, 1.5, ., ., . NEUT, 0.45,10^9/L, 1.5, ., ., . ; run; data lab_checked; set lab_testcases; %CTCAE5_HGB() %CTCAE5_ALT() %CTCAE5_NEUT() run;
Adamski( https://github.com/PharmaForest/adamski ) ADaMを作成するためのユーティリティを提供するパッケージ.R, PharmaverseのadmiralをSAS で真似たもの /*インストール webアクセス可能の場合. 無理な場合は先に説明した①の方法で直にインストール*/ %installPackage(adamski, mirror=PharmaForest) /*パッケージのロード*/ %loadPackage(adamski) /*DY変数の導出*/ data DY; set ADAE(keep=USUBJID ASTDT AENDT); %kvlookup(master=ADSL, key=USUBJID,var=TRTSDT) %derive_vars_dy( reference_date = TRTSDT, source_vars = ASTDT AENDT ); run;
SASLogChecker( https://github.com/PharmaForest/saslogchecker) 対面実行時のログチェック(※SAS9.4/Windows環境のみ) フォルダ指定でのログチェック(※SAS9.4/Windows環境のみ) /*インストール webアクセス可能の場合. 無理な場合は先に説明した①の方法で直にインストール*/ %installPackage(SASLogChecker, mirror=PharmaForest) /*パッケージのロード*/ %loadPackage(SASLogChecker) 対面実行時のログチェック(※SAS9.4/Windows環境のみ) data a; length x 8.; run; data b; set a; c= 10/0; keep y; run; %interact_logchk
フォルダ指定でのログチェック(※SAS9.4/Windows環境のみ) %logchk2directory(folder=C:\logs, out_folder=C:\output);
sas_compare( https://github.com/PharmaForest/sas_compare) フォルダ指定でのメイン・サブのコンペア(※SAS9.4/Windows環境のみ) /*インストール webアクセス可能の場合. 無理な場合は先に説明した①の方法で直にインストール*/ %installPackage(sas_compare, mirror=PharmaForest) /*パッケージのロード*/ %loadPackage(sas_compare) %ads_compare( output_folder = D:/project/output, main_lib_path = D:/project/main, sub_lib_path = D:/project/sub, target_list = A B C D E );
sas_dataset_json( https://github.com/PharmaForest/sas_dataset_json ) Dataset-JSON v1.1に基づくDataset-JSONとSASデータセットの相互読み書きができるパッケージ /*インストール webアクセス可能の場合. 無理な場合は先に説明した①の方法で直にインストール*/ %installPackage(sas_dataset_json, mirror=PharmaForest) /*パッケージのロード*/ %loadPackage(sas_dataset_json) /*SASデータセットをDataset-JSONへ*/ %m_sas_to_json1_1(outpath =D:\Users\XXXXX\Desktop\test, library = work, dataset = adsl, pretty = Y); JSONの出力先は自環境にあわせて書き換えてください
Dataset-JSONを読み込みSASデータセットへ %m_json1_1_to_sas(inpath=/data/definejson, ds=AE); xptを読み込みSASデータセットへ %xpt2sas( indir=C:\place\for\xpt, /* Directory with xpt files */ outdir=C:\place\for\sas7bdat /* Directory for sas7bdat files */ )
datacut_sas( https://github.com/PharmaForest/datacut_sas) カットオフ解析用に,カットオフ日をさだめて,レコードの抽出,日付の補完を行い トレサビリティ用にカットオフ処理前後の履歴を出力する /*インストール webアクセス可能の場合. 無理な場合は先に説明した①の方法で直にインストール*/ %installPackage(datacut_sas, mirror=PharmaForest) /*パッケージのロード*/ %loadPackage(datacut_sas) 準備が少しいるので,時間が余れば説明
sARDen( https://github.com/PharmaForest/sARDen) CDISCのARS(Analysis Standard Result)にもとづくARD(Analysis Result Data)を作成する基礎 パッケージ /*インストール webアクセス可能の場合. 無理な場合は先に説明した①の方法で直にインストール*/ %installPackage(sARDen, mirror=PharmaForest) /*パッケージのロード*/ %loadPackage(sARDen) /*群別の年齢と体重の要約統計量*/ %sard_summary( data=ADSL, by=TRT01P, variable=AGE WEIGHTBL, statistic=N MEDIAN MIN MAX MEAN SD, out=sard_summary_mean );
/*AEの群別SOC別PT別集計*/ %sard_stack_hierarchical( data=ADAE, variable=AEBODSYS AEDECOD, variable_hieral_code=AEBDSYCD F_AEPTCD, by=TRTA, id=USUBJID, denominator_dataset=ADSL(rename=(TRT01A=TRTA)), out=sard_stack_hierarchical );
sARDenX( https://github.com/PharmaForest/sARDenX) CDISCのARS(Analysis Standard Result)にもとづくARD(Analysis Result Data)を作成するパッ ケージ,sARDenにない統計的処理をサポート /*インストール webアクセス可能の場合. 無理な場合は先に説明した①の方法で直にインストール*/ %installPackage(sARDenX, mirror=PharmaForest) /*パッケージのロード*/ %loadPackage(sARDenX) /* ウェルチのt検定による二群の年齢の検定 */ %sard_stats_t_test( data=ADSL, out=sard_stats_t_test, class=TRT01PN, var=AGE, alpha=0.05, side=2, h0=0, Welch=Y );
freqsum(https://github.com/PharmaForest/freqsum) 要約統計やカウント集計について Proc reportやproc odstableなどの帳票出力プロシジャで出しやすい OUT1, OUT2…の形で結果を だすパッケージ /*インストール webアクセス可能の場合. 無理な場合は先に説明した①の方法で直にインストール*/ %installPackage(freqsum, mirror=PharmaForest) /*パッケージのロード*/ %loadPackage(freqsum) /*性別の群別集計*/ %FreqStat(inds=ADSL,sortNum=1, outds=sum01, grpNum=2, trtGrp=TRT01PN, label=%nrstr(Sex), trgtVar=SEX,trgtVarTyp=C, trgtValue=%str('M','F','U'), trgtLabel=%str('Male','Female','Unknown') ); /*年齢の群別要約統計*/ %SummaryStat(inds=ADSL, sortNum=2, outds=sum02, grpNum=2, trtGrp=TRT01PN, label=%str(Age), trgtVar=AGE);
rtfCreator(https://github.com/PharmaForest/rtfcreator) 簡単な指定でRTFで帳票を作成 /*インストール webアクセス可能の場合. 無理な場合は先に説明した①の方法で直にインストール*/ %installPackage(rtfcreator, mirror=PharmaForest) /*パッケージのロード*/ %loadPackage(rtfcreator) /*前のfreqsumで出した解析結果を縦に積んでみる*/ data output; set sum01 sum02; out1_lag=lag(out1); if out1=out1_lag then call missing(out1); label out1="Item" out2="Category/Statics" out3="Group1" out4="Group2"; run; %rtfCreator(DS=output ,COLNUM =4 ,VARLST =OUT1 OUT2 OUT3 OUT4 ,JUSTLST =Left Left Center Center ,WIDTHLST=200 250 200 200 ,TBLHEAD=%str(Table 14-1-2) ,TBLFOOT=%str(Table Foot xxxxx));
odstable_layoutshowcase(https://github.com/PharmaForest/odstable_layoutshowcase) rtfcreaterで作れないRTF帳票を作成する際の見本を出力(※SAS9.4/Windows環境のみ) /*インストール webアクセス可能の場合. 無理な場合は先に説明した①の方法で直にインストール*/ %installPackage(odstable_layoutshowcase, mirror=PharmaForest) /*パッケージのロード*/ %loadPackage(odstable_layoutshowcase) %odstable_layoutshowcase(sampleno=2); 見本帳票とともに その帳票を作成するProc templateの スタイル設定と Proc Odstableのコードがでてくるので それをベースに自分の帳票を 作れる
OncoPlotter(https://github.com/PharmaForest/OncoPlotter) オンコロジー領域で頻出のグラフを出力 /*インストール webアクセス可能の場合. 無理な場合は先に説明した①の方法で直にインストール*/ %installPackage(oncoplotter, mirror=PharmaForest) /*パッケージのロード*/ %loadPackage(oncoplotter) %kaplan_meier_plot( data = ADTTE, groupn = TRTPN, groupc = TRTP, Time_var = AVAL, Censore_var = CNSR, Censore_val = 1, Title = %nrquote(Kaplan-Meier Curve Example), Group_color_list = %nrquote(black red blue green), Group_linepattern_list = %nrquote(solid dash longdash shortdash), XLABEL = %nrquote(Survival Time (Month)), YLABEL = %nrquote(Probability), AxisValues = %nrquote(0 to 15 by 1), Generate_Code = N );
trial_flow( https://github.com/PharmaForest/trial_flow ) 症例フロー図を描くパッケージ /*インストール webアクセス可能の場合. 無理な場合は先に説明した①の方法で直にインストール*/ %installPackage(trial_flow, mirror=PharmaForest) /*パッケージのロード*/ %loadPackage(trial_flow) %diagram_box(boxid=1, left_x=30,top_y=100 ,right_x=70,bottom_y=90, text=Assessed for eligibility (n=100)) %diagram_line(lineid=1, start_x=50, start_y=90, end_x=50, end_y=55) %diagram_line(lineid=2, start_x=50, start_y=73, end_x=65, end_y=73) %diagram_box(boxid=2, left_x=65,top_y=87 ,right_x=95,bottom_y=58 ,text_just=left ,text=Excluded (n=10)#- Not meeting inclusion# #- Declined to Participate# (n=4) #- Other reasons# (n=2)) %diagram_box(boxid=3, left_x=37,top_y=55 ,right_x=63,bottom_y=45, text=Randomized (n=90)) %diagram_line(lineid=3, start_x=37, start_y=50, midpoint_x=32, midpoint_y=50, end_x=32, end_y=30) %diagram_line(lineid=4, start_x=63, start_y=50, midpoint_x=68, midpoint_y=50, end_x=68, end_y=30) %diagram_box(boxid=5, left_x=40,top_y=37 ,right_x=60,bottom_y=32 ,text=Allocation) %diagram_box(boxid=6, left_x=20,top_y=30 ,right_x=49,bottom_y=10 ,text_just=left ,text=Allocated to intervention #A (n=45) #- xxxxxxxxxx (n=xx) #- xxxxxxxxxx (n=xx)) %diagram_box(boxid=7, left_x=54,top_y=30 ,right_x=83,bottom_y=10 ,text_just=left ,text=Allocated to intervention #B (n=45) #- xxxxxxxxxx (n=xx) #- xxxxxxxxxx (n=xx)) /*plot*/ %diagram_plot(); criteria (n=4)
実務的なお話 ・例えば,片側をPharmaForestのパッケージをできるだけ利用するとかにしてもいいかもしれません ・例えば,片側をR/Pharmavserseをつかって片側SAS/PharmaForestを利用するなどでもいいかもしれ ません(統計解析の結果はパッケージとプロシジャで差異がでることがあるので留意) ・承認申請やCROからメーカーへのプログラム納品に,PharmaForestのパッケージを含める場合はライ センスの記載や取り扱いにご注意ください.PharmaForestのパッケージはおおむねMITライセンスのため, それほど手間はかかりませんが.以下の資料の「使用にあたって注意すべき点-MITライセンス」を参考に してください https://sas-user2025.ywstat.jp/download.html?n=107&key=zsnwgqfynypm ・パッケージの利用はオープンですが,自己責任になるので,もしポリシー上,パッケージのテストを自 組織でしないといけない場合などはSASパッケージをバリデーションするためのツールセットである VALIVALIというパッケージがあり,レポートをだせるので,こちらを必要に応じて ご利用ください https://github.com/PharmaForest/valivali
お疲れ様でした! 午後からのセッションもお楽しみください