SAS 9.4中使用PROC LOGIT和时间序列数据

时间:2016-04-12 13:58:49

标签: sas regression mlogit

我想找到具有多项分布的因变量的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设置为测试目的。理想情况下,这会高得多。

1 个答案:

答案 0 :(得分: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/