2011-09-13 10 views
11

次のマクロを作成しました。 Proc powerは、列Powerを含むテーブルpw_coutを返します。 data _null_ステップは、の値をpw_outに設定して、マクロ変数tpwに割り当てます。値を返すマクロ

data test; 
    set tmp; 
    pw_tmp=ttest_power(meanA=a, stdA=s1, nA=n1, meanB=a2, stdB=s2, nB=n2); 
run; 

ここでマクロのコードです:私はマクロのメインプログラムで、私のような、DATAステップでそれを呼び出すことができるように、tpwの値を返すためには、希望

%macro ttest_power(meanA=, stdA=, nA=, meanB=, stdB=, nB=); 


proc power; 
    twosamplemeans test=diff_satt 
    groupmeans = &meanA | &meanB 
    groupstddevs = &stdA | &stdB 
    groupns = (&nA &nB) 
    power = .;  
    ods output Output=pw_out; 
run; 

data _null_; 
    set pw_out; 
    call symput('tpw'=&power); 
run; 

&tpw 
%mend ttest_power; 

答えて

2

あなたはあなたがこのようにしようとしていることをすることはできません。 SASのマクロは、典型的なプログラミング言語とは少し異なります。呼び出すサブルーチンではなく、実行される他のSASコードを生成するコードです。 proc powerをデータステップ内で実行することはできないため、データステップからこのマクロを実行することはできません。 (マクロ内のすべてのコードをデータステップにコピーすることは想像しても動作しません)SASのマクロと同じです。

それぞれの観察結果を読む方法は、tmp一度に1つずつ、そしてproc powerを実行します。あなたは、出力の各ラウンドの結果を格納することができproc appendを使用することにより

/* First count the observations */ 
data _null_; 
    call symputx('nobs',obs); 
    stop; 
    set tmp nobs=obs; 
run; 

/* Now read them one at a time in a macro and call proc power */ 
%macro power; 
    %do j=1 %to &nobs; 
    data _null_; 
     nrec = &j; 
     set tmp point=nrec; 
     call symputx('meanA',meanA); 
     call symputx('stdA',stdA); 
     call symputx('nA',nA); 
     call symputx('meanB',meanB); 
     call symputx('stdB',stdB); 
     call symputx('nB',nB); 
     stop; 
    run; 

    proc power; 
    twosamplemeans test=diff_satt 
    groupmeans = &meanA | &meanB 
    groupstddevs = &stdA | &stdB 
    groupns = (&nA &nB) 
    power = .;  
    ods output Output=pw_out; 
    run; 

    proc append base=pw_out_all data=pw_out; run; 
%end; 
%mend; 

%power; 

:私はこのような何かをするだろう。

私はこのコードをチェックしていないので、バグがあるかもしれませんが、この方法はうまくいきます。

10

@itzyは、あなたのアプローチがうまくいかない理由を指摘するのは正しいです。しかし、というアプローチの精神を維持するソリューションです.PROC FCMPを使用して電力計算機能を作成する必要があります。実際には、AFAIKは、PROC FCMPの関数内からプロシージャを呼び出すために、マクロ内で呼び出しをラップする必要があります。ここで

は、あなたのマクロです - わずかに修正(主にsymput文を修正するために):

%macro ttest_power; 

    proc power; 
    twosamplemeans test=diff_satt 
    groupmeans = &meanA | &meanB 
    groupstddevs = &stdA | &stdB 
    groupns = (&nA &nB) 
    power = .;  
    ods output Output=pw_out; 
    run; 

    data _null_; 
     set pw_out; 
     call symput('tpw', power); 
    run; 

%mend ttest_power; 

今、私たちはそれを呼び出す関数を作成:

proc fcmp outlib=work.funcs.test; 

    function ttest_power_fun(meanA, stdA, nA, meanB, stdB, nB); 
    rc = run_macro('ttest_power', meanA, stdA, nA, meanB, stdB, nB, tpw); 
    if rc = 0 then return(tpw); 
    else return(.); 
    endsub; 

run; 

をそして最後に、我々は試すことができますデータステップでこの関数を使用します。

options cmplib=work.funcs; 

data test; 
    input a s1 n1 a2 s2 n2; 
    pw_tmp=ttest_power_fun(a, s1, n1, a2, s2, n2); 
cards; 
0 1 10 0 1 10 
0 1 10 1 1 10 
; 
run; 

proc print data=test; 
2

prを呼び出すマクロを呼び出すことができます(例のように)呼び出しexecute()を使用してデータの中からデータを読み込みますが、ちょっと混乱してデバッグするのが難しくなります。

関連する問題