---
title: PharmaForestについて--SAS Package and PharmaForest ハンズオンセミナー
tags:  #[第12回大阪sas勉強会]  
author: [森岡裕[SASユーザー総会世話人]](https://convert.docswell.com/user/6484025)
site: [Docswell](https://www.docswell.com/)
thumbnail: https://bcdn.docswell.com/page/5EGR2P21JL.jpg?width=480
description: PharmaForestについて--SAS Package and PharmaForest ハンズオンセミナー by 森岡裕[SASユーザー総会世話人]
published: January 27, 26
canonical: https://convert.docswell.com/s/6484025/5EYR2G-2026-01-27-062417
---
# Page. 1

![Page Image](https://bcdn.docswell.com/page/5EGR2P21JL.jpg)

SAS Package and PharmaForest
ハンズオンセミナー
PharmaForestについて
森岡裕


# Page. 2

![Page Image](https://bcdn.docswell.com/page/4JQVP2PN7P.jpg)

PharmaForestはSAS Package Framework(SPF)を
使って製薬業界向けに構成されたエコシステム．
PharmaverseのSAS版みたいなもので，
実際Pharmaverseと同じ，現在 Phuseのグローバル公式
のワーキングとなる予定で進行中．
https://github.com/PharmaForest
https://github.com/PharmaForest


# Page. 3

![Page Image](https://bcdn.docswell.com/page/K74MYLY3J1.jpg)

実際，OSS利用に慣れていないSASプログラマにとって，
オープンパッケージを利用して，研究や業務のプログラム開
発するというのがピンとこなくて，なんとなく忌避されてる
方も多いと思うので
とりあえず，動かしてみて，肌感だけでも
もらえればっていうのが
本日のハンズオンの主旨です
経験していって


# Page. 4

![Page Image](https://bcdn.docswell.com/page/LJ186L6ZEG.jpg)

所属組織のSASサーバーのネット接続が制限されていていたりなど，
ウェブ経由でのパッケージのインストール，%installPackageが通らない場合でも
大丈夫
① あらかじめzipファイルをローカルにダウンロードしていただいて
そこに%loadPackage（パッケージ名） かけていただく
② SAS ondemand（無料のSAS webサービス）でやっていただく
③ あらかじめ本ハンズオンで使用するもの全部集めたzipをつくったので
とりあえずそれを丸ごと使ってもらう


# Page. 5

![Page Image](https://bcdn.docswell.com/page/GJWZWVW6J2.jpg)

① 所属組織のSASサーバーのネット接続が制限されていて，あらかじめダウンロードして試したい方
https://github.com/yabwon/SAS_PACKAGES
zipを展開して，[SPF]と[packages]を
SASから参照できるローカルのどこかに置
く


# Page. 6

![Page Image](https://bcdn.docswell.com/page/4EZ1545R73.jpg)

https://github.com/PharmaForest/sashash
使いたいパッケージのページ(github)の直下にそのパッ
ケージ名でzipファイルがあるのでそれをクリックして
ダウンロードして
前ぺージで展開した「packages」フォルダの中へ
filename spf “XXXX\SPF&quot; ;
%include spf(SPFinit.sas) ;
filename packages “XXXXXXX\packages&quot;;
%loadPackage(sashash)


# Page. 7

![Page Image](https://bcdn.docswell.com/page/Y76L9391JV.jpg)

② 所属組織のSASサーバーのネット接続が制限されていて，SAS on demandで試したい方
SAS on demandのアカウントを持っていない方はまずこちらから
SAS ondemandガイド(鈴木徳太さん)
filename packages “/home/自身のアカウント/saspac&quot;;
filename SPFinit url
&quot;https://raw.githubusercontent.com/yabwon/SAS_PACKAGES/main/SPF/SPFinit.sas&quot;;
%include SPFinit;
%installPackage(SPFinit);
%installPackage(oncoplotter,
sourcePath=https://github.com/PharmaForest/OncoPlotter/raw/main/)


# Page. 8

![Page Image](https://bcdn.docswell.com/page/G751NLNLE4.jpg)

本日のハンズオンで一緒に動かしてみるパッケージ一覧
Rawdata
SDTM
ADaM
TLF


# Page. 9

![Page Image](https://bcdn.docswell.com/page/9J215L537R.jpg)

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にできる


# Page. 10

![Page Image](https://bcdn.docswell.com/page/DEYZKQK87M.jpg)

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=&quot;Y&quot;),fl = SAEFL)
run;


# Page. 11

![Page Image](https://bcdn.docswell.com/page/VJN3RKR9J8.jpg)

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=&quot;Y&quot;;
ADT=ASTDT;
%rolling_match(master=ADVS,
wh=%nrbquote(PARAMCD=&quot;WEIGHT&quot;)
, key=USUBJID,
rollvar=ADT, rolltype=BACK,
roll_back_limit=14, var=AVAL VSDTC);
drop ADT;
run;


# Page. 12

![Page Image](https://bcdn.docswell.com/page/YE99MVM3E3.jpg)

/*重複する変数を上書きせずに_データセット名で変数をわけるマージ*/
%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
);


# Page. 13

![Page Image](https://bcdn.docswell.com/page/GE89LPLL7D.jpg)

misc（https://github.com/PharmaForest/misc）
ちょっとした便利ツールの集合体パッケージ
/*インストール webアクセス可能の場合. 無理な場合は先に説明した①の方法で直にインストール*/
%installPackage(misc, mirror=PharmaForest)
/*パッケージのロード*/
%loadPackage(misc)
/*文字変数のLengthを必要最低限に変更する%minimize_charlen*/
%minimize_charlen(class, inlib=sashelp, outlib=work)


# Page. 14

![Page Image](https://bcdn.docswell.com/page/LELWL1LQJR.jpg)

laglead（https://github.com/PharmaForest/laglead）
あるレコードのnオブザベーション前の値やnオブザベーション後の値を取得できるパッケージ
/*インストール webアクセス可能の場合. 無理な場合は先に説明した①の方法で直にインストール*/
%installPackage(laglead, mirror=PharmaForest)
/*パッケージのロード*/
%loadPackage(laglead)
/*USUBJIDごとに1つ前と1つ後の体重を取得する*/
data weight;
set vs;
where VSTESTCD=&quot;WEIGHT&quot;;
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;


# Page. 15

![Page Image](https://bcdn.docswell.com/page/4JM9MW1KEW.jpg)

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;


# Page. 16

![Page Image](https://bcdn.docswell.com/page/PJRGVYL6E9.jpg)

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;


# Page. 17

![Page Image](https://bcdn.docswell.com/page/PEXXZGWDEX.jpg)

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


# Page. 18

![Page Image](https://bcdn.docswell.com/page/3EKW84VDED.jpg)

フォルダ指定でのログチェック(※SAS9.4/Windows環境のみ)
%logchk2directory(folder=C:\logs, out_folder=C:\output);


# Page. 19

![Page Image](https://bcdn.docswell.com/page/L7312LMPJ5.jpg)

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
);


# Page. 20

![Page Image](https://bcdn.docswell.com/page/87DXZN63EG.jpg)

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の出力先は自環境にあわせて書き換えてください


# Page. 21

![Page Image](https://bcdn.docswell.com/page/VJPPD5YPJ8.jpg)

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 */
)


# Page. 22

![Page Image](https://bcdn.docswell.com/page/2EV21PGVEQ.jpg)

datacut_sas（ https://github.com/PharmaForest/datacut_sas）
カットオフ解析用に，カットオフ日をさだめて，レコードの抽出，日付の補完を行い
トレサビリティ用にカットオフ処理前後の履歴を出力する
/*インストール webアクセス可能の場合. 無理な場合は先に説明した①の方法で直にインストール*/
%installPackage(datacut_sas, mirror=PharmaForest)
/*パッケージのロード*/
%loadPackage(datacut_sas)
準備が少しいるので，時間が余れば説明


# Page. 23

![Page Image](https://bcdn.docswell.com/page/57GR2P81EL.jpg)

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
);


# Page. 24

![Page Image](https://bcdn.docswell.com/page/4EQVP29NJP.jpg)

/*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
);


# Page. 25

![Page Image](https://bcdn.docswell.com/page/KJ4MYLX3E1.jpg)

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
);


# Page. 26

![Page Image](https://bcdn.docswell.com/page/LE186LNZ7G.jpg)

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(&#039;M&#039;,&#039;F&#039;,&#039;U&#039;),
trgtLabel=%str(&#039;Male&#039;,&#039;Female&#039;,&#039;Unknown&#039;) );
/*年齢の群別要約統計*/
%SummaryStat(inds=ADSL, sortNum=2, outds=sum02, grpNum=2, trtGrp=TRT01PN, label=%str(Age), trgtVar=AGE);


# Page. 27

![Page Image](https://bcdn.docswell.com/page/GEWZWV46E2.jpg)

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=&quot;Item&quot; out2=&quot;Category/Statics&quot;
out3=&quot;Group1&quot; out4=&quot;Group2&quot;;
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));


# Page. 28

![Page Image](https://bcdn.docswell.com/page/47Z1542RJ3.jpg)

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のコードがでてくるので
それをベースに自分の帳票を
作れる


# Page. 29

![Page Image](https://bcdn.docswell.com/page/YJ6L93V1EV.jpg)

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
);


# Page. 30

![Page Image](https://bcdn.docswell.com/page/GJ51NLDL74.jpg)

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)


# Page. 31

![Page Image](https://bcdn.docswell.com/page/9E215L83JR.jpg)

実務的なお話
・例えば，片側をPharmaForestのパッケージをできるだけ利用するとかにしてもいいかもしれません
・例えば，片側をR/Pharmavserseをつかって片側SAS/PharmaForestを利用するなどでもいいかもしれ
ません（統計解析の結果はパッケージとプロシジャで差異がでることがあるので留意）
・承認申請やCROからメーカーへのプログラム納品に，PharmaForestのパッケージを含める場合はライ
センスの記載や取り扱いにご注意ください．PharmaForestのパッケージはおおむねMITライセンスのため，
それほど手間はかかりませんが．以下の資料の「使用にあたって注意すべき点-MITライセンス」を参考に
してください
https://sas-user2025.ywstat.jp/download.html?n=107&amp;key=zsnwgqfynypm
・パッケージの利用はオープンですが，自己責任になるので，もしポリシー上，パッケージのテストを自
組織でしないといけない場合などはSASパッケージをバリデーションするためのツールセットである
VALIVALIというパッケージがあり，レポートをだせるので，こちらを必要に応じて
ご利用ください
https://github.com/PharmaForest/valivali


# Page. 32

![Page Image](https://bcdn.docswell.com/page/D7YZKQ68JM.jpg)

お疲れ様でした！
午後からのセッションもお楽しみください


