对于很多电台(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进行比较?
任何想法?
答案 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;