Kombinationen in Fällen zählen

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
paede
Beiträge: 32
Registriert: 05.10.2010, 15:09

Kombinationen in Fällen zählen

Beitrag von paede »

Guten Tag miteinander,

Ich habe einen Datensatz mit 350'000 Fällen folgender Art:

Code: Alles auswählen

ID        Var1
1          a
1          b
1          c
1          d
2          e
2          d
2          a

usw.
Was ich gerne in SPSS machen möchte ist, die Anzahl spezifischer Kombinationen von Einträgen in Var1 pro gleiche ID zählen lassen.

Konkret: Ich möchte eine Suchabfrage der Art "In wievielen Fällen tritt Var1=a und Var1=b mit der gleichen ID auf?" machen und hätte von SPSS gerne eine Zahl als Output. Damit wüsste ich dann die Anzahl, mit der in meinem gesamten Datensatz (besteht aus ca 350'000 Fällen aber nur 80'000 verschiedenen IDs) die Kombination der Var1-Werte a und b mit gleicher ID vorkommt.

Wenn SPSS dann auch gleich noch die IDs auflisten könnte, die diese Var1-Wertekombination enthalten, wäre das das Sahnehäubchen obendrauf.

Var1 ist eine String-Variable, ID ist numerisch.

Das Problem müsste doch prinzipiell über die COUNT-Funktion mit Einschränkung auf bestimmte Bedingungen lösbar sein, oder?

Bin um jede Hilfe dankbar.

MfG
Generalist
Beiträge: 1733
Registriert: 11.03.2010, 22:28

Beitrag von Generalist »

Deine Daten brauchen vermutlich ersteinmal eine andere Form. Ob das hier geht mit "Umstrukturieren", weiß ich nicht. Eine unelegante Vorgehensweise wäre

******Erzeuge für jede Ausprägung von Var1 eine eigene Variable
IF (var1='a') var1.a=1.
EXECUTE.
IF (var1='b') var1.b=1.
EXECUTE.
(... etc. für alle strings)

******ordne den Wert dieser neuen Variablen allen Zeilen innerhalb einer Id zu
AGGREGATE
/OUTFILE=* MODE=ADDVARIABLES OVERWRITEVARS=YES
/BREAK=id
/Var.a=MAX(var1.a).
AGGREGATE
/OUTFILE=* MODE=ADDVARIABLES
/BREAK=id
/Var.b=MAX(var1.b).
(etc.)

Dann machst Du einen RECODE (sysmis=0) für Var.a, Var.b etc.
und löscht alle doppelten Ids
SELECT IF(Id ne LAG(Id) OR $casenum=1).

Im Ergebnis hast Du die 80'000 Fälle (Ids) mit Var.a=0 oder 1, Var.b=0 oder 1 etc und kannst die Fälle mit Bedingung Var.a=1 & Var.b=1 auswählen lassen.
georggraph
Beiträge: 114
Registriert: 30.03.2009, 09:39

Beitrag von georggraph »

Hallo,

eine Lösung wäre die folgende Syntax:

Code: Alles auswählen

SORT CASES BY ID .
CASESTOVARS  /ID=ID  /GROUPBY=VARIABLE.
DO REPEAT #v = Var1.1 Var1.2 Var1.3 Var1.4.
  IF LTRIM(RTRIM(#v)) = "a" a = 1.
  IF LTRIM(RTRIM(#v)) = "b" b = 1.
END REPEAT.
IF SUM(a,b) = 2 a_b = 1.
SORT CASES BY a_b(D) ID(A).
FREQ a_b.
Die Syntax strukturiert die Datenmatrix um, was in Deinem Beispiel zu 4 neuen Variablen (Var1.1 bis Var1.4) führt. Mit dem DO REPEAT-Befehl werden die Werte ausgelesen, um anschließend das Kombinationskennzeichen (a_b) zu erstellen.
Abschließend wird die Datei so sortiert, dass die Kombinations-IDs oben stehen, sowie die Häufigkeit der Kombinationsvariablen ausgegeben.

WICHTIG: Vor dem Ausführen dieser Schritte Deine Datendatei abspeichern, da die Daten wie gesagt umstrukturiert werden.

Bei 350.000 Datensätzen ist darüber hinaus mit einer gewissen Rechenzeit zu rechnen.

Viele Grüße,
georggraph
paede
Beiträge: 32
Registriert: 05.10.2010, 15:09

Beitrag von paede »

Generalist, vielen Dank für deine Antwort. Wenn ich deine vorgeschlagene Syntax richtig verstehe, müsste ich jede Ausprägung von Var1 eingeben. Var1 besitzt ca 900 verschiedene Ausprägungen, die aber alle Strings sind. Gibt es nicht einen allg. "string"-Ausdruck?

georggraph, auch dir danke ich für die Hilfe. Habe deinen Vorschlag, sofern ich ihn richtig verstanden habe, über "Daten->Umstrukturieren->Umstrukturieren ausgewählter Fälle in Variablen" umgesetzt. ID habe ich als Bezeichnervariable definiert, das Feld "Indexvariable" habe ich leer gelassen.

Es sieht nach dieser Transformation so aus:

Code: Alles auswählen

ID          Var1.1          Var1.2          Var1.3          etc.
1            a                b                c
Die IDs sind jetzt auf Unikate reduziert, was meinem Ziel schon sehr Nahe kommt. Zudem sind viele Var1.1, Var1.2, Var1.3 etc. entstanden, die alle Werte der ursprünglichen Var1 auflisten die derselben ID zugeordnet waren.

Komischerweise sind einzelne Werte als Duplikate vorhanden, d.h. bspw. in Var1.6 aber auch in Var1.7 der gleichen ID aufgeführt, obwohl im ursprünglichen Datensatz nie mehrmals derselbe Var1-Wert der gleichen ID zugeordnet war. Weisst du wo da der Grund liegen könnte?

Als Lösungsansatz für dieses Problem müsste ich doppelte oder Mehrfacheinträge pro Fall löschen können. Wie funktioniert das? Ich kann nur doppelte Fälle an sich ermitteln und löschen. In meinem Fall existieren aber ja keine doppelten Fälle mehr, sondern nur noch "doppelte Variablen" sozusagen...
georggraph
Beiträge: 114
Registriert: 30.03.2009, 09:39

Beitrag von georggraph »

Komischerweise sind einzelne Werte als Duplikate vorhanden, d.h. bspw. in Var1.6 aber auch in Var1.7 der gleichen ID aufgeführt, obwohl im ursprünglichen Datensatz nie mehrmals derselbe Var1-Wert der gleichen ID zugeordnet war.
Interessant. Ich konnte diesen Fehler anhand eines fiktiven Beispieldatensatzes nicht reproduzieren. Die von Dir beschriebene Vorgehensweise zum Restrukturieren der Datei anhand des Menüs "Daten - Umstrukturieren" ist jedenfalls korrekt.
Meines Erachtens kann es eigentlich nur an einem Problem in Deinen Ausgangsdaten liegen - prüfe nochmals, ob es wirklich keinerlei var1-Dubletten innerhalb einer ID gibt. Dies geht beispielsweise anhand folgender Syntax:

Code: Alles auswählen

AGGREGATE OUTFILE =* MODE=ADDVARIABLES OVERWRITE=YES /BREAK = ID Var1 /Zaehl = N.
FREQ Zaehl.
Falls die Variable "Zaehl" Werte größer als 1 annimmt, gibt es Dubletten in Deinen Rohdaten.

Viele Grüße,
georggraph
paede
Beiträge: 32
Registriert: 05.10.2010, 15:09

Beitrag von paede »

georggraph, du hast absolut recht. Es war ein Denkfehler meinerseits. Der Umstrukturierungsresultat ist korrekt und entspricht meinen Daten.

Um die Zielsetzung meines Eingangsbeitrags zu erreichen, muss ich nun Kombinationen in den Fällen zählen.

Ich habe es bereits so versucht:
"Transformieren->Werte in Fällen zählen; Variablen sind alle meine neu generierten Variablen. Da ich ja Kombinationen zweier Werte in Fällen suche, habe ich unter "Werte definieren..." einen der beiden angegeben. Das Kombinationskriterium versuchte ich über die optionalen Fallauswahlbedingungen "Falls..." festzusetzen.

Konkret: Ich suche die Anzahl der Wertekombination "a" mit "b". D.h. ich setze "a" als definierten Wert, nach dem in den Fällen gesucht werden soll, und in der optionalen Fallauswahl gebe ich über "Fälle einschliessen, wenn Bedingung erfüllt ist" die Bedingungen ein: Var1.1='b' OR Var1.2='b' OR Var1.3='b' OR etc. So sollte nach meiner Logik der Wert "a" nur dann gezählt werden, falls irgendein anderer Wert einer Variable im gleichen Fall "b" ist.

Das scheint im Prinzip zu funktionieren (für bspw. 3 mit OR getrennte Variablen), ergibt jedoch eine Fehlermeldung, wenn ich alle meine Var1.1 - Var1.x aufliste, was ich ja konsequenterweise mache müsste um über den ganzen Datensatz hinweg suchen zu können.

Gibt es für dieses Problem evtl. eine elegantere Lösung, oder sind meine Bedingungen falsch?
georggraph
Beiträge: 114
Registriert: 30.03.2009, 09:39

Beitrag von georggraph »

Hallo,

ich bin immer ein Verfechter des Gebrauchs der Syntax - mit den Menüs in SPSS arbeite ich so gut wie nie.

Von daher kann ich Dir die in meinem ersten Post schon aufgeführte Syntaxlösung empfehlen:

Code: Alles auswählen

DO REPEAT #v = Var1.1 Var1.2 Var1.3 Var1.4. 
  IF LTRIM(RTRIM(#v)) = "a" a = 1. 
  IF LTRIM(RTRIM(#v)) = "b" b = 1. 
END REPEAT. 
IF SUM(a,b) = 2 a_b = 1. 
SORT CASES BY a_b(D) ID(A). 
FREQ a_b.
Damit wird das Kombinationskennzeichen "a_b" angelegt und immer dann mit dem Wert 1 gefüllt, wenn bei einer ID eine Deiner Var1-Variablen den Wert "a" und eine andere Var1-Variable den Wert "b" aufweist.

Viele Grüße,
georggraph
paede
Beiträge: 32
Registriert: 05.10.2010, 15:09

Beitrag von paede »

Danke für die schnelle Antwort.

Habe deine Syntax probiert, bekomme leider einen haufen Fehlermeldungen. Ist sie evtl. nicht anwendbar auf schon umstrukturierte Daten?

Habe dir die Fehlermeldungen rauskopiert:

Code: Alles auswählen

1 DO REPEAT Unrecognized text appears on the DO REPEAT command.  It will be ignored.  Text: ( 
1 DO REPEAT Unrecognized text appears on the DO REPEAT command.  It will be ignored.  Text: ( 
1 DO REPEAT Unrecognized text appears on the DO REPEAT command.  It will be ignored.  Text: ) 
1 DO REPEAT Unrecognized text appears on the DO REPEAT command.  It will be ignored.  Text: ) 
1 DO REPEAT An equals sign appears in a variable or value list where it is not expected. It will be ignored.  Text: = 
1 DO REPEAT An equals sign appears in a variable or value list where it is not expected. It will be ignored.  Text: = 
3 IF Incorrect variable name: either the name is more than 64 characters, or it is not defined by a previous command.  Text: #v 
4 END REPEAT An END REPEAT command has appeared without a previous DO REPEAT command. 
5 IF Incorrect variable name: either the name is more than 64 characters, or it is not defined by a previous command.  Text: pantoprazol 
6 SORT CASES BY An undefined variable name, or a scratch or system variable was specified in a variable list which accepts only standard variables.  Check spelling and verify the existence of this variable.  Text: pantoprazol_metoprolol 
7 Frequencies Error in FREQUENCIES command. 
Bei mir im richtigen Datensatz ist die heisst die Variable ID fallnr, die Variablen Var1.1 etc. substance.1, substance.2 etc. Der Wert "a" ist "pantoprazol" und der Wert "b" ist "metoprolol".

Ich habe dein Syntax also mit angaben meines richtigen Datensatzes ausgefüllt und so laufen lassen:

Code: Alles auswählen

DO REPEAT #v = substance.1 substance.2 substance.3 substance.4 substance.5 substance.6 substance.7 substance.8 substance.9 substance.10 substance.11 substance.12 
  IF LTRIM(RTRIM(#v)) = "pantoprazol" pantoprazol = 1. 
  IF LTRIM(RTRIM(#v)) = "metoprolol" metoprolol = 1. 
END REPEAT. 
IF SUM(pantoprazol,metoprolol) = 2 pantoprazol_metoprolol = 1. 
SORT CASES BY pantoprazol_metoprolol(D) fallnr(A). 
FREQ pantoprazol_metoprolol.
Ich benütze SPSS 18, falls das was zu Sache tut.

EDIT: Habe den . vergessen nach den substance-Variablen. Jetzt haben sich die Fehlermeldungen auf diese reduziert:

Code: Alles auswählen

2 _SLINE DO REPEAT has no effect on this command.
EDIT2: Habe jetzt noch alle auch effektiv im Datensatz vorkommende substance-Variablen aufgelistet. Es kommt zwar noch immer unten angefügte Fehlermeldung, jedoch bekomme ich einen Frequency-Output und auch die drei neuen Variablen a, b und a_b mit scheinbar korrekten Werten (d.h. entweder 1 oder SYSMIS)

Code: Alles auswählen

DATASET ACTIVATE DatenSet7. 
DO REPEAT #v = substance.1 substance.2 substance.3 substance.4 substance.5 substance.6 substance.7 substance.8 substance.9 substance.10 substance.11 substance.12. 
 
>Warning # 141.  Command name: _SLINE 
>DO REPEAT has no effect on this command.  
 
>Warning # 141.  Command name: _SLINE 
>DO REPEAT has no effect on this command. 
DO REPEAT #v = substance.1 substance.2 substance.3 substance.4 substance.5 substance.6 substance.7 substance.8 substance.9 substance.10 substance.11 substance.12 
substance.13 substance.14 substance.15 substance.16 substance.17 substance.18 substance.19 substance.20 substance.21 substance.22 substance.23 substance.24 
substance.25 substance.26 substance.27 substance.28 substance.29 substance.30 substance.31 substance.32 substance.33 substance.34 substance.35 substance.36 substance.37. 
 
>Error # 4530.  Command name: DO REPEAT 
>This command is not allowed inside the DO REPEAT/ END REPEAT facility.  The 
>command will be ignored. 
>Execution of this command stops. 
  IF LTRIM(RTRIM(#v)) = "pantoprazol" pantoprazol = 1. 
  IF LTRIM(RTRIM(#v)) = "metoprolol" metoprolol = 1. 
END REPEAT. 
IF SUM(pantoprazol,metoprolol) = 2 pantoprazol_metoprolol = 1. 
SORT CASES BY pantoprazol_metoprolol(D) fallnr(A).  
FREQ pantoprazol_metoprolol.
Es scheint jetzt für meine Bedürfnisse zu funktionieren; vielen Dank für deine Hilfe!

Ich wäre dir dankbar, wenn du mir zum besseren Verständnis vielleicht noch die ausgegebenen Fehlermeldungen etwas genauer erörtern könntest, falls du Zeit & Lust hast ;-).

MfG
georggraph
Beiträge: 114
Registriert: 30.03.2009, 09:39

Beitrag von georggraph »

Hallo,

die folgende Fehlermeldung...

Code: Alles auswählen

>Error # 4530.  Command name: DO REPEAT 
>This command is not allowed inside the DO REPEAT/ END REPEAT facility.  The 
>command will be ignored. 
>Execution of this command stops. 
... erscheint vermutlich deshalb, weil Du die Zeile...

Code: Alles auswählen

DO REPEAT #v = substance.1 substance.2 substance.3 substance.4 substance.5 substance.6 substance.7 substance.8 substance.9 substance.10 substance.11 substance.12.
... ausgeführt hast, ohne die übrigen Zeilen der Schleife bis zum abschließenden END REPEAT-Befehl auszuführen.

Ich vermute mal, dass die Warning # 141 aus dem selben Grund erschien: Die DO REPEAT-Schleife wurde gestartet, ohne dass sie beendet wurde.

Ist aber natürlich im Rahmen einer Ferndiagnose nie ganz sicher zu erklären.

Viele Grüße,
georggraph
"Ein kaum merkliches Kopfnicken verriet dann, dass er nicht die Absicht habe, diese Frage zu beantworten, und es war Sache des Fragestellers, seinen eigenen Fehler zu erkennen und die Frage neu zu formulieren." (F.Kafka: Der Verschollene)
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