0

多項分布の従属変数を持つロジット回帰の最適なモデル仕様を見つけたいと考えています。Y には 3 つの結果があり、2 つの変数を使用して予測モデルを作成したいと考えています。ラグと差のあるスポット レートの時系列と、推定実現ボラティリティの時系列です。

最初に考えたのは、各仕様を通過するループを作成し、AIC 値を出力してから、バックトラックして最適なモデルを見つけることができるということでした。

これは機能していますが、問題があります。次の方法でスポット レートを確認します (例): Spot_t - Spot_t-n (n は 21 の可能性があります)。これにより、多くの仕様が可能になります。私の試行回帰では、それぞれに 12 の変数を含め、それぞれに 21 日 * 変数の数だけ遅れさせました。これで良いモデルが得られましたが、より良い反復プロセスが必要だと思います。

モデルに 12 個の変数/各変数のラグを含めるように制限すると、24 個のループについて話していることになります。これらのループ内には同じ反復が多数ありますが、これは時間がかかり、ばかげていると思います。この問題を回避する方法があるかもしれません。

私は SAS でのコーディングに慣れていません。私はVBAの経験が豊富です。

私のコードは以下に切り取られています。これを別の方法で行う方法があれば、本当に感謝しています! 配列などを使用することは可能かもしれませんが、私はSASプログラミングに慣れていないので、これらすべてを行う方法に光を当てることができるかもしれません:)

%macro Selectvariables;
   %let y = 0;
   %let z = 2;
   %do a = 1 %to &z;
      %do b = 1 %to &z;
          %do c = 1 %to &z;
             %do d = 1 %to &z;
                %do e = 1 %to &z;
                   %do f = 1 %to &z;
                      %do g = 1 %to &z;
                         %do h = 1 %to &z;
                            %do i = 1 %to &z;
                               %do j = 1 %to &z;
                                  %do k = 1 %to &z;
                                     %do l = 1 %to &z;
                                        %do m = 1 %to &z;
                                           %do n = 1 %to &z;
                                              %do o = 1 %to &z;
                                                 %do p = 1 %to &z;
                                                    %do q = 1 %to &z;
                                                       %do r = 1 %to &z;
                                                          %do s = 1 %to &z;
                                                             %do t = 1 %to &z;
                                                                %do u = 1 %to &z;
                                                                   %do v = 1 %to &z;
                                                                      %do w = 1 %to &z;
                                                                         %do x = 1 %to &z;
                                                                            %let First_Spot_var = Spotlag_&a;
                                                                            %let Second_Spot_var = Spotlag_&b;
                                                                            %let Third_Spot_var = Spotlag_&c;
                                                                            %let Fourth_Spot_var = Spotlag_&d;
                                                                            %let Fifth_Spot_var = Spotlag_&e;
                                                                            %let Sixth_Spot_var = Spotlag_&f;
                                                                            %let Seventh_Spot_var = Spotlag_&g;
                                                                            %let Eighth_Spot_var = Spotlag_&h;
                                                                            %let Nine_Spot_var = Spotlag_&i;
                                                                            %let Tenth_Spot_var = Spotlag_&j;
                                                                            %let Eleventh_Spot_var = Spotlag_&k;
                                                                            %let Twelveth_Spot_var = Spotlag_&l;
                                                                            %let First_vol_var = vollag_&m;
                                                                            %let Second_vol_var = vollag_&n;
                                                                            %let Third_vol_var = vollag_&o;
                                                                            %let Fourth_vol_var = vollag_&p;
                                                                            %let Fifth_vol_var = vollag_&q;
                                                                            %let Sixth_vol_var = vollag_&r;
                                                                            %let Seventh_vol_var = vollag_&s;
                                                                            %let Eighth_vol_var = vollag_&t;
                                                                            %let Nine_vol_var = vollag_&u;
                                                                            %let Tenth_vol_var = vollag_&v;
                                                                            %let Eleventh_vol_var = vollag_&w;
                                                                            %let Twelveth_vol_var = vollag_&x;
                                                                            %let Name = Model_&y;

                                                                            proc Logistic data=CurrencyData;
                                                                               &Name.: model Y1_Optimal_Strategy_3M = &First_Spot_var &Second_Spot_var &Third_Spot_var &Fourth_Spot_var &Fifth_Spot_var &Sixth_Spot_var &Seventh_Spot_var &Eighth_Spot_var &Nine_Spot_var &Tenth_Spot_var &Eleventh_Spot_var &Twelveth_Spot_var &First_vol_var &Second_vol_var &Third_vol_var &Fourth_vol_var &Fifth_vol_var &Sixth_vol_var &Seventh_vol_var &Eighth_vol_var &Nine_vol_var &Tenth_vol_var &Eleventh_vol_var &Twelveth_vol_var;
                                                                               ods output FitStatistics=AIC_&Name(where=(criterion="AIC"));
                                                                            run;
                                                                            %let y = %Eval(&y+1);
                                                                         %end;
                                                                      %end;
                                                                   %end;
                                                                %end;
                                                             %end;
                                                          %end;
                                                       %end;
                                                    %end;
                                                 %end;
                                              %end;
                                           %end;
                                        %end;
                                     %end;
                                  %end;
                               %end;
                            %end;
                         %end;
                      %end;
                   %end;
                %end;
             %end;
          %end;
       %end;
    %end;

    data AllAIC;
       set AIC_: INDSNAME=modelVars;
       dsname = scan(modelVars, 2);
    run;
    proc sort data=AllAIC out=allAIC_Sorted;
       by InterceptAndCovariates;
    run;
    proc Print; run;
%mend;

クレイジーなワイドコードで申し訳ありません。あなたが私を助けてくれることを願っています。多分私は問題を過度に複雑にしています。:)

どうもありがとう。敬具、クリスチャン

編集:z = 2テスト目的で設定しました。理想的には、これはかなり高くなります。

4

1 に答える 1

0

これを行う最善の方法があるかどうかはわかりません。これは、統計学者が長い間直面してきた問題です。

PROC LOGISTIC で利用可能な自動変数選択アルゴリズムに目を通す必要があります。

https://support.sas.com/documentation/cdl/en/statug/68162/HTML/default/viewer.htm#statug_logistic_syntax22.htm

インストール済みで、十分な RAM を備えたマルチコア マシンを使用している場合は、PROC HPLOGISTIC の方がおそらく選択が高速です。

https://support.sas.com/documentation/cdl/en/statug/68162/HTML/default/viewer.htm#statug_hplogistic_toc.htm

Cross Validated (StackExchange for Statistics) を調べて、各選択方法の長所と短所を調べることをお勧めします。

https://stats.stackexchange.com/

于 2016-04-12T14:30:27.973 に答える