2019年7月1日月曜日

2群の幾何平均の群間比の信頼区間の話

2群の幾何平均の群間比とその信頼区間を出力したい時は,PROC TTESTが使えますという話です.

幾何平均自体はほかのプロシジャでも出せますが,幾何平均の群間の比が出せるのはttestくらいかなと思っています.ほかでも出せたら是非教えてください.単なる群の幾何平均の信頼区間はsurveymeansでも出せますが.

ttestプロシジャにdist=lognormalを指定すると幾何平均が出せます.出力の中のConfLimitsをデータセットにすると,その中に群間の幾何平均の比の信頼区間が入っています.

proc ttest data=sashelp.class dist=lognormal alpha=0.05 ;
    class sex ;
    var weight ;

    ods output ConfLimits = CL ;
run ;

取得したデータセットのうち,Geomeansが幾何平均,LowerCLとUpperCLが幾何平均の信頼区間です.このほかにもCVで変動係数やその信頼区間が取得できますが,今回は載せていません.

この内のClassが"Raito(1/2)"となっているのが群間の比です. そのまんまですね.見た通り1/2,今回で言うところのF/Mしか出せません.M/Fが欲しいときはMを1,Fを2にした別変数作って,その変数をclassに指定してください.Format作ってorder=formattedを指定しても行けますが,私はいつも別変数作っちゃいますね...

またMethodがPooledは2群の分散が等しい場合,Satterthwaiteは分散が等しくない場合です.welchのほうが聞き馴染みがありますが...大体の場合はPooledですかね?

今回はalphaを明示していますが,指定しないと0.05 が当たります.つまり95%信頼区間ですね.alphaに0.1を指定すると90%信頼区間を出してくれます.データセットではなく結果ウィンドウの表示を見ると何%の信頼区間が出ているかを表示してくれています.本来はデフォルトの0.05をあえて指定する必要はあまりないんですが,書かないとピンとこないと言う説があるのも確かです.

2019年6月6日木曜日

sas製品版でよく使うショートカット

先日のsas勉強会の中でおすすめのショートカットの話がありました.当日は時間がなくてスルーしてしまったのですが,ほかの人がどんなショートカットを使っているかはやはり気になりますね.
製品版のsasを使う上で私が使うことのあるショートカットを紹介します.ほかにもこんなのあるよって方は教えてほしいですね...

F3        プログラムの実行
F5        拡張エディタ表示
F6        ログ画面表示
ctrl+F4 カーソルの当たっているウィンドウを閉じる
ctrl+E  カーソルの当たっている画面をクリア(もっぱらログ削除用)

私は SASの各ウィンドウを最大化して使っているので,しょっちゅうログとエディタを行き来します.実行するとログ画面が一番前に来る設定にしているのですが,エディタに戻るときはF5で戻ります.
一時はログを縦長にして右に,エディタはできるだけ大きくして左にとかやってましたが,最近はもっぱら全部最大化してます.なのでログ画面と拡張エディタを同時に並べてみるとかはほとんどないですね...

2019年6月1日土曜日

変数の型を調べる話

変数の型を調べる方法を紹介するお話です.

proc contentsとかいろいろありますが,今回はvtype関数を取り上げます.この関数でデータセット内の変数を指定すると,その変数が文字か数値かが返ってきます.複数の変数を調べるときはcontentsプロシジャ使うほうがいいですが,こちらの関数も小回りが利いて使うときがたまにあります.

試しに動かしたときのログが以下です.データセットhogeに数値変数aと文字変数bを作ります.
変数aの型をatypeに,bの型をbtypeに取得しているのが次のデータステップです.結果もログに表示させていますが,数値変数ならNが,文字変数ならCが得られます.

そんなに変数の型が変わるのはそもそもよくないのですが,知ってるとデータステップ内で取得できるので便利です.
72 data hoge ; 73 a = 1 ; b = "TST" ; 74 run ; NOTE: データセットWORK.HOGEは1オブザベーション、2変数です。 NOTE: DATAステートメント処理(合計処理時間): 処理時間 0.00 秒 CPU時間 0.00 秒 75 76 data hoge2 ; 77 set HOGE ; 78 79 ATYPE = vtype(a) ; 80 BTYPE = vtype(b) ; 81 82 putlog "ATYPE= " ATYPE ; 83 putlog "BTYPE= " BTYPE ; 84 run ; ATYPE= N BTYPE= C NOTE: データセットWORK.HOGEから1オブザベーションを読み込みました。 NOTE: データセットWORK.HOGE2は1オブザベーション、4変数です。 NOTE: DATAステートメント処理(合計処理時間): 処理時間 0.00 秒 CPU時間 0.01 秒

2019年5月28日火曜日

SASの勉強会に行ってきた話


05月24日、早くも5回目となったsasの勉強会があった。
参加者が18人、一人5分としても発表に80分かかる計算とは恐れ入る。会場はご厚意により3時間いただいていたので余裕と思ったのが間違い。17時30から初めて終わったの21時過ぎ、3時間半かかるとは夢にも思わず。2次会を8時半から抑えていたのを慌てて9時に変更するもそれでも遅刻、お店の方には大いに迷惑をかけてしまった

そろそろ参加者全員が発表するのは時間的に厳しいんじゃ、などと思うがそれだといろんな発表が聞けないジレンマ、やっぱりいろんな人のネタ聞きたいやん?どこぞのナントカRみたいに土日に一日かけてやるしかないのか,いやでもあれも結局登壇者は数少ないしなあ...
メールベースの連絡はもはや限界なので新たなツールを模索する.正直共有twitterかなんか使えば十分連絡は可能なのだがそれだとやはり面白くない.せっかくやしなんか新しいの使いたいよね.うまくいくかは知らんけど.

私の発表資料はこちらに置いています.まあ大したことない日付formatの話なのでいちいち乗せるほどでもない気がしますが...せっかくなので供養がてら置きます.swayは神アプリなのでこういう時とても便利ですね.もうちょっと工夫もできるのですが,面倒なのでそのまま書き出しどーんで終わってますが...

2019年5月1日水曜日

luaでcall executeっぽいことを実行する話

call executeはご存知の方も多いと思います.データセットの変数を使ってプログラムを繰り替えすやつですね.もちろん便利は便利なんですが,セミコロンを間違ったりなんだりと書き方がややこしいと個人的に思います.
 データセットの変数を読み込んで繰り返しプログラムを実行するのを,executeではなくluaで書くこともできることの紹介です.


例えばa,b,cの三つのデータセットに対してcontentsプロシジャを実行するプログラムをexecuteで書くと以下の通りです.正直このくらいのプログラムなら複雑なこともないのですが...

* --- 読み込み元 ;
data _IN ;

  _dt = "A" ; output ;
  _dt = "B" ; output ;
  _dt = "C" ; output ;

run ;

*----- execute 実行;

data _null_ ;
    set _IN ;
   
    call execute("proc contents data=" || _DT || " varnum short ;") ;
    call execute("run ;") ;
   
run ;

ここからが同じ内容をluaで書いたプログラムです.executeでは読み込む変数を持ったデータセットをsetしていますが,luaだとopenしてget_valueします.実際に実行したいプログラムを””で挟まないので,マクロ変数を使うときにクオートを気にしなくていいのがストレスが少ないです.実に毛根に優しい.
ただし実行ログにsas.submitで展開されるプログラムが表示されるのですが,その時にマクロ変数は展開されないままっぽいです.実に惜しい.@@で挟んだluaのローカル変数は展開されてくれるんですがね...

*---- lua実行 ;

%let _opt = short ;

proc lua ;
submit ;

local code = [[
  proc contents data = @target@ varnum &_opt. ;
  run ;
]]

local _inid = sas.open("_IN")

while sas.next(_inid) do
  sas.submit(code, {target = sas.get_value(_inid , "_dt") })
end

sas.close(_inid)

endsubmit ;
quit ;

lua実行ログの一部が以下の通りです.読み込むデータのBとCはろぐに出ますが,オプションのshortは展開されずにマクロ変数の名前が表示されています.
実行するとちゃんとshortオプション効いてるので ,luaとしてはマクロ変数を展開せずに実行時に展開しているんでしょうね.

proc contents data = B varnum &_opt. ;
run ;
NOTE: PROCEDURE CONTENTS処理(合計処理時間):
処理時間 0.00 秒
CPU時間 0.01 秒
proc contents data = C varnum &_opt. ;
run ;
NOTE: PROCEDURE CONTENTS処理(合計処理時間):
処理時間 0.00 秒
CPU時間 0.01 秒

2019年4月7日日曜日

BBQにお呼ばれした話

bbq行ってきました.

知人にお呼ばれしてBBQへ参加しました.風の吹き抜ける川沿い,心配されていた天候も晴れで気持ちのいいBBQでした.bbqといえば終了後の網と炭の処理がとても面倒くさいですが,燃料付きのインスタントコンロのおかげでその辺の処理がはるかに楽でした.
あんな商品あるんですね...知らなかったです.燃料付きなので火おこしも着火するだけ,あのややこしい蒔組もいりません.なんと楽なんだ.

そして出てくる食べるものが多いのはもはやよくある事か.いやおいしい肉でしたよ?サイコロステーキとかカルビとか.食べてもまだ出てくる肉,飲んでも減らないドリンク.量もおいしさも大満足のBBQでした.1000mlの缶ビールなんて生まれて初めて見ましたよ私.ええ.あと名前だけ聞いたことのあったよなよなエール.あれおいしいらしいですね.

前日に激しい運動をしたせいで肩と背中と太ももが筋肉痛でしたが,とてもおいしく楽しかったです.川沿いのタワマンとか環境がすげえよ
激しい運動で消費したカロリーを一気に取り戻したBBQでした.呼んでくださってありがとうございました.

明日には筋肉痛治まってくれるといいんですが.

2019年4月1日月曜日

streamプロシジャ_noabsscmtオプション

ちまたで話題のstreamプロシジャの紹介を私もしようと.まあ便利ですからねえアレ
beginから一番最後の;;;;までの内容を外部ファイルに出力することができるやつですね.

この記事ではstreamプロシジャのnoabsscmtオプションの紹介です.
このオプションはコメントを外部ファイルに出力するのに必要なものです.

%let _mac1 = "tst" ;

filename tst "st2.txt" ;
proc stream outfile=tst resetdelim="rd" noabsscmt ;
begin
hoge rd newline ;
/*ここはコメント*/ rd newline ;
hage rd newline ;
/*&_mac1*/
;;;;

とすると,以下のように出せます.
今回はst2というテキストファイルへの出力です.
ただしコメント部分のマクロ変数は展開されません.
hoge
/*ここはコメント*/
hage
/*&_mac1*/