1

同じ結果であるが、いくつかのデータセットに対して異なる主説明変数(共変量はすべてのモデルに共通)を持ついくつかのロジスティック回帰モデルを実行できるようにするマクロを実装しようとしています。2つのグローバル変数をスキャンするスキャンおよび評価マクロを作成しましたが、完全には機能していません。コードを以下に示します。

%let numbers=5 7 8 9 10 12 13 14 16 18 19 24  26 
32 33  35 37  39  41  44 45  48 50 52 
55 56  58  66 67 68 ; 

%let list=voting national local safe street violence say free;

%macro logistic;    
%let j=1;
%let m=1;
%let first=%scan(&list,%eval(&j));
%let second=%scan(&numbers,%eval(&m));
%do %while (&first ne );
%do %while (&second ne );

proc logistic data=socialcapital&second. descending;
model depression= &first. agec married edu inc_2 inc_3 inc_4 inc_5/risklimits;
ods output ParameterEstimates=mv_model1&second._&first.;
run;

%let j=%eval(&j+1);
%let m=%eval(&m+1);
%let first=%scan(&list,%eval(&j));
%let second=%scan(&numbers,%eval(&m)); 
%end;
%end;
run;

%mend;  
%logistic;

グローバル変数番号は、私が使用している「社会資本」データセットを指します。各データセットは国を表すため、「numbers」グローバル変数の各数値はデータセットを参照します。グローバル変数リストは、モデルに含めたい主な説明変数のリストを指します。モデルごとに1つの主な説明変数です。私が取得しようとしているのは、各国の8つの個別の多変数ロジスティック回帰の結果です。

しかし、スキャン機能が正常に機能していないようで、何か間違ったことをしたことはわかっていますが、何が起こっているのかわかりません。マクロは、&listから1つの変数を&numbersから1つのデータセットに割り当て、&listからの変数がなくなるまで、データセット5を使用して8つのモデルすべてを実行するのではなく、共変量のみでモデルを実行し、次にを使用して8つのモデルすべてを再度実行するようです。データセット7など。

基本的に、私は番号付けで何かを台無しにしました、そして私はこのマクロをどのように進めるかについてよくわかりません。スタックされたデータセットを使用してproclogisticで「byステートメント」を使用することで&numbersグローバル変数を取り除くことができることは知っていますが、これがオプションではない可能性がある将来のモデルで機能する方法を学びたいと思います。

4

3 に答える 3

1

これを行う別の方法があります:(データセットにNUMBERSとLISTが含まれる場合は、それを処理するようにコードを変更することもできます)

%let numbers=5 7 8 9 10 12 13 14 16 18 19 24  26 
 32 33  35 37  39  41  44 45  48 50 52 
 55 56  58  66 67 68 ; 

%let list=voting national local safe street violence say free;

%macro logistic(First=, Second=);    
 %Put FIRST= &first;
 %Put SECOND= &second;
 /*proc logistic data=socialcapital&second. descending;*/
 /*model depression= &first. agec married edu inc_2 inc_3 inc_4 inc_5/risklimits;*/
 /*ods output ParameterEstimates=mv_model1&second._&first.;*/
 /*run;*/

%mend logistic;  

%Macro Test;
 %do i = 1 %to %sysfunc(countw(&list));
  %Let first=%scan(&list,&i);
  %do j = 1 %to %sysfunc(countw(&numbers));
   %Let second=%scan(&numbers,&j);
   %logistic(First=&first,Second=&second)
  %end;
 %end;
%Mend test;
%test
于 2012-04-19T23:11:00.533 に答える
1

マギー、

以下のコードはあなたが望むことをするだろうと私は信じています。LOGISTICプロシージャをコメントアウトし、テスト用にPUTステートメントを入力しましたが、これで、期待どおりの方法で解決できるようです。

%let numbers=5 7 8 9 10 12 13 14 16 18 19 24  26 
32 33  35 37  39  41  44 45  48 50 52 
55 56  58  66 67 68 ; 

%let list=voting national local safe street violence say free;

%macro logistic;
   %let j=1;
   %let first=%scan(&list,%eval(&j));
   %do %while (&first ne );
      %let m=1;
      %let second=%scan(&numbers,%eval(&m));
      %do %while (&second ne );

        /*
         proc logistic data=socialcapital&second. descending;
         model depression= &first. agec married edu inc_2 inc_3 inc_4 inc_5/risklimits;
         ods output ParameterEstimates=mv_model1&second._&first.;
         run;
        */
         %put J=&j - M=&m - FIRST=&first - SECOND=&second;

         %let m=%eval(&m+1);
         %let second=%scan(&numbers,%eval(&m));
      %end;
      %let j=%eval(&j+1);
      %let first=%scan(&list,%eval(&j));
   %end;
   run;
%mend;

%logistic;
于 2012-04-19T19:08:01.320 に答える
1

おっと、小さな修正。以下のインデックス「i」ではなく「数字」を使用する必要がありました。

これはマクロで実行できますが、データステップ(呼び出しexecuteを使用)またはProc IML(9.22以降)で送信ブロックをループにネストして実行することもできます。アイデアを得るには、以下を参照してください。

Data _Null_;
 Do numbers = 5, 7, 
                  8 to 10, 
                  12 to 14, 
                  16, 18, 19, 24, 26, 32, 
                  33 to 41 by 2, 
                  44, 45, 48, 50, 52, 55, 56, 58, 
                  66 to 68;  
   Do IndpVar = "voting", "national", "local", "safe", "street", "violence", "say", "free";
       call execute( '%Put '||strip(Indpvar)||strip(put(numbers,best.))||';');
      "Logistic Code Goes Here";
   End;
   End;
 Run;
于 2012-05-16T14:21:12.493 に答える