2016-05-10 11 views
0

Ich habe eine Zeitreihe von Niederschlagsdaten für 30 Jahre (Jahre) für viele Stationen (ignem). Jedes Jahr hat einen Wert für einen halben Monat Schritt wie folgt aus:sas lokale maximale Zeitreihe

idgem Jahr jan1 Jan2 FEB1 feb2 ... Dec 1. Dezember 2
1 1960 20 22 25 10 ... 32 30
1 1961 22 25 30 20 ... 30 25

[! [Beispieldaten] [1]] [1]

Jetzt mag ich die lokalen Maxima in der Art und Weise, um herauszufinden, dass die Werte gehalten werden, wenn sie größer sind als das vorherige und das nächste. Ich habe versucht, es wie diese

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; 

ich immer eine Fehlermeldung „Array Index außerhalb des zulässigen Bereichs “ erhalten.

Irgendwelche Ideen, wie ich SAS sagen kann, mit dem vorherigen und nächsten Wert zu vergleichen und den verglichenen Wert zu behalten, wenn es größer ist? Und wie vergleiche ich den Wert von Jan1 1961 bis Dec2 1960?

[1]: https://i.stack.imgur.com/CId0x.gif
Ich habe Hilfe und jetzt habe ich diese Lösung

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; 


mit dem LOG FUNKTION i jan1 mit dem Wert dec2 von der vorherige Beobachtung vergleichen. aber wie kann ich dec2 mit jan1 der folgenden beobachtung vergleichen? irgendwelche Ideen?

+0

Also stellt die Variable JAN1 Daten am 1. des Monats dar und JAN2 repräsentieren Daten am 15.? Was ist mit Feb2? Sie sollten Ihre Daten wahrscheinlich in eine Zeile pro Wert konvertieren und das Datum aus dem Variablennamen in eine tatsächliche Variable verschieben. – Tom

+0

hey, die Werte stellen kumulative Niederschläge für die erste und die zweite Hälfte des Monats dar. Ich habe meine Lösung so weit oben hinzugefügt, ein kleines Problem übrig :-) –

Antwort

0

So können Sie einfach die LAG() Funktion verwenden, um die vorherige Version des letzten Elements (DEC2) zu finden und eine "Lead" -Technik zu verwenden, um die nächste Version des ersten Elements zu erhalten. So kann Ihr MAXI-Array nun mit 26 Elementen erstellt werden und das neue LOCAL-Maximum-Array wird über 24 Elemente verfügen. Dies verhindert eine Indizierung außerhalb der Array-Grenzen.

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;