Schleifen (Zählen bis bedingung erreicht)

Alles rund um SPSS Syntax und Programmierung.

Schleifen (Zählen bis bedingung erreicht)

Beitragvon tiukas » Mo 8. Mai 2017, 13:04

Hallo allerseits,

für einen Index den ich berechnen muss, muss ich einen bestimmten Rang eines Falles finden.

In diesem Fall, den Rang des Falles an dem eine Summe einen bestimmten Wert erreicht hat.

In einer normalen Programmiersprache würde ich einfach eine for Schleife verwenden (als Endlosschleife) und diese dann abbrechen, wenn die gewünschte Bedingung erreicht ist).
Code: Alles auswählen
for (i=1,,i++)
{
compute counter=counter+irbg.
break if (counter >=(irbg_C-AUSG_C)
}


counter wäre hier in dem Beispiel meine Hilfsvariable und i die Variable die ich eigentlich will.
Weiß jemand wie man das mit der SPSS syntax umsetzen kann?
tiukas
 
Beiträge: 24
Registriert: Do 2. Mär 2017, 14:41
Danke gegeben: 1
Danke bekommen: 1 mal in 1 Post

Re: Schleifen (Zählen bis bedingung erreicht)

Beitragvon tiukas » Mo 8. Mai 2017, 13:44

So, ich habe mich noch mal tiefer eingefuchst. Es gibt schleifen, allerdings gibt es immer noch ein Problem. Wie kann man mit dem compute Befehl einen bestimmten fall ansteuern?

Mein bisheriger Code:
Code: Alles auswählen
compute counter=0.
compute AUSG_N1=0.
execute.


Loop.
compute AUSG_N1=AUSG_N1+1.
compute counter[CASE=AUSG_N1]=counter[b][CASE=AUSG_N1-1][/b]+irbg.
End loop if (counter >= irbg_C-AUSG_C).
execute.


counter[CASE=AUSG_N1] ist jetzt meine pseudo-syntax die in Variable counter den Fall mit dem Indexwert AUSG_N1 ansteuern soll. Geht das irgendwie in SPSS oder muss ich auf Excel dafür umsteigen?
tiukas
 
Beiträge: 24
Registriert: Do 2. Mär 2017, 14:41
Danke gegeben: 1
Danke bekommen: 1 mal in 1 Post

Re: Schleifen (Zählen bis bedingung erreicht)

Beitragvon tiukas » Mo 8. Mai 2017, 14:17

So etwas weiter gearbeitet. Und ich habe einen workaround gefunden, der allerdings immer noch mit Problemen behaftet ist.

Code: Alles auswählen
if($casenum = 1) AUSG_N1=1.
if($casenum = 1) SUMVAR=irbg.
execute.

select if(JAHR=2015).
Loop.
if (sysmis(AUSG_N1)) AUSG_N1=LAG(AUSG_N1)+1.
if(sysmis(SUMVAR)) SUMVAR=LAG(SUMVAR)+irbg.
End loop if (SUMVAR >= irbg_C-AUSG_C).
execute.

Mithilfe der LAG() funktion kann man die vorige Variable ansprechen und die if() funktion spricht immer einen Fall nach dem nächsten an.

Mit $casenum=n kann man einen speziellen Fall ansprechen.

Das Problem das jetzt noch bleibt ist, dass SPSS die End loop Bedingung nicht ausführt sondern einfach alle Fälle durchrattert. Hat jemand eine Ahnung woran das liegt und wie man das Problem umgehen kann? Abgesehen davon beißt sich LAG() mit temporary Befehlen, was ziemlich scheisse für größere Datensätze ist.
tiukas
 
Beiträge: 24
Registriert: Do 2. Mär 2017, 14:41
Danke gegeben: 1
Danke bekommen: 1 mal in 1 Post

Re: Schleifen (Zählen bis bedingung erreicht)

Beitragvon tiukas » Di 9. Mai 2017, 10:32

Wie es sich herausgestellt hat wird die loop struktur hier gar nicht benötigt. Der if Befehl enthält bereits die gewünschte Schleife.

Code: Alles auswählen
f($casenum = 1) AUSG_N1=1.
if($casenum = 1) SUMVAR=irbg.
compute AUSREST_C=irbg_C-AUSG_C.
execute.

if (sysmis(AUSG_N1) and LAG(SUMVAR)<AUSREST_C) AUSG_N1=LAG(AUSG_N1)+1.
if(sysmis(SUMVAR) and LAG(SUMVAR)<AUSREST_C) SUMVAR=LAG(SUMVAR)+irbg.
execute.

SPSS Syntax ist ech der Horror. Da muss man auch erst mal drauf kommen, dass der if Befehl als Schleife alle Fälle durchrattert und sie auf Bedingungen testet anstatt einfach generell eine Bedingung zu testen.
tiukas
 
Beiträge: 24
Registriert: Do 2. Mär 2017, 14:41
Danke gegeben: 1
Danke bekommen: 1 mal in 1 Post


Zurück zu SPSS Syntax

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste

cron