满足条件之前的不同数量观察值的平均值/计数

时间:2018-07-19 15:21:35

标签: sas

我有一个具有以下结构的数据集:

ID  Date&Time   var1    var2
1   1/11        1       yes
1   3/11        3       no
1   3/11        2       no
1   5/11        5       yes
1   10/11       2       no
2   3/11        0       yes
2   12/11       1       no
2   23/11       2       yes
2   24/11       0       yes
3   5/11        1       yes
3   6/11        2       no
3   8/11        5       yes
3   9/11        4       no

这是一个带有观察结果的日志文件,我的分析基于该文件。现在,我想考虑一个移动平均线,例如上周(以及月份,年份等)的所有观测值,即我想要的结构如下:

ID  Date&Time   var1    var2    week_avg    week_count
1   1/11        1       yes     .           .
1   3/11        3       no      1           1
1   3/11        2       no      2           1
1   5/11        5       yes     2           1
1   10/11       2       no      3.33        1
2   3/11        0       yes     .           .
2   12/11       1       no      .           .
2   23/11       2       yes     .           .
2   24/11       0       yes     2           1
3   5/11        1       yes     .           .
3   6/11        2       no      1           1
3   8/11        5       yes     1.5         1
3   9/11        4       no      2.66        2

是否有一种在lag循环中使用do-until函数的方法? 还是PROC EXPAND能够通过指定时间窗口而不是许多观测值来执行移动平均?

1 个答案:

答案 0 :(得分:0)

您可以通过副处理,首先创建相应的期间值:

proc sort data=have ; by id date ; run ;

data periods ;
  set have ;
  year  = put(date,year4.) ;
  month = put(date,yymmn6.) ;
  week  = put(date,weeku5.) ;
run ;

data groups ;
  set periods ;
  retain week_tot week_cnt month_tot month_cnt year_tot year_cnt 0 ;
  /* For the first value in each period, set count & total values to . */
  if first.year then call missing(of year_:) ;
  if first.month then call missing(of month_:) ;
  if first.week then call missing(of week_:) ;

  /* Increment count by 1, total by var1, calculate average */
  /* Add any conditional logic on which to increment the running values */
  week_cnt  + 1 ; week_tot  + var1 ; week_avg  = week_tot  / week_cnt ;
  month_cnt + 1 ; month_tot + var1 ; month_avg = month_tot / month_cnt ;
  year_cnt  + 1 ; year_tot  + var1 ; year_avg  = year_tot  / year_cnt ;
run ;

如果愿意,可以将以上内容抽象为宏

%MACRO PERIOD_CALC(PD) ;
  retain &PD._cnt &PD._tot ;
  if first.&PD then call missing(of &PD._:) ;
  &PD._cnt + 1 ;
  &PD._tot + var1 ;
  &PD._avg = &PD._tot / &PD._cnt ;
%MEND ;

data groups ;
  set periods ;
  %PERIOD_CALC(week) ;
  %PERIOD_CALC(month) ;
  %PERIOD_CALC(year) ;
run ;