0

我想为具有多项分布的因变量的 Logit 回归找到最佳模型规范。Y 有三个结果,我想制作一个包含 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 回答