Lag in Loop -> Fehler meldung

Alles rund um SPSS Syntax und Programmierung.

Lag in Loop -> Fehler meldung

Beitragvon hugo » Mi 4. Apr 2012, 14:19

Kann mir jemand erklären, wieso in nachfolgendem Code die Zeile mit "COMPUTE VAR3" einen Fehler wirft, bzw. wie sich das beheben lässt?

Wie man am Ergebnis con "COMPUTE VAR4" sieht, ist der Wert von #i = 1.
Damit sollte die Zuweisung nach "COMPUTE VAR3" zur Laufzeit gleich der Zuweisung nach "COMPUTE VAR2" sein - und die läuft...

Code: Alles auswählen
DATA LIST FREE / VAR1 (F1.0).
BEGIN DATA
1
2
3
4
5
END DATA.
EXECUTE.

COMPUTE VAR2 = LAG(VAR1,1).

LOOP #i = 1 TO 1.
COMPUTE VAR3 = LAG(VAR1,#i).
COMPUTE VAR4 = #i.
END LOOP.
EXECUTE.
hugo
 
Beiträge: 5
Registriert: Mi 4. Apr 2012, 14:09
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post

Re: Lag in Loop -> Fehler meldung

Beitragvon strukturmarionette » Do 5. Apr 2012, 12:22

Hi,

wie lautet die Fehlermeldung denn?



S.
strukturmarionette
 
Beiträge: 2504
Registriert: Sa 1. Okt 2011, 17:20
Danke gegeben: 7
Danke bekommen: 122 mal in 122 Posts

Re: Lag in Loop -> Fehler meldung

Beitragvon hugo » Do 5. Apr 2012, 14:23

>Fehler Nr. 4316 in Spalte 24. Text: i
>Die Anzahl der Fälle in der Funktion LAG ist ungültig. Es muss eine positive,
>ganzzahlige Konstante ungleich null sein.
>Die Ausführung dieses Befehls wurde unterbrochen.
hugo
 
Beiträge: 5
Registriert: Mi 4. Apr 2012, 14:09
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post

Re: Lag in Loop -> Fehler meldung

Beitragvon hugo » Do 5. Apr 2012, 14:30

Vielleicht erkläre ich auch, wegen welcher Aufgabenstellung ich die lag-Funktion in einer Schleife verwenden will.
Vielleicht gibt es da ja eine geschicktere Vorgehensweise

Ich habe eine Datenstruktur dieser Art


ID TRX-DATE Amount
1 2010-01-01 51
1 2010-04-02 33
1 2010-08-03 11
1 2011-01-04 32
1 2011-10-05 54
1 2011-11-01 33
1 2012-12-02 22
2 2010-08-03 33
2 2010-09-04 55
2 2010-10-05 63
2 2011-11-01 43
2 2012-10-02 34
2 2012-11-03 43
2 2012-12-04 53

Dieser Tabelle müssten nun Variablen hinzugefügt werden die aus den vorangegangenen Zeilen der jeweiligen ID generiert werden.

Z.B.
- erstes TRX-DATE der gleichen ID innerhalb eines 360Tageszeitraums vor dem aktuellen TRX-DATE (dem TRX-DATE dieser Zeile)
- Durchschnitt von Amount innerhalb eines 90Tageszeitraums vor dem aktuellen TRX-DATE (dem TRX-DATE dieser Zeile) für diese ID.


Mein Ansatz wäre - da die Daten nach ID und TRX-Date sortiert sind - mittels einer zeilenweise auszuführenden Schleife immer weiter zurückzugehen lag(?,1), lag(?,2) usw. und die 90 bzw 360 in eine Abbruchbedingung zu packen.
    hugo
     
    Beiträge: 5
    Registriert: Mi 4. Apr 2012, 14:09
    Danke gegeben: 0
    Danke bekommen: 0 mal in 0 Post

    Re: Lag in Loop -> Fehler meldung

    Beitragvon hugo » Do 5. Apr 2012, 18:04

    Das scheint ein Forum für Selbstgespräche zu sein...

    Anyway - ich habe inzwischen herausgefunden, daß man mit der Zählvariable einer Repeat-Schleife den zweiten Parameter der lag()-Funktion hochzählen kann.
    Damit kann ich mein Problem lösen:

    Code: Alles auswählen
    DO REPEAT i = 1 TO 404.

    DO IF LAG(ID,i) = ID AND XDATE.TDAY(TRX_DATE) -  XDATE.TDAY(LAG(TRX_DATE,i)) <= 360.

       COMPUTE DAUER_SEIT_ERSTER_TRX_IN_360_TAGEN = 
          XDATE.TDAY(TRX_DATE) - DATE.TDAY(LAG(TRX_DATE,i)).

    END IF.
    END REPEAT.
    EXECUTE.


    Allerdings ist das ausgesprochen Ineffizient.
    Wegen dem Ausnahmefall, daß ich für eine ID 404 Transaktionen in den Daten habe wird nun für jede Zeile 404 mal die Schleife durchlaufen.
    Verbesserungsvorschläge sind herzlich willkommen.
    hugo
     
    Beiträge: 5
    Registriert: Mi 4. Apr 2012, 14:09
    Danke gegeben: 0
    Danke bekommen: 0 mal in 0 Post

    Re: Lag in Loop -> Fehler meldung

    Beitragvon strukturmarionette » Do 5. Apr 2012, 18:17

    Hi,

    Z.B.
    - erstes TRX-DATE der gleichen ID innerhalb eines 360Tageszeitraums vor dem aktuellen TRX-DATE (dem TRX-DATE dieser Zeile)
    - Durchschnitt von Amount innerhalb eines 90Tageszeitraums vor dem aktuellen TRX-DATE (dem TRX-DATE dieser Zeile) für diese ID.


    Wie kann das funktionieren, wenn du beispielsweise für den ersten (bis 360ten) sortierten Datensatz eine dieser neuen Vars generieren willst?

    S.
    strukturmarionette
     
    Beiträge: 2504
    Registriert: Sa 1. Okt 2011, 17:20
    Danke gegeben: 7
    Danke bekommen: 122 mal in 122 Posts

    Re: Lag in Loop -> Fehler meldung

    Beitragvon hugo » Do 12. Apr 2012, 10:10

    Ich denke genau das tut der code.

    (1) Die Do Repeat Schleife läuft für jeden Datensatz in der Tabelle 404 mal. (DO REPEAT i = 1 TO 404.)
    (2) prüft ob der vorangegangene Datensatz zur gleichen ID gehört (DO IF LAG(ID,i) = ID)
    (3) prüft ob der vorangegangene Datensatz im 360-Tages_zeitraum liegt (XDATE.TDAY(TRX_DATE) - XDATE.TDAY(LAG(TRX_DATE,i)) <= 360)
    (4) und führt ggf eine Zuweisung aus (Compute...) so daß aufgrund der Sortierung das Compute statement zuletzt mit dem frühesten Datum im vorangegangenen 360-Tageszeitraum gelaufen ist.

    Daß die Schleife bis 404 zählt liegt daran, daß es eine id in der Tabelle mit 404 Einträgen (unterschiedliche trx-date gibt).
    Für alle Ids die Schleife 404 mal zu durchlaufen ist natürlich völlig unperformant, denn die meisten Id haben deutlich weniger Einträge.
    Wenn die Bedingung (2) nicht erfüllt ist könnte die Schleife für diesen Datensatz abgebrochen werden.

    Genau da weiß ich nicht wie das gehen soll. Ein Break-Statement o.ä gibt es m. W. bei Do-Repeat nicht
    Eine Kopf/Fußgesteuerte Schleife statt der Zählschleife wäre eine andere Möglichkeit aber dann kann der Zähler von Loop nicht als Parameter der Lag-Funktion verwendet werden (Ausgangsproblem).
    hugo
     
    Beiträge: 5
    Registriert: Mi 4. Apr 2012, 14:09
    Danke gegeben: 0
    Danke bekommen: 0 mal in 0 Post


    Zurück zu SPSS Syntax

    Wer ist online?

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