[英]sas local maximum time series
我有很多台站(idgem)的30年(jahre)降水數據的時間序列。 每年都有一個半月的值,如下所示:
idgem年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年1月1日和1960年12月2日的值?
[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比較? 有任何想法嗎?
因此,您可以只使用LAG()
函數來找到最后一個元素(DEC2)的先前版本,並使用“領先”技術來獲取第一個元素的下一個版本。 因此,您的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;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.