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

徒然なるままにSAS暮らし

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

プロフィール

最新記事

最新コメント

最新トラックバック

月別アーカイブ

カテゴリ

訪れた人

▲Page top