计算最近 x 年的平均值

Calculate average of the last x years

我有以下数据

Date         value_idx
2002-01-31    .
2002-01-31   24.533
2002-01-31   26.50
2018-02-28   25.2124
2019-09-12   22.251
2019-01-31   24.214
2019-05-21   25.241
2019-05-21    .
2020-05-21   25.241
2020-05-21   23.232

我需要计算过去 3 年和 7 年的 value_idx 的平均值。 我先尝试计算如下:

proc sql;
create table table1 as
select date, avg(value_idx) as avg_value_idx
from table
group by date;
quit;

问题是我不知道如何计算 value_idx 的平均值,不是每个月而是过去两年的平均值。所以我认为我应该提取年份,按年份分组,然后计算平均值。 我希望你们中有人能帮助我。

在 SAS 中执行此类操作的最佳方法是使用本机 PROC,因为它们具有很多与分组相关的功能。

在这种情况下,我们使用多标签格式来控制分组。我假设您指的是 2018/2019/2020 日历中的 'Last Three Years' 和 2014-2020 日历中的 'Last Seven Years'。大概您可以看到如何针对其他时间段修改它 - 只要您不尝试使时间段相对于每个数据点。

我们创建了一种格式,它使用 MULTILABEL 选项(允许数据点属于多个类别)和 NOTSORTED 选项(允许我们强制对标签进行排序,否则七早于三)。

然后,我们在 PROC TABULATE 中使用它,使用 MLF(多标签格式)和 preloadfmt order=data 启用它,这再次保持顺序正确。这将生成仅包含两个平均值的报告。

data have;
informat date yymmdd10.;
input Date value_idx;
datalines;
2002-01-31    .
2002-01-31   24.533
2002-01-31   26.50
2017-02-28   25.2124
2017-09-12   22.251
2018-01-31   24.214
2018-05-21   25.241
2019-05-21    .
2020-05-21   25.241
2020-05-21   23.232
;;;;
run;

proc format;
  value yeartabfmt (multilabel notsorted)
    '01JAN2018'd-'31DEC2020'd = 'Last Three Years'
    '01JAN2014'd-'31DEC2020'd = 'Last Seven Years'
     other=' '
   ;
quit;

proc tabulate data=have;
  class date/mlf preloadfmt order=data;
  var value_idx;
  format date yeartabfmt.;
  tables date,value_idx*mean;
run;

您可以使用 CASE 来决定哪些记录对哪些 MEAN 有贡献。您需要澄清过去 2 年或过去 7 年的意思。此代码将找到最大日期的值,然后将该日期的年份与其他日期的年份进行比较。

select 
 mean(case when year(max_date)-year(date) < 2 then value_idx else . end) as mean_yr2 
,mean(case when year(max_date)-year(date) < 7 then value_idx else . end) as mean_yr7
from have,(select max(date) as max_date from have)
;

结果

mean_yr2  mean_yr7
------------------
 24.0358   24.2319