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

徒然なるままにSAS暮らし

0731

htmlencode関数  

一般的には馴染みのない関数だと思いますが、医薬品開発でSASプログラマーさんが、CDISCのDefine.xmlという文書をSASで書いてやろうなんて考えている人が使うであろうhtmlencode関数を紹介します。CDISCの書籍でも公開されているプログラムの中にも頻繁に登場しますので、何も真新しいものではありませんが、例えば、html文書の中で「<」と安易に記述するとブラウザが開けないことがあります。これは、htmlやxmlで使用されるタグ(<や>)と混同されてしまうためです。
以下では、文字列の中に不等号や&といった記号が含まれる際に、html文書でそのまま開くためにhtmlencode関数でもとの文字列を変換しています。
使い方: htmlencode(変数, 'オプションをスペース区切りで記述')
デフォルトでは、「<」が「&lt;」、「>」が「&gt;」、「&」が「&amp;」に変換されます。「quot」を追加すると引用符も変換されます。
data htmltest ;
length x $100. ;

x = 'where AGE < 65 & PARAMCD = "ALT" & AVAL >= 31' ;
output ; *--- Original ;
x = htmlencode(x) ;
output ; *--- Default: 'gt' 'lt' 'amp' ;
x = htmlencode(x, 'lt gt amp quot') ;
output ; *--- Default + 'quot' ;
run ;

options linesize=200 ;
proc print ; run ;


結果は以下になります。変換されていることが確認できます。これでブラウザ上でも意図通りの文字列を出力することが可能になります。
htmlencode_res.png
スポンサーサイト

Posted on 2015/07/31 Fri. 13:40 [edit]

CM: 0
TB: 0

0731

NOTで始まる関数  

前回ANYで始まる関数で紹介した関数の逆バージョンである「NOTで始まる関数」で遊んでみました。その名の通り、ANYで始まる関数と逆の動きをします。つまり、「~以外の文字の最初の位置」を返してくれます。
data test ;
x="123_ - %Abc" ;
length func $12. ;

func = "NOTALNUM" ; a = NOTALNUM(x) ; output ;
func = "NOTALPHA" ; a = NOTALPHA(x) ; output ;
func = "NOTCNTRL" ; a = NOTCNTRL(x) ; output ;
func = "NOTDIGIT" ; a = NOTDIGIT(x) ; output ;
func = "NOTFIRST" ; a = NOTFIRST(x) ; output ;
func = "NOTGRAPH" ; a = NOTGRAPH(x) ; output ;
func = "NOTLOWER" ; a = NOTLOWER(x) ; output ;
func = "NOTNAME" ; a = NOTNAME(x) ; output ;
func = "NOTPRINT" ; a = NOTPRINT(x) ; output ;
func = "NOTPUNCT" ; a = NOTPUNCT(x) ; output ;
func = "NOTSPACE" ; a = NOTSPACE(x) ; output ;
func = "NOTUPPER" ; a = NOTUPPER(x) ; output ;
func = "NOTXDIGIT" ; a = NOTXDIGIT(x) ; output ;
run ;

options nocenter ;
proc print ; run ;


結果は以下になります。ANYとNOTの組み合わせで色んなことができそうですね。もちろんPerl関数もそうですが、データに格納される文字列が特定できない場合にはこういった関数は重宝しますね。
Not_func1.png

Posted on 2015/07/31 Fri. 11:27 [edit]

CM: 0
TB: 0

0731

ANYで始まる関数  

SASには文字列関連の関数が多数用意されていますが、9.1.3から追加されていたものの今まで使ったことがなかったANYシリーズの関数を試してみました。今更感甚だしいのですが、これが意外と使えそうで面白いことに気づきました。今まで文字列の抽出は、「普通の関数が面倒 or ダメ」⇒「Perl関数(PRXシリーズ)で抽出」という流れでプログラミングしていたのですが、ANYシリーズがあればPerl関数がなくても簡単に記述できる場面がありそうですね。

最初にアルファベットが登場する位置(ANYALPHA)や、最初の大文字(ANYUPPER)、小文字の位置(ANYLOWER)、空白の位置(ANYSPACE)、特殊文字(ANYPUNCT)やSAS変数名に使える文字の位置(ANYNAME)等々、色々な文字列の位置を返すことができます。データの入力ルールがある程度決まっているような場合はPerl関数使うより単純化されるんじゃないかと思います。以下では、変数xが文字列、funcが関数名、aが対象となる文字列の位置になります。

data test ;
x="%123_ - Abc" ;
length func $9. ;

func = "ANYALNUM" ; a = ANYALNUM(x) ; output ;
func = "ANYALPHA" ; a = ANYALPHA(x) ; output ;
func = "ANYCNTRL" ; a = ANYCNTRL(x) ; output ;
func = "ANYDIGIT" ; a = ANYDIGIT(x) ; output ;
func = "ANYFIRST" ; a = ANYFIRST(x) ; output ;
func = "ANYGRAPH" ; a = ANYGRAPH(x) ; output ;
func = "ANYLOWER" ; a = ANYLOWER(x) ; output ;
func = "ANYNAME" ; a = ANYNAME(x) ; output ;
func = "ANYPRINT" ; a = ANYPRINT(x) ; output ;
func = "ANYPUNCT" ; a = ANYPUNCT(x) ; output ;
func = "ANYSPACE" ; a = ANYSPACE(x) ; output ;
func = "ANYUPPER" ; a = ANYUPPER(x) ; output ;
func = "ANYXDIGIT" ; a = ANYXDIGIT(x) ; output ;
run ;

options nocenter ;
proc print ; run ;


出力結果:
Any_func

NOTシリーズも用意されているみたいなのでまた遊んでみます。

Posted on 2015/07/31 Fri. 01:03 [edit]

CM: 0
TB: 0

0726

密度関数と棒グラフの色塗り  

統計解析の教育資料とかで良く目にする密度関数や棒グラフに色を塗る方法を紹介します。
密度関数の場合はSGプロシジャのbandステートメントを使用するだけなので全く真新しいもの
ではありませんが、Rで簡単にできるのと海外で紹介されているのを見て試してみました。
・密度関数を描画する値を格納する。
・下側と上側を描画するための値だけ格納する変数を用意する。
・SGPLOTプロシジャのbandステートメントで上側と下側を描画する。
という流れです。
*** 連続量の場合 ;
data test ;
low = quantile("normal",0.025) ; *--- 2.5%点 ;
high = quantile("normal",0.975) ; *--- 97.5%点 ;

do x = -5 to 5 by 0.01 ;
pdf = pdf("normal",x) ; *--- 標準正規分布の確率密度関数 ;
if x <= low then a1 = pdf ; else a1 = . ; *--- 2.5%点以下のみ描画用 ;
if x >= high then a2 = pdf ; else a2 = . ; *--- 97.5%点以上のみ描画用 ;
output ;
end ;
run ;

proc sgplot data=test ;
series x=x y=pdf ; *--- 標準正規分布の確率密度関数描画 ;
band x=x upper=a1 lower=0 / fillattrs=(color=blue) ; *--- 2.5%点以下を描画 ;
band x=x upper=a2 lower=0 / fillattrs=(color=pink) ; *--- 97.5%点以上を描画 ;
run ;


結果は以下になります。教育にはもってこいの資料が作れそうです。
Density_band
ついでに棒グラフの場合も載せておきます。
*** 棒グラフの場合 ;
data test2 ;
low = -6 ; *--- 下側 ;
high = 6 ; *--- 上側 ;
do x = -10 to 10 ;
y = 10 - abs(x) ;
if x <= low then a1 = y ; else a1 = . ; *--- 下側描画用 ;
if x >= high then a2 = y ; else a2 = . ; *--- 上側描画用 ;
output ;
end ;
run ;

proc sgplot data=test2 ;
vbar X / response=y outline outlineattrs=(color=black)
nofill ; *--- 色なし ;
vbar X / response=a1 outline outlineattrs=(color=black)
fill fillattrs=(color=red) ; *--- 下側描画 ;
vbar X / response=a2 outline outlineattrs=(color=black)
fill fillattrs=(color=blue) ; *--- 上側描画 ;
run ;

結果は以下になります。
vbar_band




Posted on 2015/07/26 Sun. 19:14 [edit]

CM: 0
TB: 0

0718

改訂版 統計解析ソフト「SAS」  

高浪洋平、舟尾暢男共著「統計解析ソフト『SAS』」がカットシステム様のご厚意により再販されることが決定されました!!
拙著の紹介HPはこちら

当初は単なる入門書を出版する予定が、共著者の舟尾さんと執筆しているうちに原稿が約800頁になってしまい、ページ数を抑えるために読みやすさを犠牲にしていたレイアウトだったのですが、今回はカットシステム様の素晴らしいレイアウトで、600頁の大作となって帰ってきました!少々値は張りますが、一読の価値はあるものと自負しております。この一冊を極めていればどこの製薬会社でも解析業務を一通りこなすことができるでしょう。

私も今から3章の復習です。

表紙

Posted on 2015/07/18 Sat. 00:14 [edit]

CM: 0
TB: 0

0717

SASユーザー総会2015  

さて、今年もSASユーザー総会の季節がやってきました。今年も東京大学で開催されますが、プログラムが発表されました。プログラムはこちら。光栄なことに、今年も「CDISC企画セッション」の一演題として発表させて頂く運びとなりました。今年の発表演題は「解析結果メタデータの概要とSASによる作成方法の提案」で、来年から医薬品製造販売承認申請時に制度が開始される電子データの提出に関する話題です。医薬品医療機器総合機構(PMDA)が世界に先駆けて製薬企業に提出を望むと通知に記載した「解析結果メタデータ」の概要とSASによる作成方法を紹介させて頂きます。米国のFDAもまだガイダンスで言及していない「解析結果メタデータ」をPMDAが通知に記載したことは世界でちょっとした話題になっており、SASで簡単に作成できれば面白いと思い、提案させて頂くことになりました。昨年に引き続き、CDISC企画セッションでは一緒に業界活動をさせて頂いているスペシャリスト達も発表しますので面白くなりそうです。

Posted on 2015/07/17 Fri. 23:51 [edit]

CM: 0
TB: 0

プロフィール

最新記事

最新コメント

最新トラックバック

月別アーカイブ

カテゴリ

訪れた人

▲Page top