SAS:proc reg和宏

SAS:proc reg和宏,sas,sas-macro,Sas,Sas Macro,我有一个包含30个变量和2000个观察值的数据。 我想在循环中计算回归,在每一步中我都会删除数据中的I行。 所以最后我需要的是,我的输出将是2001年的重新统计,每次我删除一行,在2000年年底的所有数据上的重新统计 我是sas的新手,我想知道如何使用E宏,但我不明白 任何意见和帮助将不胜感激 DATA NEW; DATA OLD; do i = 1 to 2001; IF _N_ ^= i THEN group=i; else group=.; output;

我有一个包含30个变量和2000个观察值的数据。 我想在循环中计算回归,在每一步中我都会删除数据中的I行。 所以最后我需要的是,我的输出将是2001年的重新统计,每次我删除一行,在2000年年底的所有数据上的重新统计

我是sas的新手,我想知道如何使用E宏,但我不明白

任何意见和帮助将不胜感激

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开始和结束的块中创建的,并由%reg退调用


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

这将创建我在给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;

欢迎使用StackOverflow,您建议阅读本文并修改您的问题,以帮助用户了解您的问题。这称为jackknife估算,不必考虑。如果你有SAS/IML,你可以使用这里的代码,否则这里会有一个jackknife和bootstrap宏:如果你需要参考,大卫·卡塞尔(David Cassell)写的一篇非常好的论文《不要胡闹》(Don't be Loopy)值得一读。它非常有用。你不想那样做。为每个_N_=&I已删除的组创建一个带有BY变量的数据集。然后分组运行PROC;它将快100倍,甚至可能快2000倍。