【问题标题】:SAS: proc reg and macroSAS:proc reg 和宏
【发布时间】:2019-02-05 13:37:47
【问题描述】:

我有一个包含 30 个变量和 2000 个观察值的数据。 我想在循环中计算回归,在每个步骤中我删除数据中的 i 行。 所以最后我需要我的输出将是 2001 regrsion,一个用于在每次删除一行时对所有数据 end 2000 的 regrsion。

我是 sas 的新手,我想知道如何用宏来做,但我不明白。

任何 cmets 和帮助将不胜感激!

【问题讨论】:

标签: sas sas-macro


【解决方案1】:
DATA NEW;
  DATA OLD;
  do i = 1 to 2001;
    IF _N_ ^= i THEN group=i;
    else group=.;
    output;
  end;
proc sort data=new;
  by group;
proc reg syntax;
  by group;
run;

这将创建一个更长的数据集。您只会调用一次 proc reg,但它将运行 2001 模型。

仅将 2001 年回归输出作为输出进行检查是很困难的。您可能需要阅读 PROC REG 支持文档并查看您感兴趣的任何输出类型的输出选项。SAS 可以使用 GROUP 列创建数据集以区分结果。

我根据@data null 的建议编辑了我的原始答案。我同意上述方法可能更快,尽管我不相信它会快 100 倍。我对 proc reg 的开销成本与 group by 语句和更大数据集的成本知之甚少。不管上面的答案是更简单的编程。这是我原来的答案/替代方法。

您可以在宏程序中执行此操作。它将具有以下一般结构:

%macro regress;
  %do i=1 %to 2001;
    DATA NEW;
      DATA OLD;
      IF _N_=&I THEN DELETE;
    RUN;
    proc reg syntax;
    run;
  %end;
%mend;
%regress

宏是 SAS 中的一种高级编程功能。需要宏程序才能执行 proc reg 的循环。 % 表示宏功能。 &i 是一个宏变量(& 是被调用的宏变量的前缀)。宏在以 %macro / %mend 开头和结尾的块中创建,并由 %regress 调用。

仅将 2001 年回归输出作为输出进行检查是很困难的。您可能需要阅读 PROC REG 支持文档并查看您感兴趣的任何类型的输出的输出选项。每次使用 &i 创建不同的数据集,然后作为宏循环的一部分附加在一起。

【讨论】:

  • 你不想那样做。为每个 _N_=&I 删除的组创建一个包含 BY 变量的数据集。然后运行 ​​PROC BY GROUP;它会快大约 100 倍,甚至快 2000 倍。
【解决方案2】:

这将创建我在对 Chris 的评论中谈到的数据集。

data del1V /view=del1v;
   length group _obs_ 8;
   set sashelp.class nobs=nobs;
   _obs_ = _n_;
   group=0;
   output;
   do group=1 to nobs;
      if group eq _n_ then;
      else output;
      end;
   run;
proc sort out=analysis;
   by group;
   run;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多