12

以下のマクロを作成しました。column を含むProc powerテーブルを返します。このステップは、 の列の値をマクロ変数に割り当てます。マクロが の値を返すようにしたいので、メイン プログラムで次のように DATA ステップで呼び出すことができます。pw_coutPowerdata _null_Powerpw_outtpwtpw

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

マクロのコードは次のとおりです。

%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;
4

3 に答える 3

11

@itzy は、あなたのアプローチがうまくいかない理由を指摘しています。しかし、アプローチの精神を維持する解決策があります。PROC FCMP を使用して電力計算関数を作成する必要があります。実際、私の知る限り、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;
于 2011-09-19T16:30:38.207 に答える
2

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

やりたいことを行う 1 つの方法はtmp、一度に 1 つずつ観測値を読み取ってから、proc power を実行することです。私はこのようなことをします:

/* 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;

を使用proc appendすると、出力の各ラウンドの結果を保存できます。

このコードをチェックしていないため、バグがある可能性がありますが、このアプローチは機能します。

于 2011-09-13T13:41:58.447 に答える
2

call execute() を使用してデータステップ内から (例のように) プロシージャなどを呼び出すマクロを呼び出すことができますが、少し面倒でデバッグが難しい場合があります。

于 2011-09-21T09:29:20.083 に答える