温馨提示:本文翻译自stackoverflow.com,查看原文请点击:其他 - SAS-identifying three preceding years
sas

其他 - SAS识别前三年

发布于 2020-04-11 00:11:26

我使用以下代码来识别和输出前三年。为了提供更多详细信息,该样本包括多个Person ID,并且每个Person ID都有多年的观测值。最终样本将仅保留至少具有前三年(例如2001 2002 2003)的人员ID。

data have3 ;
  set have2;
  by personid;
  set have2 ( firstobs = 2 keep = year rename = (year = _year2) )

      have2 (      obs = 1 drop = _all_                        );

  _year2 = ifn(  last.personid, (.), _year2 ); /*output the value of next year*/

  set have2 ( firstobs = 3 keep = year rename = (year = _year3) )

      have2 (      obs = 2 drop = _all_                        );

  _year3 = ifn(  last.personid, (.), _year3 );  /*output the value of the year after the next year*/

  _prev1 = ifn( first.personid, (.), lag(year) ); /*output the value of previous year*/

  _prev2 = ifn( first.personid, (.), lag2(year) );/*output the value of the year before the previous year*/


  if (year-2 eq _prev1-1 eq _prev2) or

     (year+2 eq _year2+1 eq _year3) or

     (year eq _year2-1 eq _prev1+1) then output;

run;

此代码在大多数情况下都很好。但是,我的示例有一些棘手的情况。下图显示了一种情况。人员ID 488仅具有两个观察值(1994年和1995年)。不幸的是,下一个Person ID 489的第一年是1996年。因此,使ID488 Year1994的_year3是1996年year+2 eq _year2+1 eq _year3结果,ID488 Year1994也输出到最终样本。如何改进代码以避免这种情况?谢谢!

在此处输入图片说明

查看更多

提问者
Neal801
被浏览
32
Tom 2020-02-02 11:24

只将id变量也保留在您的SET语句中可能会更容易。

set have2(firstobs=2 keep=personid year rename=(personid=personid2 year=_year2))...
set have2(firstobs=3 keep=personid year rename=(personid=personid3 year=_year3))...

然后,您可以确保下一个和下一个下一个记录实际上是相同的PERSONID。

if personid ne personid2 then _year2=.;
if personid ne personid3 then _year3=.;

您的回溯变量也一样。

_prev1=lag(year);
_prev2=lag2(year);
if personid ne lag(personid) then _prev1=.;
if personid ne lag2(personid) then _prev2=.;