1

だから私はdataset_a次のようなものを持っています:

Name  Month
Dick  Aug
Dick  Sep
Dick  Oct
Jane  Aug
Jane  Sep
...

そして、dataset_bこのようにもっと大きなものがあります:

Name  Day        X     Y
Dick  12-Jul-13  14.8  2.3
Jane  05-Sep-13  12.2  2.0
Dick  02-Aug-13  15.1  3.2
Dick  07-Aug-13  14.5  3.0
Jane  05-Aug-13  12.8  2.5
Dick  08-Aug-13  14.5  3.0
Dick  10-Aug-13  13.5  2.3
Jane  31-Jul-13  13.0  2.2
...

それを反復処理したいのですが、 の各行に対してdataset_a、適切なレコードを取得dataset_bして一時データセットに入れるデータ ステップを実行します-- とtemp呼びましょう。proc reg次に、次のように、 onを実行してtemp、結果 (row-vector-style) を に貼り付ける必要がありますdataset_a

Name  Month Parameter-est.-for-Y p-value  R-squared
Dick  Aug   Some #               Some #   Some #
Dick  Sep   Some #               Some #   Some #
Dick  Oct   Some #               Some #   Some #
Jane  Aug   Some #               Some #   Some #
Jane  Sep   Some #               Some #   Some #
...

私の必要性を説明するためのコード/疑似コードを次に示します。

for each row in dataset_a
    data temp;
    set dataset_b; where name=['i'th name] and month(day)=['i'th month]; 
    run;
    proc reg /*noprint*/ alpha=0.1 outest=[?] tableout; model X = Y; run;
    /*somehow put these regression results back into 'i'th row of dataset_a*/
next

何か意味不明な点があればコメントを投稿してください。よろしくお願いします!

4

1 に答える 1

4

これに対する効率的なアプローチは、リストされているものとは多少異なります。あなたが示す特定のインスタンスでは、最も効率的なアプローチは、フォーマットを使用して Day 値を Months にグループ化し、回帰を実行することby name dayです (そうでない場合は、新しい変数monthを作成し、フォーマットを使用して割り当てます) .

例えば:

data for_reg/view=for_reg;
set dataset_b;
month=put(day,MONNAME3.);
run;

または

proc datasets lib=work;
modify dataset_b;
format day MONNAME3.;
quit;

それで

proc reg data=for_reg;
by name month; *or if using the other one, by name day;
**other proc reg statements**;
run;

次に、必要に応じてその出力データセットをマージしdataset_aます。名前/月の組み合わせごとに 1 回実行するかのように proc reg を実行しますが、すべて 1 回の呼び出しと 1 回のデータ パスで行います。


グループによって尊重されない場合PROC REG(そして、私はそう思うが、誰が知っているのか)、最善の解決策はやはりこのようなことをすることです; nameおよびの引数を取る proc reg を実行するマクロを作成し、monthからマクロを呼び出しますdataset_a。次に、共通の出力ファイル (またはproc appendそれらをマクロ内の単一のマスター出力データセットに) を生成しdataset_a、必要に応じて最後に結果をマージします。

何かのようなもの

%macro run_procreg(name=,month=);
data for_run/view=for_run;
set dataset_b;
where name=&name. and put(day,MONNAME3.)=&month.;
run;

proc reg data=for_run; 
*other stuff*;
output out=tempdataset; *or however you create your output;
run;

proc append base=master_output data=tempdataset force;
run;
%mend run_procreg;

proc sql;
select cats('%run_procreg(name=',name,',month=',month,')') into :macrocalllist
  separated by ' ' from dataset_a;
quit;

&macrocalllist;

data fin;
merge dataset_a (in=a) master_output(in=b);
by name month;
run;

dataset_aこれらの 2 つの変数しかない場合は、おそらく最後にマージする必要はありません。これは、 を使用した 1 回の呼び出しよりもはるかに遅くなりますが、by必要な場合は、この方法で実行できます。

上記のようなマクロ リストを駆動するためにデータステップで使用することもできますcall execute。これは、記述された疑似コードとほぼ同じ概念であり、ほぼ同じです。ただし、情報をデータ ステップに戻すことはありません (データ ステップの後に実行されます)。上記の方法よりも少し面倒です。また、9.3+ にdosublは FCMP 言語があり、これを使用すると、目的に少し近づけることができますが、説明したり、実際にニーズを満たしているかどうかを知るのに十分ではありません。

于 2013-10-08T21:38:20.983 に答える