如何在SaS中创建65个延迟,而无需复制和粘贴65次

如何在SaS中创建65个延迟,而无需复制和粘贴65次,sas,Sas,我有一个面板数据符号是我的公司名称日期和小时表示时间。我想创建多达65个滞后返回变量。我可以使用以下代码实现这个目标。然而,我必须复制和粘贴65次,这是非常混乱的。有人能告诉我如何改进代码吗 data data (drop=i count); set data; by SYMBOL DATE hour; array x(*) rlag1-rlag65; rlag1=lag1(return); rlag2=lag2(return); rlag3=lag3(return);

我有一个面板数据<代码>符号是我的公司名称<代码>日期和
小时
表示时间。我想创建多达65个滞后返回变量。我可以使用以下代码实现这个目标。然而,我必须复制和粘贴65次,这是非常混乱的。有人能告诉我如何改进代码吗

data data (drop=i count);
  set data;
  by SYMBOL DATE hour;
  array x(*) rlag1-rlag65;
  rlag1=lag1(return);
  rlag2=lag2(return);
  rlag3=lag3(return);
  rlag4=lag4(return);
  rlag5=lag5(return);
  rlag6=lag6(return);
  rlag7=lag7(return);
  rlag8=lag8(return);
  rlag9=lag9(return);
  rlag10=lag10(return);

  /* Reset COUNT at the start of each new BY-Group */
  if first.SYMBOL then count=1;

  do i=count to dim(x);
    x(i)=.;
  end;
  count + 1;
run;
我还想运行下面的回归65次。你能教我如何循环这个回归和自动更改输出文件名吗。本质上,我希望自变量的滞后应该与输出文件名称的最后/最后两位相同

proc reg data=data noprint outest=lag1;
model return = rlag1;
by DATE hour;;;
run;
quit;

您可以使用数组来实现这一点

首先获取一些样本数据,并按照我们需要的
变量对其进行排序:

proc sort data=sashelp.stocks out=have;
  by stock date;
run;
现在在一个数据步骤中,定义我们要在其中存储值的变量。还要确保我们
保留
它们,以便它们在观察中保留它们的值。我们可以通过使用
retain
语句来实现这两个目标

然后根据刚才在
retain
中定义的变量定义一个数组。该数组允许我们引用变量lag1-lag10,而无需显式键入其确切名称

在我的例子中,我想要滞后1到10。请注意,我保留了另一个名为
lag0
的变量,这是因为它有助于简化代码。我们在末尾删除这个变量

所以逻辑基本上是说,如果这是对股票的第一次观察,那么将数组中的所有值初始化为缺失。然后将当前股票收盘价的值分配给
lag0

如果它不是股票的第一个,那么从最大滞后开始(在本例中为10),为其分配下一个最早滞后的值(在本例中为9)。在整个数组中重复此操作,直到完成lag1=lag0;最后,将当前股票收盘价的值分配给
lag0

这有效地将数组中的所有值向下移动,因为我们查看了观察结果

data want;
  set have;
  by stock;

  retain lag0-lag10;

  array a[0:10] lag0-lag10; 

  if first.stock then do;
    do cnt=0 to 10;
      a[cnt] = .;
    end;
  end;
  else do;
    do cnt=10 to 1 by -1;
      a[cnt] = a[cnt-1];
    end;
  end;

  a[0] = close;

  drop lag0 cnt;

run;
对于回归,您可以循环一段sas代码,如下所示。我将把它作为一个练习留给您,让它适应您的代码

%macro reg;

  %do cnt=1 %to 10;

    data x&cnt;
      set want;
      value = lag&cnt;
    run;

  %end;

%mend;
%reg;

你有SAS ETS许可证吗?我刚用PROC SETINIT检查过;跑下面的消息显示“--SAS/ETS 2015年7月31日”,所以我想我在Autoreg程序中获得了ETSLook的许可,否则我很确定您需要一个宏解决方案。您能给我写一个示例代码吗。这真的很有帮助。关于多次重复过程的部分正好包含了回归重复所需的代码。