首页 > 解决方案 > SAS 识别前三年

问题描述

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

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 也输出到最终样本。我该如何改进代码以避免这种情况?谢谢!

在此处输入图像描述

标签: sas

解决方案


将 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=.;

推荐阅读