首页 > 解决方案 > 通过 SAS 中的循环产生多个滞后?

问题描述

我正在尝试为变量生成 20 个滞后。为了生成第一个延迟,我使用以下语句:

data temp.data2;

    set temp.data1;
    by gvkey fyear; 
    lag1 =   ifn(gvkey=lag(gvkey) and fyear=lag(fyear)+1,lag(mv),.);
    lag2 =   ifn(gvkey=lag(gvkey) and fyear=lag(fyear)+1,lag(lag1),.); 
    etc.

run; 

不想重复20次。有没有办法通过循环来做到这一点?

非常感谢!

标签: sas

解决方案


您必须维护自己的mv值数组并从中分配滞后值。该数组将为处理的每一行冒泡,并在fyear组开始时重置。

例子:

data have; 
  do gvkey = 1 to 5;
    do fyear = 1 to 5;
      do day = 1 to ifn(fyear=3, 10, 30);
        mv = 366-day;
        output;
      end;
    end;
  end;
run;

data want;
  set have;
  by gvkey fyear;

  array mvs(20) _temporary_;
  array lags(20) lag1-lag20;

  if first.fyear then call missing(of mvs(*));

  * assign lags;
  do _n_ = 1 to dim(lags);
    lags(_n_) = mvs(_n_);
  end;

  * bubble mvs;
  do _n_ = dim(lags) to 2 by -1;
    mvs(_n_) = mvs(_n_-1);
  end;
  mvs(1) = mv;
run;

推荐阅读