sas局部最大时间序列

时间:2016-05-10 14:02:50

标签: time statistics sas series

对于很多电台(idgem),我有30年(jahre)的时间序列的降水数据。每年有一个半月步骤的价值如下:

  

idgem year jan1 jan2 feb1 feb2 ... dec 1 dec 2
  1 1960 20 22 25 10 ... 32 30
  1 1961 22 25 30 20 ... 30 25

[![示例数据] [1]] [1]

现在我想以保存值的方式找出局部最大值,如果它们大于前一个和下一个。我试过这样的

data test3;
set test2;
 array maxi [24] jan1 jan2 feb1 feb2 mar1 mar2 apr1 apr2 may1 may2 jun1 
                jun2 jul1 jul2 aug1 aug2 sep1 sep2 oct1 oct2 nov1 nov2 dec1 dec2;
 do i=1 to 24;
 if maxi [i-1] < maxi [i]> maxi [i+1] then maxi [i] = maxi [i];
 else maxi [i]=.;
end;
run;

我总是收到错误消息“数组下标超出范围 ”

任何想法如何告诉SAS与上一个和下一个值进行比较并保持比较值(如果它更大)?我如何比较1961年的jan1和1960年的dec2的值?

[1]:https://i.stack.imgur.com/CId0x.gif我得到了帮助,现在我有了这个解决方案

data test3;
 set test2;
  array local [24]; 
  do _n_ = 1 to 24;
  local[_n_] = "" ;
 end;
 array maxi [24] jan1 jan2 feb1 feb2 mar1 mar2 apr1 apr2 may1 may2 jun1 
      jun2 jul1 jul2 aug1 aug2 sep1 sep2 oct1 oct2 nov1 nov2 dec1 dec2;
 do _n_ = 2 to 23;
  if (maxi [_n_-1] < maxi [_n_]) and (maxi [_n_]> maxi [_n_+1]) then 
   local [_n_] = maxi [_n_];
  if maxi [_n_] = maxi [_n_-1] then local [_n_] = maxi [_n_];
  if maxi [_n_] = maxi [_n_+1] then local [_n_] = maxi [_n_];
 end;
 do _n_ = 1; 
  if (maxi [_n_] > maxi [_n_+1]) and (maxi [_n_] > lag(dec2)) then local 
    [_n_] = maxi [_n_];
  if (maxi [_n_] = maxi [_n_+1]) and (maxi [_n_] = lag(dec2)) then local 
    [_n_] = maxi [_n_];
 end;
 do _n_ = 24; ???
run;


使用LOG FUNKTION,我可以将jan1与前一次观察的值dec2进行比较。但是如何将dec2与以下观察的jan1进行比较? 任何想法?

1 个答案:

答案 0 :(得分:0)

因此,您可以使用LAG()函数查找最后一个元素(DEC2)的先前版本,并使用“lead”技术获取第一个元素的下一个版本。所以你的MAXI阵列现在可以用26个元素制作,新的LOCAL最大阵列将有24个元素。这将阻止在数组边界之外进行索引。

data test3;
  set test2;
  set test2 (firstobs=2 keep=jan1 rename=(jan1=next)) test2(obs=1 drop=_all_);
  array local [24]; 
  previous = lag(dec2);
  array maxi 
    previous
    jan1 jan2 feb1 feb2 mar1 mar2 apr1 apr2 may1 may2 jun1 jun2 
    jul1 jul2 aug1 aug2 sep1 sep2 oct1 oct2 nov1 nov2 dec1 dec2
    next
  ;
  do i=1 to dim(local);
    local(i)= max(maxi(i),maxi(i+1),maxi(i+2));
  end;
  drop i;
run;