在SAS中每两行执行一次循环

时间:2016-04-14 19:49:27

标签: loops

我的数据集看起来像这样

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将其引用到每秒一次的观察

1 个答案:

答案 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()实际上从先前执行的函数中提取值,而不是从先前的观察中提取。因此,如果在每次观察时跳过执行它,返回的值将不是前一次观察的值。