Formel implementieren
Verfasst von aloe78 am 19 Dezember, 2009 - 18:21
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;
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.
»
- Anmelden oder Registrieren um Kommentare zu schreiben

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.
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:
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