我的数据集看起来像这样
eom_stock_id stock_return benchmark_return
201301X 0.98 0.99
201302X 1.03 1.01
201303X 1.03 1
201301Y 0.99 0.99
201302Y 0.99 1.01
201303Y 1.02 1
对于每个stock_return基准_return我必须执行一个操作,如stock_return(1)* stock_return(2)-benchmark_return(1)* benchmark_return(2)
即。 0.98 * 1.03-0.99 * 1.01。
请帮助我如何使用do循环来完成它。我必须使用do loop将其引用到每秒一次的观察
答案 0 :(得分:0)
我认为您只需要LAG()
上一行的值。
让我们使用数据步骤来创建您的数据,但不要将月份值与棒ID混合,而是将它们作为两个单独的变量。然后我们可以使用BY处理来判断新库存何时开始。
data have ;
input month $6. stock_id $ stock_return benchmark_return ;
cards;
201301X 0.98 0.99
201302X 1.03 1.01
201303X 1.03 1
201301Y 0.99 0.99
201302Y 0.99 1.01
201303Y 1.02 1
;;;;
现在要创建新变量,您只需要使用您的公式,但是您需要确保在第一次观察时不要这样做,因为滞后值是针对不同的库存。
data want ;
set have ;
by stock_id month;
new = lag(stock_return)*stock_return-lag(benchmark_return)*benchmark_return;
if first.stock_id then new=.;
run;
请注意,您不希望将LAG()
函数调用放在条件内。 LAG()
实际上从先前执行的函数中提取值,而不是从先前的观察中提取。因此,如果在每次观察时跳过执行它,返回的值将不是前一次观察的值。