如何在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的许可,否则我很确定您需要一个宏解决方案。您能给我写一个示例代码吗。这真的很有帮助。关于多次重复过程的部分正好包含了回归重复所需的代码。