Syntax für Summe über verschiedene Fälle

Fragen und Diskussionen rund um die Arbeit mit SPSS. Für allgemeine Statistik-Themen, die nicht mit SPSS zusammenhängen, bitte das Statistik-Forum nutzen.
Antworten
phanthom
Beiträge: 7
Registriert: 01.06.2013, 13:16

Syntax für Summe über verschiedene Fälle

Beitrag von phanthom »

Hallo zusammen,

in SPSS stehe ich momentan vor folgendem Problem. Folgende Variablen sind in meinem Datensatz vorhanden:

FIRMA_NR
PERSON_NR
DUMMY

Die verschiedenen Fälle sehen dann z.B. wie folgt aus:

FIRMA_NR PERSON_NR DUMMY
1 1 1
1 1 0
1 1 1
1 2 0
1 3 1
2 1 0
2 2 1
2 2 1
3 1 1
3 1 1
3 2 1
...


Nun möchte ich für jede PERSON_NR einer FIRMA_NR in einer neuen Variablen (ANZAHL) festhalten, wie häufig die Variable DUMMY für die vorhergehenden PERSON_NR eine 1 anzeigt.

Beispiel:
Für FIRMA_NR=1 und PERSON_NR=1 wäre die Variable ANZAHL=0, da es keine vorhergehende PERSON_NR gibt.
Für FIRMA_NR=1 und PERSON_NR=2 wäre die Variable ANZAHL=2, da es zwei Fälle mit PERSON_NR=1 für FIRMA_NR=1 gibt, für die DUMMY=1 gilt.
Für FIRMA_NR=1 und PERSON_NR=3 wäre ebenfalls die Variable ANZAHL=2, da es für PERSON_NR=1 für FIRMA_NR=1 zwei Fälle mit DUMMY=1 gibt und keinen Fall mit DUMMY=1 für PERSON_NR=2 und FIRMA_NR=1.

So soll dies für jede FIRMA_NR und jede PERSON_NR fortgesetzt werden. Hierzu noch ein kleiner Hinweis: Die FIRMA_NR und PERSON_NR sind nicht fortlaufend, d.h. es kann durchaus eine PERSON_NR 5014 geben, auf die eine PERSON_NR 9023 folgt.

Ich würde das Problem gerne über Syntax lösen, weiß aber nicht, wie ich jeweils die Variable DUMMY für alle PERSON_NR vor einer bestimmten PERSON_NR addiere.

Zuerst würde ich jedenfalls die Datei nach FIRMA_NR und PERSON_NR sortieren:
SORT CASES BY FIRMA_NR(A) PERSON_NR(A).

Danach tue ich mir schon schwer, zu sagen, wie ich weiter verfahren soll.
Für eure Hilfe wäre ich sehr dankbar!
Viele Grüße
drfg2008
Beiträge: 2391
Registriert: 06.02.2011, 19:58

re

Beitrag von drfg2008 »

eventuell ist mir die Frage nicht ganz klar, allerding müsste das doch recht einfach über Aggregate gehen.

Entweder direkt über die Personnummer, oder über eine Kombination aus PersonNr und FirmaNr
drfg2008
phanthom
Beiträge: 7
Registriert: 01.06.2013, 13:16

Beitrag von phanthom »

Hallo,

vielen Dank für die Antwort. Ich könnte eine Aggregation über FirmaNr und PersonNr vornehmen. Allerdings hätte ich doch dann nur die Summe z.B. für FirmaNr=1 und PersonNr=1, FirmaNr=1 und PersonNr=2 etc. Was ich aber brauche, ist im Falle von FirmaNr=1 und PersonNr=2 nicht nur die Summe der Dummy-Variable für PersonNr=2, sondern die Summe für PersonNr=2 + die Summe für PersonNr=1. Ich möchte ja alle Dummy=1 zählen für alle PersonNr, die kleiner sind als die betrachtete PersonNr.

Ist damit klar geworden, was ich meine? Ansonsten erläutere ich es gerne nochmal ausführlicher an einem Beispiel.

Vielen Dank!
drfg2008
Beiträge: 2391
Registriert: 06.02.2011, 19:58

re

Beitrag von drfg2008 »

ehrlich gesagt nicht so ganz. Hier aber mal ein Anfang:

Code: Alles auswählen


DATA LIST FREE
 /FIRMA_NR(F8.0) PERSON_NR(F8.0) DUMMY(F8.0).

BEGIN DATA.
1 1 1
1 1 0
1 1 1
1 2 0
1 3 1
2 1 0
2 2 1
2 2 1
3 1 1
3 1 1
3 2 1 

END DATA.
EXECUTE.



SORT CASES BY FIRMA_NR(A) PERSON_NR(A).

IF ($casenum = 1) dummySUM = Dummy.
IF lag(FIRMA_NR) EQ FIRMA_NR DummySUM=SUM(Dummy,LAG(dummySUM)).
IF  lag(FIRMA_NR) NE FIRMA_NR DummySUM=0.
EXECUTE.

COMPUTE Anzahl = dummySUM.
EXECUTE.
IF ($casenum = 1) Anzahl = 0.
EXECUTE.

Diese Variante fängt wieder an zu zählen, sobald die Firma wechselt. Wenn ich noch wissen will, wieviel Personen jeder vor sich hat (je nach Firma), dann:

Code: Alles auswählen



DATA LIST FREE
 /FIRMA_NR(F8.0) PERSON_NR(F8.0) DUMMY(F8.0).

BEGIN DATA.
1 1 1
1 1 0
1 1 1
1 2 0
1 3 1
2 1 0
2 2 1
2 2 1
3 1 1
3 1 1
3 2 1

END DATA.
EXECUTE.



SORT CASES BY FIRMA_NR(A) PERSON_NR(A).

IF ($casenum = 1) dummySUM = Dummy.
IF lag(FIRMA_NR) EQ FIRMA_NR DummySUM=SUM(Dummy,LAG(dummySUM)).
IF  lag(FIRMA_NR) NE FIRMA_NR DummySUM=0.
EXECUTE.


COMPUTE Anzahl = dummySUM.
COMPUTE Anzahl = Anzahl - dummy.
EXECUTE.
IF ($casenum = 1) Anzahl = 0.
EXECUTE.


RECODE Anzahl (Lowest thru 0=0).
EXECUTE.

DATASET DECLARE AGG.
AGGREGATE
  /OUTFILE='AGG'
  /BREAK=FIRMA_NR PERSON_NR
  /Anzahl_max=MAX(Anzahl).

DATASET ACTIVATE agg.
IF ($casenum EQ 1) Anzahl_max = 0.
EXECUTE.
drfg2008
phanthom
Beiträge: 7
Registriert: 01.06.2013, 13:16

Beitrag von phanthom »

Vielen Dank, das hilft schon mal sehr weiter.
Allerdings gibt die Variable Anzahl noch nicht die Werte aus, die ich mir vorgestellt habe. Zum Beispiel bei folgenden Fällen:

FirmaNr PersonNR Dummy Anzahl RichtigeAnzahl
1 1 1 0 0
1 2 0 0 1
1 2 0 0 1
1 2 1 1 1
1 3 0 1 2
1 3 0 1 2
1 3 1 2 2
1 3 0 2 3
1 3 0 2 3
1 4 0 2 3

Ich habe mal in eine Zeile daneben eingefügt, welche Anzahl ich eigentlich ausrechnen wollte (Variable RichtigeAnzahl): Ich möchte für jede PersonNr dieser FirmaNr wissen, wie viele der vorherigen Personen eine 1 bei Dummy haben.

Bei PersonNr=2 hätte ich deshalb für jeden Fall gerne Anzahl=1, weil ja für die vorige Person (=1) gilt Dummy=1.
Bei PersonNr=3 hätte ich gerne für jeden Fall Anzahl=2, weil für beide vorige Personen insgesamt zweimal Dummy=1 gilt usw.

Ich hoffe, ich konnte damit klar machen, welche Werte für die Variable Anzahl berechnet werden sollen. Wenn ihr mir zudem helfen würdet, folgende Syntax-Zeile zu verstehen, kann ich wahrscheinlich selbst auf eine entsprechende Lösung kommen:

Code: Alles auswählen

IF lag(FIRMA_NR) EQ FIRMA_NR DummySUM=SUM(Dummy,LAG(dummySUM)). 
Wie könnte ich in die Summe einfügen, dass die Summe über alle Fälle genommen wird, die vor dem betrachteten Fall stehen, die gleiche FirmaNr haben, aber eine andere PersonNr?

Ich habe mir folgendes überlegt:

Code: Alles auswählen

IF lag(FIRMA_NR) EQ FIRMA_NR AND lag(PERSON_NR) NE PERSON_NR DummySUM=SUM(Dummy).
Das funktioniert aber leider auch nicht...
drfg2008
Beiträge: 2391
Registriert: 06.02.2011, 19:58

re

Beitrag von drfg2008 »

ich habe jetzt leider keine Zeit dein Problem zu lösen, aber hier findest du 100%ig die Antwort:

http://spssx-discussion.1045642.n5.nabble.com/

Allerdings komme ich mit der Syntax auf genau dein Beispiel:


Code: Alles auswählen


DATA LIST FREE
 /FirmaNr(F8.0) PersonNR(F8.0) Dummy(F8.0) Anzahl001(F8.0) RichtigeAnzahl(F8.0).

BEGIN DATA.
1 1 1 0 0
1 2 0 0 1
1 2 0 0 1
1 2 1 1 1
1 3 0 1 2
1 3 0 1 2
1 3 1 2 2
1 3 0 2 3
1 3 0 2 3
1 4 0 2 3 
END DATA.
EXECUTE.



SORT CASES BY FIRMANR(A) PERSONNR(A).

IF ($casenum = 1) dummySUM = Dummy.
IF lag(FIRMANR) EQ FIRMANR DummySUM=SUM(Dummy,LAG(dummySUM)).
IF  lag(FIRMANR) NE FIRMANR DummySUM=0.
EXECUTE.


COMPUTE Anzahl = dummySUM.
COMPUTE Anzahl = Anzahl - dummy.
EXECUTE.
IF ($casenum = 1) Anzahl = 0.
EXECUTE.


RECODE Anzahl (Lowest thru 0=0).
EXECUTE.
[/code]
drfg2008
Anzeige:Statistik und SPSS: Die besten Bücher
Als Buch oder E-Book - Jetzt bestellen
spss datenanalyse
SPSS - Moderne Datenanalyse - Jetzt bestellen!
statistik datenanalyse
Statistik - Der Weg zur Datenanalyse - Jetzt bestellen!
Antworten