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

徒然なるままにSAS暮らし

----

スポンサーサイト  

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Posted on --/--/-- --. --:-- [edit]

CM: --
TB: --

0331

感染症予防ワクチンの臨床試験ガイドラインのざっくりすぎるまとめ  

ワクチンの臨床開発について、ざっくりすぎるまとめを残しておきます。
ソースはこちらのガイドラインです。ほとんどコピペなので、正しく勉強
されたい方はガイドラインをご参照ください。ワクチン開発特有の解析方法や
通常の生活習慣病治療薬との比較等はまたの機会に。

ワクチン開発における臨床試験の各相のざっくりすぎるまとめ
第I相試験
・ワクチン開発では、通常、薬物動態試験は必要とされない。ただし、新規のアジュバント又は
 添加物等が含まれる場合は、その新規物質について薬物動態試験が必要になることはある。
・通常、第Ⅰ相試験は、健康成人を対象で、比較対照試験が望ましい
・最適な安全性評価を行うために、可能ならば他のワクチンや治療薬の同時使用は避けるべきである。

第II相試験
・免疫原性及び安全性を指標として第Ⅲ相試験に使用するワクチンの接種量や基本的な接種スケジュール等を明確にすることを目的とする。
・新規抗原の場合は接種量および接種スケジュールの設定は重要な検討項目であり、接種対象集団での用量反応データを得るべきである。
・ワクチン抗原に対する免疫反応の解析も、第Ⅱ相試験における重要な項目であり、注意深く評価するべきである。特に発症予防と、免疫反応との相関が明確になっていないワクチンについては、可能なかぎり免疫学的特性を詳細に調査すべきである。
・免疫反応への影響を評価するべき因子としては、1)ワクチンの接種量、2)ワクチンの接種間隔、3)ワクチン接種回数、4)ワクチン接種経路等がある。免疫期間、追加免疫の必要性、そして免疫反応の定量的側面についても調査することが望ましい。

第III相試験
・発症予防効果をエンドポイントとすることが基本的に望ましく、適切な対照群を設定した無作為化二重盲検比較試験が望ましい。一方、疾患の発生頻度が非常に低い場合等は、(中略)発症予防との相関性が確立されている抗体価等の代替指標(サロゲートマーカー)を評価するような試験デザインが適切な場合もある。代替指標の測定には、再現性が実証された標準的な検査手法であることが求められる。

ざっくりすぎる有効性・安全性評価のまとめ
有効性
・ワクチンの有効性は、原則として発症予防効果を主要評価項目として評価する。発症予防効果を臨床的評価項目として用いた試験は、自然発生的な感染が一定程度あり、かつ比較試験が実施可能な地域で行わなければならない。一方、発症予防効果と、ワクチンによって誘導される抗体(価)やその他の特定の生物学的マーカー等との間に関連性が確立されている場合、これらを代替の主要評価項目とすることができる。代替指標を用いる場合には、その妥当性を科学的に考察しなければならない。免疫原性のデータは原則として全相の試験において評価する。
・発症予防効果
 ・通常の生活習慣病治療薬のアウトカムと同様、申請前に実施が望ましい
 ・発症予防効果と相関するワクチンに誘導される免疫反応の特定を評価できるように
  デザインすべき(無理なら製販後)
安全性
・安全性データは、毎回のワクチン接種後に収集する。ワクチンの予測される局所反応・全身反応の多くは接種後数日以内に発現する。有害事象を収集する期間は、不活化ワクチンの場合はワクチン接種から2週間、生ワクチンの場合はワクチン接種から4週間が目安となるが、ワクチンの特性等に応じ、それ以上の適切な期間を設定することが必要な場合もある。有害事象の収集にあたっては、日誌に記録された有害事象を電話連絡により確認するか、あるいは被接種者が次の接種のために受診した際に日誌を回収する等の方法が考えられる。

混合ワクチン開発におけるざっくりすぎるまとめ
混合ワクチンの特別な考察
・混合ワクチンではワクチンを構成する物質同士による干渉、抑制、相互反応、相乗反応等が起こる可能性があるので、臨床試験における安全性及び有効性の評価は、混合ワクチン接種群と個々のワクチンの異なる部位への同時接種群、あるいは個々のワクチンの異なる時期の接種群で比較することも可能な限り検討する。
・海外で販売されている混合ワクチン製剤がある場合、その開発過程における臨床試験成績を参考に本邦における用法・用量の設定を検討することは可能である。
混合ワクチンの有効性
・混合ワクチンの各抗原についての有効性は、原則として個々のワクチンを接種した場合の有効性と比較する。
混合ワクチンの安全性
・混合ワクチンの安全性の評価は、原則として無作為化比較対照試験で実施すべきである。その際の対照群は、存在するならば同じ抗原成分で既に販売されているワクチンであることが望ましい。安全性評価のため、原則、試験は盲検化して実施すべきである。試験の盲検化が実行できない場合には、偏りを最小限にする方法を用いるべきである。

ガイドラインだけあって堅苦しい話ばかりですがざっくりすぎるメモでした。

参考:感染症予防ワクチンの臨床試験ガイドライン
スポンサーサイト

Posted on 2014/03/31 Mon. 00:35 [edit]

CM: 0
TB: 0

0327

bylineあれこれ  

最近急ぎでとある層別項目のカテゴリごとのテーブルとグラフを作成する
必要に迫られ、bylineのタイトル出力を調べたのでメモしておきます。
bylineとは、プロシジャでby変数を使用した際に出力されるタイトル内の
by変数のラベルと値です。

options byline | nobyline ;

で出力を制御します。簡単な例でbylineを出力する場合としない場合を
見てみましょう。
*** bylineの自動出力 ;
options byline ;
proc sort data=sashelp.cars out=_CARS ;
by Type ;
run ;
proc means data=_CARS nonobs maxdec=2 n mean stddev min max ;
by Type ;
var MPG_City ;
run ;
*** bylineの制御 ;
options nobyline ;
proc means data=_CARS nonobs maxdec=2 n mean stddev min max ;
by Type ;
var MPG_City ;
run ;

結果は以下になります。

・bylineの結果(一部抜粋)
Byline_1.png

・nobylineの結果(一部抜粋)
noByline_1.png

titleステートメントに指定する場合は、以下の方法で出力を制御することができます。
①#byline
「変数ラベル=値」を出力
②#byvar<n>または#byvar(変数名)
「変数ラベル」を出力
③#byval<n>または#byval(変数名)
「変数の値」を出力

以下の例では、②と③をtitleステートメントに記述して出力します。
グラフでは2つの指定方法を組み合わせて記述しています。
*** by変数のラベルと値をtitleに出力 ;
options nobyline ;
title "#BYVAR1: #BYVAL1" ;

proc means data=_CARS nonobs maxdec=2 n mean stddev min max ;
by Type ;
var MPG_City ;
run ;
title ;
*** 上記と同じ結果 ;
options nobyline ;
title "#BYVAR(Type): #BYVAL(Type)" ;

proc means data=_CARS nonobs maxdec=2 n mean stddev min max ;
by Type ;
var MPG_City ;
run ;
title ;
*** グラフ ;
proc sort data=sashelp.cars out=_CARS ;
by Origin Type ;
run ;
options nobyline ;
title1 "#BYVAR(Origin): #BYVAL(Origin)" ;
title2 "#BYVAR2: #BYVAL2" ;

proc sgplot data=_CARS ;
by Origin Type ;
scatter x=MPG_City y=MPG_Highway ;
run ;
title ;


結果はそれぞれ以下になります。
・meansプロシジャの出力結果
byvar_byval_1.png

・グラフの出力結果
byvar_byval_graph.png

Posted on 2014/03/27 Thu. 23:46 [edit]

CM: 0
TB: 0

0322

dosubl関数(call executeの兄弟)  

SAS9.3_M2から追加されたdosubl関数を紹介します。
これは以前紹介したcall executeと似た動きをします。
両者の同じ点と異なる点は以下になります。

同じ点:
・両者ともに、呼び出すプログラムがマクロステートメントのみの実行であれば、
 実行しているDATAステップと並行して実行されてそれらの結果等を利用できる。
異なる点:
・呼び出すプログラムがPROCやDATAステップの場合、call executeは、
 call executeを記述しているDATAステップの終了後に呼び出すプログラム
 が実行されるが、dosubl関数の場合は並行して実行できるため、それらの
 結果をもとのDATAステップ内で利用できる。

dosubl関数と、SASYAMAさんのブログ「DATAステップ100万回」で紹介されていた
symgetの性質を組み合わせることで、DATAステップ内で他のPROC/DATAステップの
結果を取得しながら、半ば対話的な処理が可能となります。ただ、具体的な事例を
見つけるのはまたの機会にということで、ここでは両者の違いを単純な例で紹介
させて頂きます。

まずは同じ動きを見てみましょう。
*** テストデータ ;
data TEST ;
call streaminit(100) ;
do ID = 1 to 50 ;
GRP = rand("table",1/2,1/2) ;
VAL = rand("normal",10+GRP,5) ;
output ;
end ;
run ;
*** 同じ動き(マクロステートメントの実行のみ) ;
data RES_M ;
call execute('%let _XXX = 1') ;
rc = dosubl('%let _YYY = 3') ;
X = symget('_XXX') ;
Y = symget('_YYY') ;

run ;

・テストデータ(一部抜粋)
testdata_dosub.jpg


結果は双方ともにマクロ変数の値がデータセットの変数に格納されます。
dosubl_1.png

続いて、SQLプロシジャで各グループの番号と例数をSQLプロシジャで取得して
その値を変数に格納しようとした場合の違いを見てみます。dosubl関数では
マクロ変数を格納できますが、call executeでは値を取得できません。
下記プログラムはcall executeとdosubl関数が違うだけです。
*** 異なる動き(dosublはPROC/DATAステップを並行して実行して結果をsymgetで使用できる) ;
*** SQLプロシジャでグループと例数をカンマ区切りでマクロ変数に格納 ;
*** 1. call execute ;
data RES_EX ;
call execute('proc sql noprint ;
select GRP, count(distinct ID) into: _G separated by ",", :_N separated by ","
from TEST group by GRP ;
quit ;') ;
X = symget('_G') ; *--- グループ番号 ;
Y = symget('_N') ; *--- IDで一意なレコード数 ;
run ;
*** 2. dosubl ;
%symdel _G _N ;
data RES_D ;
rc = dosubl('proc sql noprint ;
select GRP, count(distinct ID) into: _G separated by ",", :_N separated by ","
from TEST group by GRP ;
quit ;') ;
X = symget('_G') ; *--- グループ番号 ;
Y = symget('_N') ; *--- IDで一意なレコード数 ;
run ;


結果は以下になります。call executeは空でdosubl関数は取得できていることが
確認できます。

・call execute
dosubl_2_call_execute.png

・dosubl関数
dosubl_2_dosubl.png

dosubl関数であれば、以下のように検定の結果も格納できます。
*** 検定結果(p値)の取得 ;
data RES_T ;
rc = dosubl('ods output ttests=_TTEST ;
proc ttest data=TEST ;
var VAL ;
class GRP ;
run ;
ods output close ;') ; *--- 検定の実行 ;
rc = dosubl('%global _P ;
data _null_ ;
set _TTEST ;
where method="Pooled" ;
call symputx("_P",probt) ;
run ;') ; *--- p値をマクロ変数に格納 ;
XX = symget('_P') ;
run ;

結果は以下になります。
dosubl_3_pval.png

Posted on 2014/03/22 Sat. 12:26 [edit]

CM: 2
TB: 0

0319

平均値のプロット(投与群ずらし)  

臨床試験では、経時的に測定されたデータについて、平均値・SDのプロットを
描画することが多々ありますが、9.3リリース前は各Visitの値を投与群ごとに
ずらしたデータを作成して描画する必要がありました。9.3からは、SGPLOT
プロシジャのgroupオプションとgroupdisplayオプションを使用することで簡単に
描画できるようになりました。知ってる人にとっては大したことない話ですが
個人的にすごく欲しかった機能なので備忘録として。
※注意点ですが、9.3_M1の場合は、HotfixのF98009の適用が必要です。

プログラムですが、SGPLOTプロシジャのvlineステートメントで、
group=投与群変数 groupdisplay=clusterを指定します。

*** テストデータ作成 ;
data _TEST ;
call streaminit(100) ;
do ID = 1 to 90 ;
GRP = rand("table",1/3,1/3,1/3) ;
do VISIT = 1 to 5 ;
VAL = rand("normal",10+(VISIT>1)*GRP+(VISIT>1)*0.5*GRP*VISIT,5) ;
output ;
end ;
end ;
run ;
*** 投与群をずらして平均値/SDプロット ;
proc sgplot data=_TEST ;
vline VISIT / response=VAL group=GRP groupdisplay=cluster
stat=mean limitstat=stddev limits=both
markers markerattrs=(symbol=circlefilled) ;
xaxis type=discrete ;
run ;


テストデータは、3群でVisit1からVisit5までのデータが格納されています。
testdata.png

結果は以下になります。各時点のプロットが投与群ごとに少しずつずれて
出力されています。いや~、このオプションはマジでイケてます♪
groupdisplay_meanplot.png

Posted on 2014/03/19 Wed. 00:21 [edit]

CM: 3
TB: 0

0316

肥満症治療薬の開発についての独り言  

特に真新しい話は何もありませんが、肥満症治療薬の開発についての備忘録です。
FDAからドラフトガイダンスが発出されてから既に7年が経ちましたが、未だに
最終化されておらず、最終化する気あんの?という状況が続いてます。今日は
そのドラフトガイダンスをすごく大雑把にまとめておきます。ちなみに米国に
おいて、肥満症の治療薬の承認はハードルが高い状況が続いています。その
理由の一つが以下の第3相に求められる要件です。

第3相試験に求められる事項:
・プラセボ対照の無作為化比較試験
・妥当な安全性評価は1年間の実薬3000例、プラセボ群1500例以上の投与
 によって可能となる。

・有効性は以下のいずれかを満たす。
 ・体重減少の平均値について、プラセボ群との差が少なくとも5%
  かつ統計的に有意な差がある。
 ・5%の体重減少を達成した被験者の割合が実薬で少なくとも35%で、
  プラセボ群の2倍かつ統計的に有意な差がある。


例数が膨大かつ有効性の基準が、特に中枢系以外ではかなり厳しいことになってます・・・。
この上CVイベント評価の大規模試験も求められたら米国でもしんどいですね。。

その他もかなり大雑把にまとめておきます。

体重減少のベネフィット:
・5%以上の体重減少は、様々な代謝や心血管系のリスク要因の改善と関連している。
・ライフスタイルへの介入を伴う適度な意図的な減量は、肥満関連の罹患率及び死亡率を
 減少させる可能性がある。

投与される条件:
・ライフスタイルの修正が失敗した後
・減量のベネフィットが治療のリスクを上回ると期待される場合

成人の対象被験者:
・BMI>=30または27以上で合併症あり(2型糖尿病、高血圧、脂質異常症etc.)
・様々な患者背景、民族
・BMI40以上

第1、2相試験で求められる事項:
・PKは広範囲のBMI
・用量反応
・効果なしの用量、忍容性がある最大用量
・最大の減量効果を捉えるのに十分な期間
・用法の検討

日本では臨床開発ガイドラインがないため、FDAのドラフトガイダンスと
肥満症治療ガイドラインを参考に開発が進められることになりますが、
日本のガイドラインのリリースが待たれます。

参考:FDAドラフトガイダンス


Posted on 2014/03/16 Sun. 01:43 [edit]

CM: 0
TB: 0

0315

ベクトルプロット(Vector plot)事始め(SG)  

今回は「ベクトルプロット(vector plot)」というグラフを紹介します。

臨床試験では、開発中の薬剤を被験者に投与した際に、様々な安全性データの
分析を行いますが、例えば注意すべき薬剤特有の有害事象がどのような発現
プロファイルを示しているのかを図示することで視覚的に有用な情報を得る
ことができます。もちろん、通常の有害事象の発現率などの解析は行った上での話です。

ここでは、ある薬剤を投与した際に「口内炎」が多くみられるとします。
各被験者が薬剤投与後どのような時期に、どれくらいの期間口内炎を
発現しているかを図示して視覚的に発現プロファイルを確認することが
目的です。

テストデータは、各被験者ごとに口内炎の発現日と消失日が格納されているとします。
vector_testdata.png

ベクトルプロットでは、sgplotプロシジャのvectorステートメントで以下のオプションを
使用します。

vector x=終点の変数 y=終点の変数
/ xorigin=始点の変数 yorigin=始点の変数 <オプション> ;


noarrowheadsオプションで矢印なし、arrowheadshape=both/in/outで矢印を出力して
方向も指定することができます(ここでは矢印なしの事例です)。
また、始点と終点にscatterステートメントでダイヤモンドマークを出力しておきます。
*** テストデータの作成 ;
data AE ;
call streaminit(100) ;
do ID = 1001 to 1010 ;
AESDY = max(1,round(rand("normal",5,5),1.)) ; *--- 口内炎発現日 ;
AEEDY = max(AESDY,round(rand("normal",10,5),1.)) ; *--- 口内炎消失日 ;
output ;
end ;
run ;
*** ベクトルプロットの描画 ;
title "口内炎の発現時期" ;
proc sgplot data=AE ;
refline ID / axis=y lineattrs=(pattern=2 color=lightgray) ; *--- 薄い点線 ;
vector x=AEEDY y=ID
/ noarrowheads xorigin=AESDY yorigin=ID
lineattrs=(color=gray pattern=1 thickness=0.1in) ;
*--- 発現から消失のベクトルプロット ;
scatter x=AESDY y=ID
/ markerattrs=(size=0.1in symbol=diamondfilled color=red)
name="Start" legendlabel="Start Days" ; *--- 発現日のダイヤモンド ;
scatter x=AEEDY y=ID
/ markerattrs=(size=0.1in symbol=diamondfilled color=black)
name="End" legendlabel="End Days" ; *--- 消失日のダイヤモンド ;
xaxis integer label="投与後日数(日)" ;
yaxis values=(1001 to 1010 by 1) label="被験者ID" ;
keylegend "Start" "End" ; *--- 凡例 ;
run ;
title ;


結果は以下になります。発現時期や持続期間が視覚的に確認できて便利ですね。
vector1.png

Posted on 2014/03/15 Sat. 13:22 [edit]

CM: 0
TB: 0

0311

睡眠時間の計算  

とある仕事で睡眠時間の計算が必要になり、後輩に「このデータから
ちゃんと睡眠時間計算できますよね」と脅迫されたので少し考えてみました。
ただBoolean型の表現が便利というだけで大した話ではありません。。

入力データは、言うまでもなく就寝時刻と起床時刻ですが、以下の
条件を考慮する必要があります。
・時刻は文字列で格納される("23:30"など)。
・最終的に単位は「時間」で格納する。
・単純に引き算すると負の数になるので、0時をまたぐ/またがないで
 きちんと場合分けが必要である。

プログラムの処理は以下になります。
・inputステートメントで文字をSAS時間値に変換(単位は秒)
・引き算の正負をBoolean(偽:0/真:1)で返して睡眠時間を計算
・睡眠時間の単位を時間に変換

data sleeptime ;
*--- 就寝時刻と起床時刻 ;
input bedtime time5. wakeuptime time5. ;
*--- 睡眠時間(秒と時間) ;
_interval_s = wakeuptime - bedtime + (wakeuptime - bedtime < 0)*24*3600 ;
_interval_h = _interval_s/3600 ;

*--- 【参考】睡眠時間の時間部分と分部分 ;
h_part = hour(_interval_s) ;
m_part = minute(_interval_s) ;

label bedtime="就寝時刻" wakeuptime="起床時刻"
_interval_s = "睡眠時間(秒)" _interval_h = "睡眠時間(時間)"
h_part = "時間" m_part = "分" ;
format bedtime wakeuptime hhmm5. ;
cards;
23:10 6:50
1:00 7:10
;
run ;

proc print data=sleeptime label ;
run ;


結果を見てみましょう。就寝時刻が0時を超えた場合と超えていない場合の
睡眠時間が正しく計算されています。
睡眠時間

Posted on 2014/03/11 Tue. 00:14 [edit]

CM: 0
TB: 0

0308

IMLによる多変量正規乱数の生成  

先日、DATAステップによる2変量正規乱数の生成方法を紹介しましたが、
今回はIMLプロシジャを用いた多変量正規乱数の生成方法を紹介します。
多変量正規乱数の生成方法は色々ありますが、ここではIMLプロシジャの
randnormal関数を使用します。

以下の多変量正規(Multivariate Normal; MVN)分布を想定します。
多変量正規分布
randnormal関数は引数に発生させるデータ数、想定する平均値のベクトルと
分散共分散行列を指定します。
randnormal(N,MEAN,Cov.)

分散共分散行列をそのまま指定してもいいですが、現実的には変数間の
相関行列と標準偏差(または分散)から分散共分散行列を計算して指定
することが多いかなと想像してます。今回のプログラムの流れは、

3変数の相関行列、平均値と標準偏差のベクトルを指定し、分散(_VAR)を算出
⇒分散共分散行列を計算(相関行列の各要素と_VAR`*_VARの各要素を#で掛ける)
⇒randnormal関数で乱数を生成
⇒生成したデータの要約統計量と相関係数を確認する

proc iml ;
call randseed(100) ;
create RES var{X1 X2 X3} ;
*--- 各パラメータの設定 ;
_CORR = {1 0.3 0.5,
0.3 1 0.6,
0.5 0.6 1 } ; *--- 相関行列 ;
_MEAN = {5 3 1} ; *--- 各変数の平均値を格納したベクトル ;
_SD = {3 2 1} ; *--- 各変数の標準偏差を格納したベクトル ;
_VAR = _SD##2 ; *--- 各変数の分散を格納したベクトル ;
_COV = _CORR # sqrt(_VAR` * _VAR) ; *--- 分散共分散行列 ;

*--- 3変量正規乱数の生成 ;
N = 500 ;
_X = randnormal(N,_MEAN,_COV) ; *--- データ数, 平均値ベクトル, 分散共分散行列 ;
print _X ;
*--- 結果をデータセットに格納 ;
append from _X ;
close RES ;
*--- 結果の確認(Pearsonの積率相関係数と要約統計量) ;
submit ;
proc corr data=RES pearson ;
var X: ;
run ;
endsubmit; *--- セミコロンの前にスペースを入れるとなぜかerror ;

quit ;

corrプロシジャの結果を見てみましょう。想定通りの相関係数と
平均値・標準偏差のデータが生成されていることが確認できます。
多変量_IMLの結果

Posted on 2014/03/08 Sat. 17:23 [edit]

CM: 0
TB: 0

0308

奏効率のWaterfallプロット  

抗癌剤の奏効率に関してウォーターフォール(waterfall)プロットと呼ばれる
グラフを作成することがあります。奏効率とは、標的病変の腫瘍の縮小率を
示す指標で、奏効率や大きさ等から、病変の評価を何段階かのカテゴリに
分けて評価します。ここでは、奏効率と各カテゴリを下記のように効果が
高いほうから単純に奏効率のみで分類・色分けしてwaterfallプロットを作成
します。詳しくはRESISTという固形がんの治療効果判定ガイドラインをご参照
ください。
・完全奏(CR)、部分奏功(PR)、安定(SD)、進行(PD)

プログラムの流れは以下になります。
奏効率とカテゴリのテストデータを生成
⇒奏効率の悪いほうから並べ替えて連番を付与
⇒SGPLOTプロシジャのvbarステートメントでグラフ作成
 (groupオプションに評価カテゴリを指定)
*** テストデータの作成 ;
data _TEST ;
call streaminit(100) ;
do ID = 1 to 40 ;
PCHG_TM = rand("normal",-50,50) ; *--- 奏効率 ;
if PCHG_TM <= -100 then PCHG_TM = -100 ; *--- 奏効率100% ;
select ; *--- 奏効率カテゴリ変数 ;
when( PCHG_TM = -100) RES = 1 ;
when(-100 < PCHG_TM <= -30 ) RES = 2 ;
when(-30 < PCHG_TM <= 20 ) RES = 3 ;
when( 20 <= PCHG_TM ) RES = 4 ;
end ;
output ;
end ;
run ;
*** 奏効率カテゴリフォーマット ;
proc format ;
value _RESF 1 = "CR"
2 = "PR"
3 = "SD"
4 = "PD" ;
run ;
*** 奏効率並べ替えと連番 ;
proc sort data=_TEST ;
by descending PCHG_TM ;
run ;
data _TEST2 ;
set _TEST ;
ID2 = _N_ ; *--- 連番 ;
run ;
*** ウォーターフォールプロットの作成 ;
proc sgplot data=_TEST2 ;
vbar ID2 / response=PCHG_TM group=RES ; *--- groupで奏効率カテゴリ色分け ;
xaxis display=none ; *--- X軸表示せず ;
yaxis label='奏効率(%)' ;
format RES _RESF. ;
run ;


結果は以下になります。簡単に作れるのでマクロ化して使いまわせそうですね。
waterfall.png

Posted on 2014/03/08 Sat. 12:40 [edit]

CM: 2
TB: 0

0304

GTLによる3Dプロットあれこれ  

SASによる3Dプロットの描画方法はいくつかありますが、
GTLによる下記二つの3Dプロットの描き方をメモしておきます。

①3Dのデータをプロットするsurfaceplotparm
②3Dのヒストグラムをプロットするbihistogram3dparm

双方とも、layout overlay3dステートメントで記述して、x,y,z軸の
変数をそれぞれ指定します。また、①の注意点は、事前にy軸とx軸の
変数でデータをソートしておく必要がある点です。

まずはsurfaceplotparmの使用例を見てみましょう。GTLでは各軸の変数を
指定します。x軸とy軸の変数を正規乱数(相関係数は0.6)で生成し、z軸の
変数にはFREQプロシジャで度数を格納します。描画にはSGRENDERプロシジャ
を使用します。
*** テストデータ作成 ;
data _XYZ ;
call streaminit(100) ;
do I = 1 to 200 ;
_X = round(rand('normal', 3, 2),1.) ;
_Y = round(rand('normal', 2 + 0.6*3*(_X-3)/2, 3*sqrt(1-0.6**2)),1.) ;
output ;
end ;
run ;
*** 度数をカウント ;
ods listing close ;
ods output crosstabfreqs=_FREQ(where=(_TYPE_='11')) ;
proc freq data=_XYZ ;
table _Y*_X / nocol norow ;
run ;
ods output close ;
ods listing ;
data _OUT ;
set _FREQ ;
rename Frequency=_Z ;
keep _Y _X Frequency ;
run ;
*** Surfaceplotは事前にソートが必要 ;
proc sort data=_OUT ;
by _Y _X ;
run ;
*** Surfaceplotの定義 ;
proc template;
define statgraph _surface;
begingraph;
entrytitle "3D Graph";
layout overlay3d / cube=false ;
surfaceplotparm x=_X y=_Y z=_Z / surfacetype = fill ;
endlayout;
endgraph;
end;
run;
*** 出力 ;
proc sgrender data=_OUT template=_surface ;
run ;
>


結果は以下になります。何やら良く分かりませんが、とりあえず
各軸の値を結んだ3Dプロット図が出力されます。
Surfaceplotparm.png

ついでにヒストグラムもbihistogram3dparmステートメントで描画します。
データによってはなぜかwarningが出ますが、全てのbinのデータがそろってないからでしょうか。
*** ヒストグラム(Warningは全Binのデータがないから?) ;
proc template;
define statgraph _histo ;
begingraph;
entrytitle "3D Graph";
layout overlay3d / cube=false ;
bihistogram3dparm x=_X y=_Y z=_Z ;
endlayout;
endgraph;
end;
run;
*** 出力 ;
proc sgrender data=_OUT template=_histo ;
run ;


結果は以下になります。
bihistogram3dparm.png

色んなオプションもありそうですがおいおい・・・。

Posted on 2014/03/04 Tue. 00:32 [edit]

CM: 0
TB: 0

プロフィール

最新記事

最新コメント

最新トラックバック

月別アーカイブ

カテゴリ

訪れた人

▲Page top

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。