Formel implementieren

Hallo! Habe ein Problem folgende Formel in SAS BASE zu implementieren (am liebsten ohne arrays):

me(u)= ( sum(von 1 bis n)(Xi-u)*ind{Xi>u} ) / ( sum(von 1 bis n) ind{Xi>u} )

wobei X1 <= u <= Xn und

ind{Xi>u}=1 wenn Xi>u und =0 wenn Xi<=u ist.

Ich habe zwei Datensätze dat und dat2, wobei die Zahlen gleich und aufsteigend sortiert sind. dat und dat2 enthalten jeweils eine Variable u bzw. X und n Beobachtungen
Hier ist meine Programmcode, die aber falsch ist.

data MeanExcess (keep=me);
do i=1 to nobs;
set dat point=i nobs=nobs;
summe=0;
ind=0;
do j=0 to nobs;
set dat2 point=j nobs=nobs;
ind+(X-u>0);
summe+(X-u)*(X-u>0);
end;
stop;
if ind^=0 then me=summe/ind;
else me=0;
output;
end;
stop;
run;

Ich kann mein Fehler nicht finden und wäre für jede Hilfe dankbar!
Liebe Grüsse, Anna.

Hallo Anna, wenn ich das

Hallo Anna,

wenn ich das richtig verstanden habe, willst du x aus dat2 mit jedem u aus dat1 verarbeiten. Wenn u < x dann soll der Zähler ind hochgezählt werden und die Differenz von u und x soll summiert werden. Wenn es Datensätze gibt, wo gilt u < x ist dann soll der Mittelwert aus den summierten Differenzen gebildet werden, ansonsten soll das Ergebnis 0 sein.

data MeanExcess (keep = ME);
set Dat1 (keep = U);
Ind = 0;
Summe = 0;
do J = 1 to Anz;
set Dat2 (keep = X) point = J nobs = Anz;
if X > U then do;
Ind + 1;
Summe + (X - U);
end;
end;
if Ind then ME = Summe / Ind;
else ME = 0;
run;

Dat1 läuft sowieso für jede Zeile einmal durch. Du brauchst also keinen extra Zeiger für Dat1.
Der Zeiger für Dat2 muss bei 1 anfangen.
Die Bedingung x > u muss nur einmal abgefragt werden.
Die "stop" Zeilen in deinem Code beenden das Programm vor der ersten Ergebnisausgabe.

Schöne Grüße

Jan

Hallo,Jan! Vielen Dank, ich

Hallo,Jan! Vielen Dank, ich werd's morgen ausprobieren, und hoffe ,es klappt!
Liebe Grüße
Anna

Hallo Anna, habe ich es

Hallo Anna,

habe ich es richtig verstanden, dass dat und dat2, den gleichen Inhalt haben und dass u konstant ist?
Falls nicht, macht das hier keinen Sinn, falls doch ist es nicht nötig mit set und point zu jonglieren:

data dat;
input X U;
cards;
1 5
2 5
3 5
4 5
5 5
6 5
7 5
8 5
9 5
;
run;

data lala;
set dat end=last;
zaehler+(x-u)*(x>u);
nenner+(x>u);
if nenner > 0 then
me=zaehler/nenner;
*if last then output;
run;

Bei Bedarf erkläre ich den Code, vorausgesetzt das Ergebnis ist richtig.

Viele Grüße
Simon

nicht ganz

Hallo, Simon!
Vielen vilen Dank für deine Antwort.
u ist nicht konstant,genau das is das Problem. u durchläuft alle X von X1 bis Xn (bei mir: äußere Schleife). Ich habe es mit set, point und dat,dat2 mit dem gleichen Inhalt versucht. Leider krieg ich's alleine nicht hin...
Viele Grüße
Anna