Skript: "Arbeiten mit ´TDA" - Universität Bremen
Skript: "Arbeiten mit ´TDA" - Universität Bremen
Skript: "Arbeiten mit ´TDA" - Universität Bremen
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
Inhaltsverzeichnis<br />
<strong>Universität</strong> <strong>Bremen</strong><br />
<strong>Arbeiten</strong> <strong>mit</strong> TDA<br />
Ein <strong>Skript</strong> zur Begeleitung des Kurses „Grundlagen der Ereignisdatenanalyse“<br />
Michael Windzio<br />
mwindzio@gsss.uni-bremen.de<br />
1 Einführung in TDA.............................................................................................................2<br />
2 <strong>Arbeiten</strong> <strong>mit</strong> der TDA-Syntax – Beispiele .........................................................................6<br />
3 Das Erstellen von Life-Table Grafiken <strong>mit</strong> SPSS ............................................................14<br />
4 Grafische Darstellung von Survivorfunktionen nach dem Kaplan-Meier Verfahren ......19<br />
1
1 Einführung in TDA<br />
TDA ist ein sehr leistungsfähiges Programm für statistische Auswertungen. Es umfasst viele<br />
häufig angewandten statistischen Modelle (OLS-Regression, Logit- Probit, Ereignisanalyse),<br />
datenreduzierende Verfahren (Faktor-, Cluster-, Korrespondenzanalyse,<br />
Sequenzmusteranalyse) sowie die Möglichkeit, eigene spezielle Modelle zu programmieren.<br />
Die Stärken von TDA liegen in der Ereignisdatenanalyse, denn dafür wurde es ursprünglich<br />
entwickelt, sowie in den zahlreichen Funktionen zur Aufbreitung von<br />
Längsschnittdatensätzen. Von Vielen wird es als Schwäche des Programms wahrgenommen,<br />
dass es nur über die Syntax gesteuert ist und diese Syntax teilweise ungewohnte Eigenarten<br />
aufweist. Zudem hat es keine Möglichkeit zur Darstellung von Grafiken, d.h. man verwendet<br />
dazu entweder die Postscript-Grafiken oder grafikfähige Programme wie Excel oder SPSS.<br />
Bei der TDA-Syntax ist zwischen Rahmenbefehlen unter Unterbefehlen zu unterscheiden.<br />
Jeder Rahmenbefehl endet <strong>mit</strong> einem „ ; “ . Jeder Unterbefehl oder jede Option 1 endet <strong>mit</strong><br />
einem „ , “ . Der wichtigste Befehl ist nvar(); , denn nur ihm kann man Daten einlesen<br />
oder künstlich Daten erfinden (letzteres z.B. für Simulationsstudien). Mit dem Befehl<br />
rspss1(); werden SPSS- Formatierte Datensätze eingelesen und <strong>mit</strong> rstata(); für<br />
STATA formatierte Datensätze. Aber diese Formate werden während einer Analyse in der<br />
Regel nur einmal eingelesen und wenn der Datensatz in TDA eingelesen ist, arbeitet man<br />
während der folgenden Datenaufbereitungsschritte <strong>mit</strong> nvar(); weiter. Dieser nvar();<br />
Befehl bedeutet in Verbindung <strong>mit</strong> dem Befehl dfile=<br />
Laufwerk:\pfad\...\Dateiname, , dass ein „data file“ im ASCII Format eingelesen<br />
wird, für welches alle Systeme offen sind.<br />
Arbeitet man <strong>mit</strong> dem nvar(); - Befehl, ist zu beachten, dass TDA alle Unterbefehle daran<br />
erkennt, dass sie a) syntaktisch korrekt sind, und b) dass sie in Kleinbuchstaben geschrieben<br />
sind, was a) bereits impliziert.<br />
Innerhalb eines nvar(); ist es eine der häufigsten Aufgaben, neue Variablen zu bilden. Im<br />
command file beginnen Variablennamen im Gegensatz zu den Unterbefehlen immer <strong>mit</strong><br />
einem Großbuchstaben. Ihre Bildung wird einfach eingeleitet, indem die man den Namen der<br />
Variable schreibt und ein Gleichheitszeichen setzt. Dann müssen Variablen, Werte oder<br />
Bedingungen angegeben werden, um in jede Zelle der neuen Variablen die gewünschten<br />
Werte zu schreiben. Man kann z.B. eine Variable bilden, die den Umrechnungsfaktor DM in<br />
1<br />
Manche Befehle dienen nur zur Spezifikation und verdienen den Namen „Unterbefehl“ eigentlich nicht. Aber<br />
grundsätzlich sind diese Optionen natürlich dasselbe wie Befehle.<br />
2
Euro enthält. Nennt man diese Variable „Faktor“, dann schreibt man innerhalb des nvar();<br />
-Befehls: Faktor=1.95583,. Bildet man eine Variable, bei der man sich auf die Werte<br />
einer bereits existierenden Variablen beziehen muss, setzt dies voraus, dass diese Variable<br />
bereits existiert. Zumeist bezieht man sich auf die Variablen, die als Spalten Teil der <strong>mit</strong> dem<br />
dfile=..., -Unterbefehl eingelesenen Datenmatrix sind. Angenommen, Ihre<br />
Datenmatrix hat eine Vielzahl von Variablen (d.h. Spalten der Matrix), Sie benötigen aber nur<br />
zwei Variablen/Spalten (Bildung und Einkommen z.B. aus dem ALLBUS), von denen Sie<br />
wissen, dass diese die Spalten 5 und 7 der Matrix bilden. Dann sprechen Sie im nvar();<br />
Rahmenbefehl diese Spalten an, indem Sie einen frei wählbaren Variablennamen schreiben<br />
und <strong>mit</strong> einem Gleichheitszeichen die Spalte der Datenmatrix ansprechen. Das würde<br />
folgendermaßen aussehen:<br />
nvar(<br />
dfile=Laufwerk\pfad\...\dateiname,<br />
Bildung=c5, # 3=hoch, 2=<strong>mit</strong>tel, 1=gering, 0=keine<br />
Einkommen=c7, # in DM gemessen<br />
Faktor=1.95583, # Umrechnungsfaktor<br />
Eink_eu=Einkommen/Faktor, # Umrechnung<br />
# oder: Eink_eu=Einkommen/1.95583,<br />
# Personen <strong>mit</strong> geringer oder ohne Bildung<br />
# in eine Gruppe zusammengefasst<br />
Low_educ=if lt(Bildung,2) then 1 else 0,<br />
# oder: Low_educ=Bildung[0,1],<br />
# oder: Low_educ=if le(Bildung,1) then 1 else 0,<br />
# oder: Low_educ=le(Bildung,1),<br />
# oder: Low_educ=if ge(Bildung,2) then 0 else 1,<br />
);<br />
freq1=Low_educ,Bildung;<br />
dstat=low_educ;<br />
pdata(drop=Faktor)=Laufwerk\pfad\...\dateiname_neu;<br />
Innerhalb des nvar(); wird <strong>mit</strong> dfile= die einzulesende Datei angegeben. Die beiden<br />
Variablen Bildung und Einkommen werden aus den Spalten („columns“) c5 und c7 der<br />
Datenmatrix gebildet. Bei der Umrechnung, dessen Ergebnis in die Variable Eink_eu<br />
geschrieben wird, kommt das einfach Symbol für die Division zur Anwendung, nämlich das „<br />
/ “ – Zeichen. Andere mathematische Operatoren gelten wie üblich: * für Multiplikation, ^<br />
für das Potenzieren, + für Addition, – für Subtraktion.<br />
In dem oben angeführten command file wird eine Variable Low_educ gebildet, die<br />
Personen <strong>mit</strong> geringer Bildung durch den Wert 1 identifiziert, allen anderen eine 0 zuweist –<br />
eine sogenannte Dummyvariable. Dabei handelt sich um eine Variable, die <strong>mit</strong> einem<br />
bedingten Bezug auf andere Variablen ihre Werte erhält. Hier führen mehrere Varianten zum<br />
Ziel. Zunächst steht dort: Low_educ=if lt(Bildung,2) then 1 else 0, . Die<br />
3
neue Variable Low_educ, die als neue Spalte der Datenmatrix angefügt wird, erhält immer<br />
dann den Wert 1 (also für jede Zeile der neuen Spalte), wenn die Bedingung erfüllt ist, dass<br />
der Wert der Variablen Bildung kleiner als 2 ist. Dabei bedeutet lt „lower than“. Es gibt<br />
noch eine Reihe weiter logischer Operatoren: gt greater than, eq equal, le bzw. ge<br />
lower bzw. greater or equal. In der TDA Syntax wird immer zuerst der Operator genannt,<br />
dann innerhalb der Klammer die zu vergleichenden Variablen oder Werte. Innerhalb der<br />
Klammer könnten also auch zwei Variablen stehen, die gemäß dem gewählten Operator<br />
verglichen werden. Das ist hier aber nicht der Fall. Mit dem than können natürlich auch<br />
andere Werte als 0 oder 2 zugewiesen werden.<br />
Eine kürzere Schreibweise ist die auskommentierte 2 Variante<br />
Low_educ=le(Bildung,1),. Diese kürzere Variante ist möglich, weil TDA einer<br />
Variablen pauschal den Wert 1 zuweist, wenn die Bedingung wahr, also erfüllt ist, und den<br />
Wert 0, wenn die Bedingung nicht erfüllt ist. Man kann sie also nur bei 0/1 Kodierungen<br />
einsetzen. In unserem Fall ist eine noch kürzere Variante praktikabel nämlich:<br />
Low_educ=Bildung[0,1],. Auch hier werden wieder die Werte 0 und 1 pauschal<br />
zugewiesen. Es wird aber kein logischer Operator (wie z.B. le) benötigt, da in den eckigen<br />
Klammern der Wertebereich angegeben ist, innerhalb dessen der Wert der Variable Bildung<br />
liegen muss, da<strong>mit</strong> die Bedingung erfüllt ist und der Wert 1 zugewiesen werden kann. Diese<br />
eckigen Klammern ermöglichen auch die Auswahl von Wertebereichen, indem man z.B. alle<br />
Werte angibt, die zu dem Bereich gehören. Würde die Variable Bildung die Zahl der für einen<br />
Abschluss mindestens notwendigen Schuljahre enthalten (<strong>mit</strong> einem Range von 0 [kein<br />
Abschluss] über 8[Sonderschule], 9[Hauptschule], 10[Realschule] usw. bis 18[Hochschule]),<br />
könnte man auch schreiben: Low_educ=Bildung[0,,10], , vorausgesetzt, man möchte<br />
auch Personen <strong>mit</strong> Realschulabschluss zu den gering Qualifizierten zählen. Die beiden<br />
Kommata teilen TDA <strong>mit</strong>, dass es sich nun um einen Bereich von Werten handelt, der von 0<br />
bis einschließlich 10 reicht. Sie können diese Variante jedoch nicht anwenden, wenn Sie zwei<br />
separate Wertebereiche zur Bedingung machen wollen, z.B. 0 bis 9 und dann wieder von 13<br />
bis 18, um z.B. alle Personen zu identifizieren, die entweder gering oder hoch qualifiziert<br />
sind. In diesem Fall muss nur eine von zwei Bedingungen erfüllt sein und es wäre zu<br />
schreiben:<br />
Low_educ=if le(Bildung,10) | ge(Bildung,13) then 1 else 0,<br />
Oder einfacher:<br />
2 Kommentarzeilen werden durch das Symbol „ # “ eingeleitet und von TDA ignoriert.<br />
4
Low_educ=le(Bildung,10) | ge(Bildung,13),<br />
Bei dem Zeichen „ | “ handelt es sich um das logische „oder“. Häufig muss man bei der<br />
Bildung von Variablen Bedingungen <strong>mit</strong>einander verketten, indem also eine erste, eine zweite<br />
und eine dritte Bedingung erfüllt sein muss [z.B. Frau=1 und Arm=1 und<br />
le(Bildung,10) ]. Dafür verwendet man das „ & “, das logische „und“.<br />
Ist der Datensatz im ersten Schritt so verändert wie gewünscht, kann der nvar();<br />
Rahmenbefehl <strong>mit</strong> dem Semikolon abgeschlossen werden. Außerhalb dieses nvar();<br />
können Sie deskriptive Statistiken anfordern, z.B. eine univariate Häufigkeitstabelle<br />
(freq=...; ) oder eine Ausgabe von min, max und mean (dstat=...; ), wobei die „<br />
... “ als Platzhalter für Variablennamen stehen. Zu beachten ist, dass der Befehl<br />
freq=...; faktisch eine (mehrdimensionale) Kreuztabelle liefert, wenn hinter dem<br />
Gleichheitszeichen (jeweils durch ein Komma getrennt) mehrere Variablen aufgelistet sind.<br />
Für jede Variable eine separate univariate Tabelle erhält man durch freq1=...; .<br />
Möchten Sie eine „richtige“ Kreuztabelle <strong>mit</strong> Spalten- und Zeilenprozenten, verwenden Sie<br />
freq2=..; .<br />
Häufig ist es notwendig, eine <strong>mit</strong> nvar(); eingelesene und um einige Variablen erweiterte<br />
Datenmatrix als Datei auf der Festplatte abzulegen. Dafür wird der pdata();<br />
Rahmenbefehl verwendet. Innerhalb von pdata(); können Datenmatrizen <strong>mit</strong> dem sort=<br />
... , Unterbefehl nach beliebigen Variablen sortiert werden – auch hierarchisch, wenn Sie<br />
mehrere Variablen hintereinander angeben (dann richtet sich die Hierarchie des Sortierens<br />
nach dieser Reihenfolge). Mit den Unterbefehlen keep=..., und drop=..., können<br />
Listen von Variablen gezielt in der Datenmatrix behalten oder gezielt ausgeschlossen werden.<br />
Sind nur z.B. die ersten 100 Zeilen eine sehr viele Zeilen umfassenden Datenmatrix von<br />
Interesse, weil Sie anhand dieser Fälle z.B. nur eine Rekodierung prüfen möchten, empfiehlt<br />
es sich, einen Testdatensatz herauszuschreiben, der wegen der besseren Übersicht nur die<br />
dafür notwendigen Variablen enthält, die Sie <strong>mit</strong> keep=..., auswählen.<br />
Dieser pdata(); Befehl könnte bei einer fiktiven Datenmatrix folgendermaßen aussehen:<br />
pdata(noc=100,keep=ID,Frau,Einkommen,Arme,Frau_arm)=<br />
Laufwerk\pfad\...\dateiname_neu;<br />
Innerhalb der Klammer des pdata(); Befehls kann auch der dtda- Unterbefehl stehen, der<br />
eine Datei erzeugt, die die herausgeschriebene Datenmatrix in TDA-Syntax so beschreibt,<br />
dass Sie die erzeugte Datei einlesen und weiter verarbeiten können. Das klingt kompliziert, ist<br />
aber recht einfach und wird im folgenden Abschnitt erörtert.<br />
5
2 <strong>Arbeiten</strong> <strong>mit</strong> der TDA-Syntax – Beispiele<br />
In dem folgenden Beispiel wird <strong>mit</strong> TDA zunächst ein kleiner Datensatz <strong>mit</strong> dem Namen<br />
episoden.dat eingelesen, der als ASCII Rohdatenmatrix vorliegt (Abb.1). Es handelt sich<br />
hier um Arbeitsstellenepisoden. Das Einlesen von Daten geschieht über den Befehl<br />
nvar();. 3 Die Datei stellt einen Episodendatensatz dar, wie wir ihn zumeist in der<br />
Ereignisanalyse verwenden. Aber auch alle möglichen anderen Datensätze (synonym:<br />
Datenmatrizen) können über den nvar(); Befehl eingelesen und nach den jeweiligen<br />
Erfordernissen bearbeitet werden. Später werden wir z.B. Ergebnistabellen einer Life-Table-<br />
oder Kaplan-Meier- Prozedur <strong>mit</strong> nvar(); einlesen. Auffällig an der Datenmatrix<br />
episoden.dat ist, dass sie nicht richtig nach den Kriterien „Id“ (Identifikationsnummer<br />
der Person) und „Job_nr“ (laufende Nummer der Arbeitstelle) sortiert ist. Man beachte nur<br />
Id Nr. 4! Das holen wir gleich nach...<br />
Abb. 1: Datenmatrix „Episoden.dat“<br />
# Id Job TS TF Tint Frau Schund<br />
1 1 978 996 1176 1 99<br />
1 2 1021 1130 1176 1 99<br />
4 3 1104 1170 1176 0 99<br />
1 3 1134 1154 1176 1 99<br />
2 1 921 983 1176 0 99<br />
2 2 1098 1176 1176 0 99<br />
4 2 1100 1104 1176 0 99<br />
4 1 1000 1056 1176 0 99<br />
3 1 1052 1132 1176 1 99<br />
3 2 1132 1170 1176 1 99<br />
3 3 1170 1176 1176 1 99<br />
Mit TDA kommuniziert man über die sogenannten command files. Bei diesen files handelt es<br />
sich um Dateien, in die alle Befehle geschrieben werden. Im command file wird festgelegt,<br />
wo, d.h. unter welchem MS-DOS-Pfad die Datenmatrix zu finden ist.<br />
TDA muss zudem <strong>mit</strong>geteilt werden, welche Variable in welcher Spalte dieser Datenmatrix<br />
steht. Dafür benötigt man das sogenannte „setup“ im Rahmen des nvar();- Befehls.<br />
Beachten Sie bitte die „ ; “ und die „ , “.<br />
3 Es können auch Daten im SPSS-, SAS- oder STATA-Format eingelesen werden.<br />
6
Abb. 2: Einlesen der Datenmatrix<br />
# episoden.cf<br />
nvar(<br />
dfile=c:\prog_dos\wintda\bsp_buch\episoden.dat,<br />
noc=20,<br />
Id =c1,# ID der Person<br />
Job_nr =c2,# laufende Nummer der Arbeitstelle<br />
TS =c3,# Startzeitpunkt<br />
TF =c4,# Endzeitpunkt<br />
Tint =c5,# Interviewzeitpunkt<br />
Frau =c6,# Frau=1, sonst 0<br />
Schund =c7,# Sonstiges => wird nicht benoetigt<br />
);<br />
pdata(sort=Id,Job_nr,drop=Schund,<br />
dtda=c:\prog_dos\wintda\bsp_buch\des.cf)<br />
=c:\prog_dos\wintda\bsp_buch\epi1.dat;<br />
In Abb. 2 ist zu sehen, wie die Datenmatrix eingelesen wird. Innerhalb des nvar();<br />
geschieht hier nichts Anderes als die Zuweisung von Variablennamen zu den Spalten der<br />
Datenmatrix. Die Datenmatrix wird selbst nicht verändert, d.h. es werden keine neuen<br />
Variablen gebastelt. Man hätte dies aber durchaus tun können. Interessant ist der pdata();<br />
Befehl, der dem nvar(); Befehl folgt. Eine Datenmatrix <strong>mit</strong> dem Namen epi1.dat wird<br />
herausgeschrieben, die der episoden.dat sehr ähnlich ist, aber zwei wichtige<br />
Unterschiede aufweist: erstens ist die epi1.dat nun korrekt sortiert nach den Kriterien Id<br />
und Job_nr (sort=...), zweitens wird die Variable „Schund“, die wir nicht<br />
benötigen, durch den drop-Befehl weggelassen. Denselben Effekt hätte anstelle von drop<br />
auch keep= Id,,Frau, wobei „ Id,,Frau “ eine Liste von in der Matrix<br />
nebeneinanderstehenden Variablen bezeichnet, die von der Variable Id bis zu der Variable<br />
Frau reicht. Man hätte auch jede Variable einzeln auflisten können, von den anderen jeweils<br />
durch ein Komma separiert.<br />
Nun wollen wir <strong>mit</strong> dem sortierten Datensatz weiter arbeiten. Weil wir dafür den sogenannten<br />
Block-Modus verwenden werden, war das Sortieren der Datenmatrix im ersten Schritt<br />
unbedingt notwendig.<br />
hier wird über den MS-DOS-<br />
Pfad die Datei eingelesen<br />
setup<br />
Hier wird die Datei <strong>mit</strong> neuem Namen<br />
(epi1.dat) herausgeschrieben, d.h.<br />
sie wird permanent auf der Festplatte<br />
gespeichert, dabei sortiert nach Id und<br />
Job_nr und zudem das description file<br />
„des.cf“ an die angegebene Stelle<br />
geschrieben.<br />
Wo<strong>mit</strong> sich TDA-Neueinsteiger (zu Recht) häufig schwer tun, ist die Bedeutung des<br />
description files “des.cf“. Da<strong>mit</strong> hat es Folgendes auf sich: Wenn wir die erzeugte und auf<br />
der Festplatte gespeicherte Datenmatrix „epi1.dat“ weiter verarbeiten wollen, müssen wir<br />
auch sie in TDA einlesen. Dafür benötigt TDA wieder ein setup, welches wir<br />
glücklicherweise nicht selber schreiben müssen, sondern uns durch die dtda-Option als<br />
7
ASCII-Datei auf der Festplatte ablegen lassen. Und dieser Datei hatten wir in Abbildung 2 –<br />
völlig willkürlich – in pdata(dtda=...,); den Namen „des.cf“ gegeben. Wie sieht<br />
diese Datei „des.cf“ aus? Siehe Abb. 3:<br />
Abb. 3: Das description file „des.cf“<br />
nvar(<br />
dfile = c:\prog_dos\wintda\bsp_buch\epi1.dat,<br />
noc = 11,<br />
Id [0.0] = c1,<br />
Job_nr [0.0] = c2,<br />
TS [0.0] = c3,<br />
TF [0.0] = c4,<br />
Tint [0.0] = c5,<br />
Frau [0.0] = c6,<br />
);<br />
Diese Datei hätten wir auch selbst schreiben können. Aber nicht auszudenken, was dies bei<br />
vielen Variablen bedeuten würde! Wir können diese Datei nun in einen beliebigen Editor<br />
einladen (editpad.exe hat einige Vorzüge, man kann auch direkt den win-TDA Editor<br />
verwenden), dann den gesamten Text markieren und in die Zwischenablage kopieren (<strong>mit</strong> der<br />
Maus: Bearbeiten => kopieren) und anschließend im TDA – command editor „unter“ die dort<br />
bereits befindlichen Befehle einfügen (edit => paste). Vor diesen neuen nvar();- Befehl<br />
schreiben wir aber noch den Befehl clear; , da<strong>mit</strong> der alte Datensatz aus dem<br />
Arbeitsspeicher des PC entfernt wird. Auf diese Weise erhalten wir Abb. 4:<br />
8
Abb. 4: Das erweiterte command file:<br />
# episoden.cf<br />
nvar(<br />
dfile=c:\prog_dos\wintda\bsp_buch\episoden.dat,<br />
noc=20,<br />
Id =c1,# ID der Person<br />
Job_nr =c2,# laufende Nummer der Arbeitstelle<br />
TS =c3,# Startzeitpunkt<br />
TF =c4,# Endezeitpunkt<br />
Tint =c5,# Interviewzeitpunkt<br />
Frau =c5,# Frau=1, sonst 0<br />
Schund =c6,# Sonstiges => wird nicht benoetigt<br />
);<br />
pdata(sort=Id,Job_nr,drop=Schund,<br />
dtda=c:\prog_dos\wintda\bsp_buch\des.cf)<br />
=c:\prog_dos\wintda\bsp_buch\epi1.dat;<br />
clear;<br />
Löscht die <strong>mit</strong> dem ersten nvar(); gebildete Datenmatrix aus dem<br />
Arbeitsspeicher. Sie liegt ja nun Dank pdata(); auf der Festplatte<br />
nvar(<br />
dfile = c:\prog_dos\wintda\bsp_buch\epi1.dat,<br />
noc = 11,<br />
Id [0.0] = c1,<br />
Job_nr [0.0] = c2,<br />
TS [0.0] = c3,<br />
TF [0.0] = c4,<br />
Tint [0.0] = c5,<br />
Frau [0.0] = c6,<br />
);<br />
Im zweiten Schritt möchten wir den Datensatz um einige Variablen erweitern. Wir möchten<br />
z.B. wissen, wie lange jede Person am Ende ihrer letzten Episode beschäftigt war.<br />
Anzumerken ist, das jene Personen, deren letzte Episode zum Zeitpunkt 1176<br />
(Jahrhundertmonate seit Januar 1998) endet, zum Interviewzeitpunkt noch beschäftigt sind. Es<br />
handelt sich also um rechtszensierte Fälle. Im Augenblick ist dies jedoch nicht von<br />
Bedeutung. Wie geht man vor? Es ist notwendig, über Zeilen hinweg zu arbeiten. In<br />
Querschnittsanalysen ist dies nicht üblich, kommt jedoch in Längsschnittanalysen häufig vor.<br />
Außerdem möchten wir einige Berechnungen spezifisch für jede Person durchführen und es<br />
wäre fatal, wenn irrtümlicherweise Informationen einer Person <strong>mit</strong> den Informationen anderer<br />
Personen (die beide nichts <strong>mit</strong>einander zu tun haben) vermischt werden.<br />
Inhalt des description files<br />
des.cf wird <strong>mit</strong> copy +<br />
paste angefügt<br />
Wir verwenden darum den dblock- Befehl. Mit diesem Befehl kann man anhand der Werte<br />
einer als nominal skaliert betrachteten 4 Variablen Datenblöcke bilden. Alle Zeilen der<br />
Datenmatrix <strong>mit</strong> demselben Wert dieser Variablen gehören demselben Datenblock an.<br />
4<br />
Auch metrische Variablen lassen sich als nominalskaliert ansehen. Für die Bildung von Blöcken ist aber die<br />
Metrik nicht von Bedeutung, sondern es geht ja nur darum, gemäß den Werten einer Variablen Gruppen<br />
voneinander abzugrenzen.<br />
9
Abb. 5: Der dblock-Befehl<br />
# episoden.cf<br />
nvar(<br />
....<br />
);<br />
pdata(...)...;<br />
clear;<br />
nvar(<br />
dfile = c:\prog_dos\wintda\bsp_buch\epi1.dat,<br />
noc = 11,<br />
Id [0.0] = c1,<br />
Job_nr [0.0] = c2,<br />
TS [0.0] = c3,<br />
TF [0.0] = c4,<br />
Tint [0.0] = c5,<br />
Frau [0.0] = c6,<br />
dblock=Id,<br />
E=bfirst,<br />
L=blast,<br />
TF_neu=if eq(L,1) then Tint else suc(TS),<br />
Dur = TF-TS + 1,<br />
D_gesamt=cum(Dur), # kumuliert Dur innerhalb der Bloecke<br />
N_spell=brec,<br />
TS_min=bmin(TS),<br />
);<br />
pdata(dtda=c:\prog_dos\wintda\bsp_buch\des1.cf)<br />
=c:\prog_dos\wintda\bsp_buch\epi2.dat;<br />
Bestimmte Operatoren, zu denen wir gleich kommen, arbeiten bei gesetzten dblock-Befehl<br />
nur innerhalb der Blöcke, nicht aber über die gesamte Datenmatrix hinweg. 5 Eine<br />
Voraussetzung für die sinnvolle Bildung dieser Blöcke ist aber, dass die Datenmatrix nach<br />
den Werten dieser Variable sortiert ist, dass also alle Zeilen <strong>mit</strong> demselben Wert dieser<br />
Variablen direkt untereinander stehen. Korrekt sortiert haben wir ja bereits durch den<br />
pdata(sort=...);-Befehl im ersten Schritt. In Abbildung 5 bilden wir Blöcke für<br />
Personen (dblock=Id,).<br />
Interessant ist, wie die Datenmatrix epi2.dat aussieht. Die Variable TF_neu (Abb. 5) ist<br />
ein neuer Endzeitpunkt, der nicht mehr das Ende der Beschäftigungsepisode anzeigt, sondern<br />
den Beginn der folgenden Episode für den Fall, dass eine folgende Episode existiert. Wenn<br />
man berufliche Auf- oder Abstiege untersucht und Erwerbsunterbrechungen vorkommen (z.B.<br />
bei Id 1 zwischen Job_nr 1 und 2, vgl. Abb. 6), ist nämlich die Zeit bis zum Beginn der<br />
neuen Stelle entscheidend und nicht bis zum Ende der aktuellen Stelle. Mit suc(TS) wird<br />
der Wert von TS aus der folgenden (unteren) Zeile geholt. Existiert keine folgende Episode<br />
5 Die meisten dieser praktischen Operatoren (wahrscheinlich sogar alle) arbeiten über die gesamte Datenmatrix<br />
hinweg, wenn kein dblock-Befehl angegeben ist.<br />
10
und handelt es sich darum um die letzte aller von einer Person registrierten Episoden, dann<br />
wird der Interviewzeitpunkt als Endzeitpunkt eingesetzt (if L[1] then Tint...).<br />
Durch bfirst und blast wird in die jeweiligen Variablen („E“ und „L“) eine 1<br />
geschrieben, wenn es sich um die erste (letzte) in einem Block handelt, sonst eine Null.<br />
Abb. 6: Die Datenmatrix epi2.dat<br />
Id Job TS TF Tint Frau E L TF_neu Dur D_gesamt N_spell TS_min<br />
1 1 978 996 1176 1 1 0 1021 19 19 1 978<br />
1 2 1021 1130 1176 1 0 0 1134 110 129 2 978<br />
1 3 1134 1154 1176 1 0 1 1176 21 150 3 978<br />
2 1 921 983 1176 0 1 0 1098 63 63 1 921<br />
2 2 1098 1176 1176 0 0 1 1176 79 142 2 921<br />
3 1 1052 1132 1176 1 1 0 1132 81 81 1 1052<br />
3 2 1132 1170 1176 1 0 0 1170 39 120 2 1052<br />
3 3 1170 1176 1176 1 0 1 1176 7 127 3 1052<br />
4 1 1000 1056 1176 0 1 0 1100 57 57 1 1000<br />
4 2 1100 1104 1176 0 0 0 1104 5 62 2 1000<br />
4 3 1104 1170 1176 0 0 1 1176 67 129 3 1000<br />
Der Operator brec , <strong>mit</strong> dem die Variable N_spell gebildet wurde, nummeriert alle Zeilen<br />
innerhalb eines Blocks chronologisch durch. Dagegen schreibt der Operator bnrec in jede<br />
einzelne Zeile eines Blocks die Gesamtzahl der Zeilen (hier nicht durchgeführt). Bei einer <strong>mit</strong><br />
bnrec gebildeten Variablen hätte z.B. jede der drei Episoden von ID Nr. 1 den Wert 3, weil<br />
in dem „Datenblock“, der durch die ID Nr. 1 identifiziert ist, drei Episoden existieren.<br />
Rekonstruiert man die Werte der neu gebildeten Variablen in Abb. 6 anhand der Befehle in<br />
Abb. 5, müsste noch einmal deutlich werden, wie die Befehle funktionieren. Natürlich ist es<br />
immer wieder sehr erkenntnisfördernd, diese Befehle selbst auszuprobieren. Man kann auch<br />
z.B. nach Geschlecht sortieren und Blöcke bilden, und dann geschlechtsspezifische<br />
Berechungen durchführen. Mit cum(Dur) wird die Dauer über alle Episoden einer Person<br />
kumuliert.<br />
Nehmen wir nun an, wir hätten ein anderes Problem zu lösen und die vorangegangenen<br />
Variablen wären nicht notwendig gewesen. Unsere Aufgabe besteht nun darin, die<br />
Zielzustände für die Arbeitsmarktprozesse zu definieren. Weil wir zwei unterschiedliche<br />
Fragestellungen verfolgen wollen, benötigen wir auch zwei unterschiedliche Zielzustände.<br />
Erstens geht es um das Ereignis „Ende einer Arbeitsstelle“ (Des). Zweitens geht es um das<br />
Ereignis „Beginn eines anderen Jobs“ (Des_mob). Abb. 7 zeigt, wie diese Zielzustände<br />
gebildet werden. Allerdings ist es möglich, dass Sie bei der Verwendung anderer Datensätze<br />
auch andere Bedingungen für Ereignis und Zensierung formulieren müssen.<br />
11
Abb. 7: Definition von Zielzuständen<br />
# episoden.cf<br />
nvar(<br />
....<br />
);<br />
pdata(...)...;<br />
clear;<br />
nvar(<br />
dfile = c:\prog_dos\wintda\bsp_buch\epi1.dat,<br />
noc = 11,<br />
Id [0.0] = c1,<br />
Job_nr [0.0] = c2,<br />
TS [0.0] = c3,<br />
TF [0.0] = c4,<br />
Tint [0.0] = c5,<br />
Frau [0.0] = c6,<br />
dblock=Id,<br />
E=bfirst,<br />
L=blast,<br />
TF_neu=if eq(L,1) then Tint else suc(TS),<br />
Dur = TF-TS + 1,<br />
Dur_mob=TF_neu-TS + 1,<br />
Des=if eq(TF,Tint) then 0 else 1,<br />
Des_mob=if eq(TF,Tint)|L[1] then 0 else 1,<br />
);<br />
pdata(dtda=c:\prog_dos\wintda\bsp_buch\des2.cf)<br />
=c:\prog_dos\wintda\bsp_buch\epi3.dat;<br />
In Tabelle 7 wird wieder die zuerst erzeugte sortierte Datei epi1.dat eingelesen. Und<br />
wieder wird im Block-Modus gearbeitet (dblock=Id,). Den neuen Endzeitpunkt erstellen<br />
wir wieder durch den Startzeitpunkt der Folgeepisode, es sei denn, es handelt sich um die<br />
letzte Episode einer Person. Dann finden wir ja keinen Folge-Job für diese Person und weisen<br />
ihr darum den Interviewzeitpunkt als Endzeitpunkt zu (if eq(L,1) then Tint else<br />
suc(TS),). Des Weiteren bilden wir für jede unserer beiden Untersuchungsfragen<br />
spezifische Verweildauervariablen sowie Zielzustandsvariablen. Dur misst einfach die Dauer<br />
des Jobs, indem der Startzeitpunkt vom Endzeitpunkt abgezogen wird, wobei der definierte<br />
Zielzustand Des auch bedeuten kann, dass <strong>mit</strong> dem Ende des Jobs eine Phase der<br />
Nichterwerbstätigkeit beginnt. Dur_mob misst die Dauer bis zum Beginn eines neuen Jobs<br />
und schließt auch die Wartezeit während einer Phase der Nichterwerbstätigkeit ein.<br />
Die Befehle in Abb. 7 führen zu der Datenmatrix in Abb. 8:<br />
12
Abb. 8: Datenmatrix epi3.dat<br />
Id Job TS TF Tint Frau E L TF_neu Dur Dur_mob Des Des_mob<br />
1 1 978 996 1176 1 1 0 1021 19 44 1 1<br />
1 2 1021 1130 1176 1 0 0 1134 110 114 1 1<br />
1 3 1134 1154 1176 1 0 1 1176 21 43 1 0<br />
2 1 921 983 1176 0 1 0 1098 63 178 1 1<br />
2 2 1098 1176 1176 0 0 1 1176 79 79 0 0<br />
3 1 1052 1132 1176 1 1 0 1132 81 81 1 1<br />
3 2 1132 1170 1176 1 0 0 1170 39 39 1 1<br />
3 3 1170 1176 1176 1 0 1 1176 7 7 0 0<br />
4 1 1000 1056 1176 0 1 0 1100 57 101 1 1<br />
4 2 1100 1104 1176 0 0 0 1104 5 5 1 1<br />
4 3 1104 1170 1176 0 0 1 1176 67 73 1 0<br />
Beim zweiten Job der Person <strong>mit</strong> der ID 1 ergeben die Befehle aus Abb. 7 für die Variablen<br />
Dur und Dur_mob Dur=1130 – 1021 + 1=110, Dur_mob=1134 – 1021 + 1=114. Bei ihrem<br />
dritten Job von (fett gedruckt): Dur=1154 – 1134 + 1=21, Dur_mob=1176 – 1134 + 1=43. Zu<br />
sehen ist zum einen, dass sich Dur und Dur_mob bei jenen Episoden unterscheiden, die in<br />
Erwerbslücken einmünden, bei denen also der Endzeitpunkt nicht identisch ist <strong>mit</strong> dem<br />
Startzeitpunkt der Folgeepisode. Zudem unterscheiden sich die Zielzustände bei den Episoden<br />
Nr. 3 der Personen 1 und 4. Beide Episoden enden vor dem Interviewzeitpunkt und sind daher<br />
bei der Variable Des nicht zensiert, sondern weisen das Ereignis „Verlassen der<br />
Arbeitsstelle“ auf (Des hat den Wert 1). Allerdings waren beide Personen nach Ende ihrer<br />
letzten Stelle bis zum Interviewzeitpunkt offensichtlich nicht wieder in Beschäftigung. Man<br />
kann daher auch nichts darüber aussagen, ob und wann eine eventuelle Folgebeschäftigung<br />
begann. Sie sind darum in der Analyse der Jobwechsel rechtszensiert (Des_mob hat hier den<br />
Wert 0). Ein weitere Unterschied besteht darin, dass diese Episoden bis zum<br />
Interviewzeitpunkt ihre Verweildauer zum risk set beitragen, wenn wir anhand von Des_mob<br />
und Dur_mob Jobwechsel untersuchen, während bei der Untersuchung der Beendigung der<br />
Arbeitsstellen auch nur die Verweildauern im Job zum risk set beitragen. Auf den ersten Blick<br />
sieht man, dass die Rate einen Job zu verlassen höher ist, als die Rate einen neuen Job zu<br />
finden. Das ist bei dieser Fragestellung inhaltlich trivial, weil man seinen Job beenden muss,<br />
um einen neuen antreten zu können (in der Regel). Das Inhaltliche interessiert uns hier nicht,<br />
sondern nur Ereignisse und Dauern. Die Anzahl der Ereignisse ist bei den Beendigungen der<br />
Jobs höher und zudem ist die kumulierte Verweildauer at risk geringer. Mehr Ereignisse bei<br />
weniger Zeit ergeben eine höhere Rate.<br />
13
3 Das Erstellen von Life-Table Grafiken <strong>mit</strong> SPSS<br />
Zu beachten ist bei der Sterbetafel ein manueller Zwischenschritt, der bei den Kaplan-Meier-<br />
Survivorfunktionen (vgl. den anschließenden Abschnitt) nicht erforderlich ist. Für die<br />
Grafiken beider Prozeduren können vorgefertigte SPSS Syntax-Files verwendet werden, bei<br />
denen man nichts anderes ändern muss als die Namen (und evtl. auch die Pfade, aber nicht in<br />
diesem Kurs) der Datenmatrizen, die in SPSS eingelesen werden.<br />
Das Erstellen der Life-Table Grafiken gliedert sich in folgende Schritte, die näher erläutert<br />
werden:<br />
a) Sterbetafeln <strong>mit</strong> TDA erstellen, <strong>mit</strong> dem ltb(); - Befehl. Stimmen Sie die Dateinamen<br />
der gespeicherten Sterbetafeln <strong>mit</strong> den Dateinamen ab, die in das SPSS Syntax-File<br />
eingelesen werden (command file end_job.cf).<br />
b) Sterbetafeln manuell im Editor verändern (editpad.exe!), indem nur der die<br />
Survivorfunktion und die Ratenfunktion enthaltende Teil der Tafel im Edior verbleibt. Der<br />
Rest wird gelöscht.<br />
c) Mit dem SPSS Syntax-File die Datenmatrizen einlesen. Grafiken werden erstellt und<br />
wollen schön formatiert sein (Syntax-File ltb1.sps).<br />
a) Um <strong>mit</strong> SPSS die Grafiken der Sterbetafeln zu erstellen, muss man zunächst <strong>mit</strong> TDA aus<br />
dem Episodendatensatz die „Tafel“ erzeugen. Wir tun dies <strong>mit</strong> dem command file<br />
end_job.cf, welches in Abb. 9 dargestellt ist. Hier wird nun <strong>mit</strong> echten Daten gearbeitet.<br />
14
Abb. 9: command file end_job.cf<br />
# end_job.cf<br />
# Sterbetafeln: Maenner + Frauen verlassen Arbeitsstellen<br />
# im Editor aufbereiten und in SPSS grafisch darstellen<br />
nvar(<br />
dfile = c:\prog_dos\wintda\bsp_buch\rrdat.1,# data file<br />
ID [3.0] = c1, # identification number<br />
SN [2.0] = c2, # spell number<br />
TS [3.0] = c3, # starting time<br />
TF [3.0] = c4, # ending time<br />
SEX [2.0] = c5, # sex (1 men, 2 women)<br />
TI [3.0] = c6, # interview date<br />
TB [3.0] = c7, # birth date<br />
TE [3.0] = c8, # entry into labor market<br />
TMAR [3.0] = c9, # marriage date (0 if no marriage)<br />
PRES [3.0] = c10, # prestige of current job<br />
PRESN [3.0] = c11, # prestige of next job<br />
EDU [2.0] = c12, # highest educational attainment<br />
# Vergleichsgruppen<br />
Frau=SEX[2],<br />
Mann=SEX[1],<br />
# Definition der Zielzustaende des Prozesses<br />
# DES = Verlassen der Arbeitsstelle<br />
DES [1.0] = if eq(TF,TI) then 0 else 1,<br />
# Definition der Verweildauer<br />
Dur=TF-TS+1, # einen Monat hinzu<br />
);<br />
edef( # define single episode data<br />
ts = 0, # starting time<br />
tf = Dur, # ending time<br />
org = 0, # origin state<br />
des = DES, # destination state<br />
);<br />
ltb(<br />
tp=0 (30) 500,<br />
) = c:\prog_dos\wintda\bsp_buch\ltb_mf.ltb;<br />
tsel=Mann[1];<br />
edef( # define single episode data<br />
ts = 0, # starting time<br />
tf = Dur, # ending time<br />
org = 0, # origin state<br />
des = DES, # destination state<br />
);<br />
ltb(<br />
tp=0 (30) 500,<br />
) = c:\prog_dos\wintda\bsp_buch\ltb_m.ltb;<br />
tsel=Frau[1];<br />
edef( # define single episode data<br />
ts = 0, # starting time<br />
tf = Dur, # ending time<br />
org = 0, # origin state<br />
des = DES, # destination state<br />
);<br />
ltb(<br />
tp=0 (30) 500,<br />
) = c:\prog_dos\wintda\bsp_buch\ltb_f.ltb;<br />
Setup:<br />
Beschreibung der<br />
Datenmatrix<br />
Braucht man nur, wenn beide Gruppen in einer Sterbetafel stehen<br />
sollen<br />
Zielzustände und Dauer.<br />
Vgl. den<br />
vorangegangenen<br />
Abschnitt<br />
Definition: es handelt sich um<br />
eine Episodendatei. Die<br />
mindestens notwendigen<br />
Merkmale einer Episodendatei<br />
müssen hier angebeben werden<br />
Tafel nur für Männer. Nach<br />
jedem tsel muss die<br />
Episodendatei neu definiert<br />
werden. Die life-Table wird <strong>mit</strong><br />
dem ltb(); -Befehl erzeugt.<br />
Sie müssen mindestens die time<br />
periods definieren, hier von 0<br />
bis 500 in 30er Schritten.<br />
Alternativ, aber umständlich:<br />
tp=0,30,60,90,usw. ..500,<br />
möglich wäre auch:<br />
tp=0,30,60,240,500,<br />
Sterbetafel wird als Datei<br />
auf die Festplatte<br />
geschrieben. Die<br />
benötigen wir noch...<br />
15
Wenn Sie das command file laufen lassen, sehen Sie im output-Fenster von Win-TDA das<br />
übliche Protokoll der ausgeführten Befehle. Die einzige „soziologisch“ brauchbare<br />
Information ist hier nur die Median-Verweildauer. Aus dieser Median-Verweildauer lassen<br />
sich aber schon die grundlegenden Aussagen ableiten: bei welcher Gruppe dauert es länger,<br />
bis die Hälfte ein Ereignis aufweist (wenn denn überhaupt bis zum Ende des<br />
Beobachtungsfensters in beiden Gruppen ein Abstrom von 50% zu beobachten ist...)?<br />
b) Wir wollen uns nun die Sterbetafel genauer ansehen. Für die grafische Darstellung<br />
benötigen wir nur jenen Teil der Tabelle, der die Funktionen G(t) und r(t) enthält.<br />
Abb. 10: Sterbetafel des gesamten Samples (etwas gestutzt): ltb_mf.ltb<br />
# Life table. SN 1. Origin state 0.<br />
# Cases: 600 weighted: 600<br />
# Start of Number Number Exposed D-State 1<br />
# Interval Midpoint Entering Censored to Risk Events Prob<br />
0.00 15.00 600 28 586.0 223 0.38055<br />
30.00 45.00 349 23 337.5 113 0.33481<br />
60.00 75.00 213 15 205.5 51 0.24818<br />
.<br />
330.00 345.00 11 1 10.5 2 0.19048<br />
360.00 375.00 8 3 6.5 0 0.00000<br />
390.00 405.00 5 4 3.0 0 0.00000<br />
420.00 435.00 1 1 0.5 0 0.00000<br />
# Start of Survivor D-State 1 D-State 1<br />
# Interval Midpoint Function Error Density Error Rate Error<br />
0.00 15.00 1.00000 0.00000 0.01268 0.00067 0.01567 0.00102<br />
30.00 45.00 0.61945 0.02006 0.00691 0.00058 0.01340 0.00124<br />
60.00 75.00 0.41205 0.02077 0.00341 0.00045 0.00944 0.00131<br />
.<br />
330.00 345.00 0.11122 0.01900 0.00071 0.00047 0.00702 0.00493<br />
360.00 375.00 0.09004 0.02045 0.00000 * 0.00000 *<br />
390.00 405.00 0.09004 0.02045 0.00000 * 0.00000 *<br />
420.00 435.00 0.09004 0.02045 0.00000 * 0.00000 *<br />
# Median duration: 47.28<br />
Haben wir die Sterbetafel ltb_mf.ltb in den Editor „editpad.exe“ eingelesen, dann<br />
markieren und löschen wir jene Bereiche der Tabelle, die wir für die Grafik nicht benötigen.<br />
In Abbildung 10, die eine etwas reduzierte Version der Sterbetafel zeigt, sind diese Bereiche<br />
eingeklammert. Es bleibt also nur der (nur in diesem <strong>Skript</strong>) fett und kursiv gedruckte Bereich<br />
übrig. Haben Sie im editpad das Überflüssige gelöscht, speichern Sie die Datei unter dem<br />
alten Namen ab, d.h. drücken Sie einfach das Diskettensymbol in der Menüleiste.<br />
löschen!<br />
löschen!<br />
In derselben Weise verfahren Sie nun <strong>mit</strong> den anderen beiden Dateien ltb_m.ltb und<br />
ltb_f.ltb. Jetzt haben wir aus dem Ergebnis der TDA-Sterbetafelschätzung – nämlich der<br />
16
Sterbetafel selbst – eine für SPSS lesbare Datenmatrix erstellt (die nun natürlich keine<br />
personenbezogenen Individualdaten mehr enthält), aus der wir bequem unsere Grafiken<br />
erstellen können.<br />
c) Sind die Sterbetafeln aufbereitet, wie in b) beschrieben, lesen wir sie in SPSS ein und<br />
erstellen <strong>mit</strong> dem SPSS Syntax-File ltb1.sps die Grafiken. Dieses SPSS Syntax-File zeigt<br />
Abb. 11. Das Einlesen der Dateien erfolgt über den data list Befehl. Es werden drei<br />
Dateien <strong>mit</strong> data list eingelesen – zuerst die ltb_mf.ltb, die die für Männer und<br />
Frauen gemeinsam erstellte Sterbetafel enthält. Wie man sieht, wenn man sich die Sterbetafel<br />
anschaut, befinden sich die für uns wichtigen Informationen in den Spalten v1<br />
(t=Prozesszeit), v3 (g=Survivorfunktion) und v7 (r=Ratenfunktion). Mit dem graph –<br />
Befehl werden die Grafiken erstellt. Weiter unten wird zunächst die Sterbetafel der Männer<br />
ltb_m.ltb eingelesen und den wichtigen Variablen wieder Namen zugewiesen. Aber<br />
anstelle von g und r heißen die Funktionen/Variablen 6 jetzt gm und rm (m steht für<br />
Männer). Dies ist notwendig, weil die Datei, nachdem sie wieder auf der Festplatte<br />
abgespeichert wurde, über den MATCH FILES Befehl <strong>mit</strong> der Datei ltb_f.ltb, also der<br />
Sterbetafel der Frauen, zusammengeführt wird. Und wenn die Daten zusammengeführt sind,<br />
dürfen keine gleichen Variablennamen innerhalb einer Datei existieren. Die ltb_f.ltb<br />
wird eingelesen, die wichtigen Variablen werden nun aber gf und rf (f steht für Frauen)<br />
genannt. Nach dem MATCH FILES Befehl werden wieder <strong>mit</strong> dem graph Befehl die<br />
Grafiken erstellt, nun aber die Funktionen für Männer und Frauen jeweils simultan in einer<br />
Grafik über t abgetragen. Der sel if Befehl bedeutet, dass die Sterbetafeln oberhalb des<br />
Intervalls t=300 abgeschnitten sind.<br />
6 Es handelt sich hier natürlich um Variablen, um Spalten einer Datenmatrix. Inhalt dieser Variablen sind die<br />
Funktionen G(t) und r(t).<br />
17
Abb. 11: SPSS Syntax-File ltb1.sps zur Erstellung der Grafiken<br />
**** ltb1.sps **.<br />
*************************************************************.<br />
** Frauen und Manner, Blossfeld/Rohwer 1995: 56 ***.<br />
set decimals=dot.<br />
DATA LIST free FILE = 'c:\prog_dos\wintda\bsp_buch\ltb_mf.ltb'<br />
/v1 v2 v3 v4 v5 v6 v7 v8 .<br />
exe.<br />
compute t=v1.<br />
compute g=v3.<br />
compute r=v7.<br />
execute.<br />
format t (F3.1).<br />
format g (F5.4).<br />
format r (F5.4).<br />
exe.<br />
temporary.<br />
sel if (t le 300).<br />
GRAPH<br />
/LINE(multiple)=VALUE(g) BY t .<br />
temporary.<br />
sel if (t le 300).<br />
GRAPH<br />
/LINE(multiple)=VALUE(r) BY t .<br />
*************************************************************.<br />
*********************** getrennt nach Geschlecht********.<br />
set decimals=dot.<br />
DATA LIST free FILE = 'c:\prog_dos\wintda\bsp_buch\ltb_m.ltb'<br />
/v1 v2 v3 v4 v5 v6 v7 v8 .<br />
exe.<br />
compute t=v1.<br />
compute gm=v3.<br />
compute rm=v7.<br />
exe.<br />
format gm (F5.4).<br />
format rm (F5.4).<br />
format t (F3.1).<br />
save outfile= 'c:\prog_dos\wintda\bsp_buch\ltb_m.sav'<br />
/keep t gm rm.<br />
set decimals=dot.<br />
DATA LIST free FILE = 'c:\prog_dos\wintda\bsp_buch\ltb_f.ltb'<br />
/v1 v2 v3 v4 v5 v6 v7 v8 .<br />
exe.<br />
compute gf=v3.<br />
compute rf=v7.<br />
execute.<br />
format gf (F5.4).<br />
format rf (F5.4).<br />
exe.<br />
save outfile= 'c:\prog_dos\wintda\bsp_buch\ltb_f.sav'<br />
/keep gf rf.<br />
get file= 'c:\prog_dos\wintda\bsp_buch\ltb_f.sav'.<br />
MATCH FILES /FILE=*<br />
Den drei wichtigen Spalten<br />
der Matrix werden die<br />
Namen der Funktion<br />
zugewiesen: t, G(t), r(t)<br />
„format“ ist nicht so<br />
wichtig, nur wegen der<br />
Ästhetik..<br />
/FILE='C:\prog_dos\wintda\bsp_buch\ltb_m.sav'.<br />
EXECUTE.<br />
temporary.<br />
sel if (t le 300).<br />
GRAPH<br />
/LINE(multiple)=VALUE(gm gf ) BY t .<br />
temporary.<br />
sel if (t le 300).<br />
GRAPH<br />
/LINE(multiple)=VALUE(rm rf) BY t .<br />
Hier werden bis zum Intervall 300<br />
Monate die Funktionen G(t) und r(t)<br />
über t abgetragen grafisch dargestellt.<br />
Männer-<br />
Sterbetafel<br />
Frauen-<br />
Sterbetafel<br />
Die Sterbetafeldatenmatrix<br />
ltb_mf.ltb wird<br />
eingelesen. SPSS muss aber<br />
wissen, dass Dezimalstellen<br />
als Punkt (dot) dargestellt<br />
sind.<br />
Hier erfolgt der Vorgang für beide Dateien, die nur<br />
<strong>mit</strong> Männern bzw. nur <strong>mit</strong> Frauen erzeugt worden<br />
sind. Diese Dateien werden <strong>mit</strong> MATCH FILES<br />
zusammengeführt und dann G(t) und r(t) von<br />
Frauen und Männern gemeinsam in einer Grafik<br />
dargestellt.<br />
Zusammenführen der beiden bislang<br />
getrennten Sterbetafeln.<br />
Hier werden bis zum Intervall 300<br />
Monate die Funktionen G(t) und r(t)<br />
über t abgetragen und grafisch<br />
dargestellt. Männer und Frauen in einer<br />
Grafik<br />
18
Haben wir die Grafiken erstellt, sollten wir überprüfen, ob die angezeigten Verläufe <strong>mit</strong> den<br />
Original-Sterbetafeln übereinstimmen.<br />
Das Formatieren der Grafiken geschieht dadurch, dass Sie zunächst „doppelt“ auf die Grafik<br />
klicken, die dann in ein sog. CHART-Window geladen wird. Hier haben Sie alle<br />
Möglichkeiten: Überschrift, Legende, Fußnoten usw. Sie können auch die<br />
Achsenbeschriftungen ändern. Z.B. könnte die Ordinate <strong>mit</strong> „Anteil noch im Job“ beschriftet<br />
werden (denn nichts Anderes drückt die Survivorfunktion in diesem Fall aus), die Abszisse<br />
<strong>mit</strong> „Prozesszeit in Monaten“. Zudem sollte die Ordinate einen Maximalwert von 1<br />
annehmen. Klicken Sie (immer doppelt) auf die verschiedenen Stellen der Graphen und<br />
probieren Sie es selbst aus. Das Ergebnis könnte wie Abb. 12 aussehen.<br />
Abb. 12: Beendigung von Arbeitsstellen, Vergleich<br />
von Frauen und Männern, Sterbetafeln<br />
Anteil noch im Job<br />
1,0<br />
,8<br />
,6<br />
,4<br />
,2<br />
0,0<br />
.0<br />
30<br />
60<br />
90<br />
120 150 180<br />
Prozesszeit in Monaten<br />
210 240 270 300<br />
Quelle: MPI-Lebensverlaufsstudie, eigene Berechungen<br />
Männer<br />
Frauen<br />
4 Grafische Darstellung von Survivorfunktionen nach dem Kaplan-Meier Verfahren<br />
Im Gegensatz zur Sterbetafel wird die Prozesszeitachse beim Kaplan-Meier Verfahren<br />
(Synonym: Product-Li<strong>mit</strong>-Schätzer) nicht a priori in Intervalle untergliedert. Sondern die<br />
Episodendatenmatrix rrdat.1 wird aufsteigend nach der Dauer sortiert. Zu jedem<br />
Zeitpunkt, an dem ein oder mehrere Ereignisse oder Zensierungen auftreten, wird die<br />
Survivorfunktion berechnet. Das hat den Nachteil, dass in der Ergebnisdatei, die wie auch die<br />
Sterbetafel als eigene Datei auf die Festplatte geschrieben wird, für jene Zeitpunkte, an denen<br />
„nichts passiert“, auch keine Einträge in der Ergebnisdatei existieren. Folglich kann man sie<br />
nicht so einfach grafisch darstellen. Wir können uns aber <strong>mit</strong> einem „Werkzeug“ behelfen.<br />
19
Der Ablauf gliedert sich wie folgt:<br />
a) <strong>mit</strong> dem command file end_job1_pres.cf die Episodendaten einlesen. Mit dem<br />
ple(); Befehl die Ausgabedatei pres.ple erstellen und speichern. Diese Datei enthält<br />
unter anderem die Survivorfunktion und deren Standardfehler, den wir für die Berechnung der<br />
Konfidenzintervalle benötigen. Diese Datei wird <strong>mit</strong> einem neuen nvar(); eingelesen, dort<br />
die Konfidenzintervalle gebildet und drei neue Dateien unter „abstrakten Namen“, nämlich<br />
einfach gruppe1.dat, gruppe2.dat, gruppe3.dat ... für jede Prestige-Gruppe<br />
herausgeschrieben.<br />
b) Das SPSS-Syntax-File ple_n.sps, wird ausgeführt. Da<strong>mit</strong> werden die Grafiken erstellt.<br />
Das Vorgehen im Detail:<br />
a) Im ersten Schritt wird <strong>mit</strong> Hilfe des command files end_job1_pres.cf in Abb. 13 die<br />
Kaplan-Meier-Schätzung durchgeführt und das Ergebnis, nämlich eine umfangreiche Tabelle,<br />
in die Datei pres.ple geschrieben. Diese Datei ist in Abb. 14 dargestellt. Diese<br />
Datenmatrix wird in den folgenden nvar(); Befehlen in Abb. 13 eingelesen, dabei jedoch<br />
immer nur jener Teil der Datenmatrix (also der Ausgabetabelle) verwendet, der zu der<br />
jeweiligen Gruppe gehört und das Ergebnis als Datenmatrix auf der Festplatte gespeichert.<br />
Aber gehen wir auch dieses command file wieder von vorne bis hinten durch:<br />
Das command file beginnt wieder <strong>mit</strong> einem nvar();-Befehl. Neu ist innerhalb dieses<br />
ersten nvar();-Befehls nur die Bildung einer Klassifikation von Prestigegruppen: Anhand<br />
der Magnitude-Prestige-Skala von Wegener werden drei eher willkürliche Gruppen gebildet,<br />
die durch die drei Dummyvariablen P_low (0 bis 32 Punkte), P_mid (33 bis 41 Punkte)<br />
und P_high (42 bis 100 Punkte) identifiziert werden.<br />
20
Abb. 13: command file end_job1_pres.cf<br />
# end_job1_pres.cf<br />
# product li<strong>mit</strong> estimation: Jobwechsel von Maennern und Frauen<br />
nvar(<br />
dfile = c:\prog_dos\wintda\bsp_buch\rrdat.1, # data file<br />
ID [3.0] = c1, # identification number<br />
SN [2.0] = c2, # spell number<br />
TS [3.0] = c3, # starting time<br />
TF [3.0] = c4, # ending time<br />
SEX [2.0] = c5, # sex (1 men, 2 women)<br />
TI [3.0] = c6, # interview date<br />
TB [3.0] = c7, # birth date<br />
TE [3.0] = c8, # entry into labor market<br />
TMAR [3.0] = c9, # marriage date (0 if no marriage)<br />
PRES [3.0] = c10, # prestige of current job<br />
PRESN [3.0] = c11, # prestige of next job<br />
EDU [2.0] = c12, # highest educational attainment<br />
# Definition der Zielzustaende des Prozesses<br />
# DES = Verlassen der Arbeitsstelle<br />
DES [1.0] = if eq(TF,TI) then 0 else 1,<br />
# Definition der Verweildauer<br />
Dur=TF-TS+1, # einen Monat hinzu<br />
# Prestigegruppen<br />
P_low=PRES[0,,32],<br />
P_mid=PRES[33,,41],<br />
P_high=PRES[42,,100],<br />
);<br />
freq1=P_low,P_mid,P_high;<br />
edef( # define single episode data<br />
);<br />
ple(<br />
ts = 0, # starting time<br />
tf = Dur, # ending time<br />
org = 0, # origin state<br />
des = DES, # destination state<br />
3 Dummies identifizieren drei Gruppen, die<br />
anhand von Prestigeintervallen gebildet<br />
werden<br />
grp=P_low,P_mid,P_high,<br />
csf,<br />
)=c:\prog_dos\wintda\bsp_buch\pres.ple;<br />
########## vorbereiten der PLE-Grafiken ######<br />
#### ple-Tabelle wird in TDA eingelesen,<br />
#### die Konfidenzintervalle werden gebildet,<br />
#### der Datensatz herausgeschrieben und in SPSS<br />
#### eingelesen => Grafiken werden erstellt<br />
clear;<br />
nvar(<br />
dfile=c:\prog_dos\wintda\bsp_buch\pres.ple,<br />
ID=c1,<br />
I=c2,<br />
T=c3,<br />
G=c7,<br />
SE_G=c8,<br />
Auch hier wird wieder der edef-<br />
Befehl benötigt.<br />
Der eigentliche Befehl, der<br />
zur product-li<strong>mit</strong> estimation<br />
führt: ple();<br />
Mit dieser Ausgabedatei (Abb. 14)<br />
pres.ple arbeiten wir weiter.<br />
Sie wird hier wieder <strong>mit</strong> nvar();<br />
eingelesen,<br />
G_unten=G-1.96*SE_G,# Konfidenzintervalle werden berechnet<br />
G_oben=G+1.96*SE_G,<br />
);<br />
tsel=ID[0];# Gruppe 1: Prestige gering<br />
pdata(drop=ID,SE_G)=c:\prog_dos\wintda\bsp_buch\gruppe1.dat;<br />
tsel=ID[1];# Gruppe 2: Prestige <strong>mit</strong>tel<br />
pdata(drop=ID,SE_G)=c:\prog_dos\wintda\bsp_buch\gruppe2.dat;<br />
tsel=ID[2];# Gruppe 2: Prestige hoch<br />
pdata(drop=ID,SE_G)=c:\prog_dos\wintda\bsp_buch\gruppe3.dat;<br />
für SPSS<br />
lesbare ASCII-<br />
Dateien<br />
21
Man sollte sich natürlich <strong>mit</strong> dem freq und dem dstat-Befehl vorher einen Überblick<br />
über den Range und die Verteilung der Variablen PRES verschaffen. Bevor die Kaplan-Meier<br />
Schätzung <strong>mit</strong> dem Befehl ple(); (product li<strong>mit</strong> estimator) durchgeführt werden kann, ist<br />
TDA wieder durch den edef(); Befehl <strong>mit</strong>zuteilen, dass es sich im eine Episodendatei<br />
handelt. Hier werden wieder die notwendigen Informationen über den Ausgangs- und den<br />
Zielzustand sowie über die Dauer des Prozesses gemacht. Im Rahmen des ple-Befehls wird<br />
<strong>mit</strong> der grp=..., Option festgelegt, welche Gruppen hinsichtlich ihrer Survivorfunktionen<br />
verglichen werden sollen. Für diese Gruppen müssen Dummyvariablen existieren, die den<br />
Wert 1 annehmen, wenn eine Episode zur jeweiligen Prestigegruppe gehört und eine 0, wenn<br />
dies nicht der Fall ist. Darüber hinaus wird <strong>mit</strong> der Option csf der statistische Vergleich der<br />
Survivorfunktionen durch den log-rank-Text und die Wilcoxon-Tests angefordert. Wie auch<br />
bei der Sterbetafel wird eine Ergebnisdatei auf die Festplatte geschrieben, und dieser Datei<br />
wird hier der Name pres.ple gegeben. Um die folgenden Befehle des command files in<br />
Abb. 13 zu verstehen, muss man wissen, welche Information diese Datei enthält (Abb. 14).<br />
b) Für die grafische Darstellung der Survivorfunktionen ist wichtig, dass auch diese Datei,<br />
wenn man sie etwas verändert, als Datenmatrix in SPSS eingelesen wird und sich Grafiken<br />
erstellen lassen.<br />
22
Abb. 14: (kleiner Ausschnitt aus der) Ausgabedatei pres.ple<br />
# SN 1. Transition: 0,1 - Product-Li<strong>mit</strong> Estimation<br />
# Group: P_low<br />
# Number Number Exposed Survivor Std. Cum.<br />
# ID Index Time Events Censored to Risk Function Error Rate<br />
0 0 0.00 0 0 213 1.00000 0.00000 0.00000<br />
0 1 2.00 2 0 213 0.99061 0.00661 0.00943<br />
. . . . .<br />
0 38 39.00 1 0 85 0.41643 0.03451 0.87604<br />
0 39 40.00 1 1 83 0.41141 0.03446 0.88816<br />
0 40 44.00 1 0 82 0.40640 0.03440 0.90043<br />
0 41 46.00 1 1 80 0.40132 0.03434 0.91301<br />
. . .<br />
0 78 275.00 1 1 8 0.08746 0.02487 2.43661<br />
0 79 326.00 1 2 5 0.06997 0.02531 2.65976<br />
# 0 80 414.00 0 4<br />
# Median Duration: 32.07<br />
# Duration times li<strong>mit</strong>ed to: 326<br />
# Cases: 213 weighted: 213<br />
# SN 1. Transition: 0,1 - Product-Li<strong>mit</strong> Estimation<br />
# Group: P_mid<br />
# Number Number Exposed Survivor Std. Cum.<br />
# ID Index Time Events Censored to Risk Function Error Rate<br />
1 0 0.00 0 0 181 1.00000 0.00000 0.00000<br />
1 1 3.00 1 1 180 0.99444 0.00554 0.00557<br />
1 2 4.00 2 0 179 0.98333 0.00954 0.01681<br />
. . .<br />
1 15 20.00 5 0 146 0.78823 0.03051 0.23797<br />
1 16 24.00 10 2 139 0.73152 0.03317 0.31263<br />
1 17 25.00 5 0 129 0.70317 0.03422 0.35216<br />
. . .<br />
1 74 350.00 1 1 4 0.08687 0.03561 2.44335<br />
# 1 75 428.00 0 3<br />
# Median Duration: 51.84<br />
# Duration times li<strong>mit</strong>ed to: 350<br />
# Cases: 181 weighted: 181<br />
# SN 1. Transition: 0,1 - Product-Li<strong>mit</strong> Estimation<br />
# Group: P_high<br />
# Number Number Exposed Survivor Std. Cum.<br />
# ID Index Time Events Censored to Risk Function Error Rate<br />
2 0 0.00 0 0 206 1.00000 0.00000 0.00000<br />
2 1 3.00 2 0 206 0.99029 0.00683 0.00976<br />
.<br />
2 41 48.00 1 0 91 0.52164 0.03640 0.65078<br />
2 42 50.00 1 1 89 0.51578 0.03646 0.66208<br />
2 43 54.00 5 0 88 0.48647 0.03667 0.72058<br />
.<br />
2 68 127.00 1 1 30 0.25689 0.03525 1.35913<br />
2 69 133.00 1 2 27 0.24737 0.03521 1.39687<br />
.<br />
2 75 220.00 1 0 11 0.17131 0.03665 1.76431<br />
2 76 293.00 1 5 5 0.13704 0.04241 1.98745<br />
# 2 77 397.00 0 4<br />
# Median Duration: 52.15<br />
# Duration times li<strong>mit</strong>ed to: 293<br />
# Cases: 206 weighted: 206<br />
Nur diese beiden Spalten, c7 und<br />
c8, sind bei allen drei Gruppen<br />
von Interesse (und natürlich die<br />
Spalte c3, die Prozesszeit).<br />
23
Die Ausgabedatei besteht aus drei Teilen. Jeder Teil steht für die Survivorfunktion einer der<br />
drei Gruppen. Die erste <strong>mit</strong> „ID“ überschriebene Spalte stellt eine Identifikationsvariable dar,<br />
<strong>mit</strong> der aber nicht individuelle Episoden identifiziert werden (die ja in dieser Datei nicht mehr<br />
existieren), sondern die jeweilige Gruppe, für die die Aggregatinformation (wie zum Beispiel<br />
die Survivorfunktion als Anteilswert) berechnet wurden. Bei dem Befehl ple(); wurden in<br />
Abb. 13 durch die Option grp=P_low,P_mid,P_high, die drei Gruppen benannt, deren<br />
die Survivorfunktionen verglichen werden sollen. Die erste Gruppe hat bei der ID – Spalte in<br />
Abb. 14 immer den Wert 0, die zweite den Wert 1, die dritte den Wert 2 und die nte Gruppe<br />
hätte den Wert n – 1. Wie man in Abb. 14 sieht, sind alle Zeilen, die nicht Teil der<br />
Datenmatrix sind, die also irgendwelchen Text oder Erläuterungen enthalten, durch das<br />
Symbol „ # “ auskommentiert. Wenn wir die in Abb. 14 gezeigte Datei als Datenmatrix in<br />
TDA (noch nicht in SPSS!) einlesen wollen, was wir gleich tun werden, müssen wir also diese<br />
Zeilen nicht „von Hand löschen“, wie es bei der Life-Table erforderlich war. 7 Noch ein Blick<br />
auf Abbildung 14: wir interessieren uns nun für die Spalten „SURVIVOR FUNCTION“ und<br />
„Std. Error“, die wir grafisch darstellen wollen. Zu diesem Zweck lesen wir im<br />
command file in Abb. 13 die Datei pres.ple wieder in TDA ein. Unser Ziel besteht darin,<br />
die Survivorfunktion um zwei Linien zu ergänzen, nämlich eine Linie, die das untere<br />
Konfidenzintervall von G(t) zeigt und eine Linie, die das obere Konfidenzintervall von G(t)<br />
zeigt (G_unten = G - 1.96 * SE_G, G_oben = G + 1.96 * SE_G,). Da<strong>mit</strong><br />
haben wir einen grafischen Signifikanztest für Differenzen zwischen Survivorfunktionen. Vor<br />
dem Einlesen <strong>mit</strong> dem neuen nvar(); - Befehl müssen wir aber <strong>mit</strong> dem clear; -Befehl<br />
die Episodendatenmatrix rrdat.1 aus dem Arbeitsspeicher löschen (denn da<strong>mit</strong> haben wir<br />
ja den Kaplan-Meier-Schätzer berechnet und diese befindet sich noch im Arbeitsspeicher). Ist<br />
das geschehen, kann z.B. die Survivorfunktion der ersten Gruppe (die <strong>mit</strong> geringem Prestige,<br />
P_low=1) <strong>mit</strong> pdata(); im Anschluss an den zweiten nvar(); Befehl<br />
herausgeschrieben werden. Doch woher weis TDA eigentlich, dass es nur die Funktion dieser<br />
Gruppe herausschreiben soll? Weil im Anschluss des nvar(); Befehls und vor jedem<br />
pdata(); Befehl ein tsel steht. Dieser tsel=Befehl führt zur Selektion von Zeilen der<br />
Datenmatrix, die durch die ID Variable gesteuert ist. Bei tsel werden die Zeilen nach Ende,<br />
also nach Abschluss des nvar(); Befehls ausgeschlossen, z.B. vor dem Herausschreiben<br />
7<br />
Bei der Life-Table haben wir die *.ltb - Dateien direkt in SPSS eingelesen. SPSS erkennt das „ # “ nicht als<br />
Kommentar-Symbol, unter anderem deshalb darum mussten wir einige Teile der *.ltb- Tafeln löschen. TDA<br />
erkennt das „ # “ sowohl innerhalb der command files als auch innerhalb einer Rohdatenmatrix als<br />
Kommentarzeile.<br />
24
einer Datenmatrix <strong>mit</strong> pdata(); oder vor einem Statistikbefehl wie ltb(); . Betrachten<br />
wir jetzt Abb. 14. Dort hat nur der Teil der ple();- Ausgabedatei pres.ple den Wert 0<br />
in der ersten Spalte (c1) , welcher zur Gruppe <strong>mit</strong> dem geringem Prestige gehört. Die Gruppe<br />
<strong>mit</strong> dem <strong>mit</strong>tleren Prestige hat in der c1 (ID) den Wert 1. Sie wird in dem darauffolgenden<br />
pdata(); Befehl herausgeschrieben ( tsel=ID[1] ), nachdem die Datei genau wie die<br />
der anderen Gruppe verändert wurde. Dasselbe geschieht schließlich <strong>mit</strong> der dritten Gruppe (<br />
tsel=ID[2] ) 8 . Jeder tsel- Befehl löst die Selektionsbedingung eines vorangegangenen<br />
tsel- Befehl wieder auf und macht die von ihm formulierte Selektionsbedingung wirksam.<br />
Es ist ratsam, weder die Pfadangabe noch die Dateinamen zu ändern, denn ansonsten kann<br />
später dass SPSS-Syntax-File ple_n.sps nicht einfach ausgeführt werden. Weil die<br />
Dateinamen wie oben angemerkt „abstrakt“ sind, also gruppe1.dat bis gruppe3.dat<br />
heißen, können Sie dieses SPSS-Syntax-File für jede Kaplan-Meier Schätzung verwenden –<br />
sie dürfen eben nur die Namen der Ausgabedatenmatrizen nicht verändern und sollten sich<br />
vorher gut notieren, welche konkrete soziale Gruppe (z.B. hohes/geringes Prestige,<br />
Frau/Mann etc.) sich hinter gruppe1.dat bzw. gruppe2.dat usw. verbirgt (oder noch<br />
mal kurz in das TDA command file schauen).<br />
Abb. 15 zeigt das SPSS-Syntax-File ple_n.sps. Es ermöglicht die simultane grafische<br />
Darstellung von bis zu drei Survivorfunktionen samt ihrer Konfidenzintervalle, sieht recht<br />
kompliziert aus und ist das auch. Sie brauchen es eigentlich nicht zu verstehen, denn dies ist<br />
nur ein Werkzeug. Das File könnte man noch erweitern, aber mehr als drei Funktionen sind<br />
fast immer unübersichtlich. Man muss dann zur Modellbildung übergehen – die ja genau dies<br />
lösen soll, nämlich die Modellierung der Übergangsprozesse unter komplexeren<br />
Einflusskonstellationen in Form der multiplen Regression.<br />
Wenn Sie sich an die Pfadangaben und die Dateinamen halten (z.B. gruppe1.dat), braucht<br />
der Inhalt dieser Syntax-Datei also nicht weiter zu interessieren sondern Sie können die Datei<br />
einfach laufen lassen. Trotzdem sind vielleicht einige Anmerkungen sinnvoll. Schauen wir<br />
noch einmal in Abbildung 14. Im oberen Teil ist bei der Gruppe P_low zu sehen, dass nicht<br />
zu jedem Monat Ereignisse oder Zensierungen auftreten. Z.B. gibt es im Monat 39 ein<br />
Ereignis, ein weiteres im Monat 40, dann aber erst wieder eins im Monat 44, danach erst<br />
wieder im Monat 46. Für die ereignislosen Monate existieren keine Zeilen in der Tabelle.<br />
8 Übrigens gilt beim tsel Befehl die übliche Syntax zur Formulierung von Bedingungen, allerdings ohne den if-<br />
Befehl. Man kann also Selektionen nach verknüpften Merkmalen durchführen, z.B.<br />
tsel=eq(Frau,1)&eq(Arm,1); wenn nur arme Frauen im Sample bleiben sollen. Dasselbe:<br />
tsel=Frau[1]&Arm[1];<br />
25
Wollten wir diese Tabelle ohne Modifikation grafisch darstellen, hätten wir keine<br />
kontinuierliche Zeitachse und die Grafik wäre aufgrund der Lücken „gestaucht“. Tatsächlich<br />
liefert das Kaplan-Meier-Verfahren eine „Treppenfunktion“, die solange über die<br />
ereignislosen Monate hinweg parallel zur Abszisse verläuft, bis wieder ein Ereignis oder eine<br />
Zensierung eintritt. In dem SPSS-Syntax-File wird durch den loop...end loop Befehl<br />
genau dieses Problem behoben und immer dann, wenn eine ereignislose Lücke auftritt, so<br />
viele neue Zeilen in die Datenmatrix hinzugeschrieben, so lange die Lücke gemessen in<br />
Monaten dauert. Außerdem werden auch hier wieder <strong>mit</strong> dem MATCH FILES Befehl<br />
Dateien zusammengeführt.<br />
Abb. 15: SPSS-Syntax-File ple_n.sps<br />
**** ple_n.sps **.<br />
**** plot der Grafiken nach der PLE Tabelle.<br />
**** Tabelle erzeigt <strong>mit</strong> ple_n.cf.<br />
**** fuer n Gruppen.<br />
**************************************************.<br />
***** Gruppe 1 *******.<br />
*** Dateiname ***.<br />
set decimals=dot.<br />
DATA LIST free FILE = 'C:\prog_dos\wintda\bsp_buch\gruppe1.dat'<br />
/i1 t1 g1 gu1 go1 .<br />
exe.<br />
compute i_1=i1*(-1).<br />
execute.<br />
sort cases by i_1.<br />
compute n=2.<br />
if (i1 gt 0) n=lag(t1) - t1.<br />
if (i1 eq 0 & lag(t1) - t1 gt 1) n=lag(t1) - t1 +1.<br />
recode n (sysmis=1).<br />
execute.<br />
sort cases by i1.<br />
format t1 (F3.0).<br />
*** als ASCII Datei herausschreiben, um dann wieder <strong>mit</strong> data list einzulesen.<br />
save translate out='C:\prog_dos\wintda\bsp_buch\ple.asc'<br />
/type= tab<br />
/map/ replace/<br />
keep=n t1 i1 g1 gu1 go1 .<br />
execute.<br />
input program.<br />
data list file='C:\prog_dos\wintda\bsp_buch\ple.asc' free/ N.<br />
loop #i=1 to N.<br />
reread.<br />
data list free/n t1 i1 g1 gu1 go1 .<br />
compute n_sub = #i.<br />
end case.<br />
end loop.<br />
end input program.<br />
execute.<br />
compute time= t1 + n_sub - 1 -1.<br />
sort cases by time.<br />
exe.<br />
format time (F3.0).<br />
compute tdiff= time - lag(time).<br />
exe.<br />
**********Grafik fuer eine Gruppe *****.<br />
sel if (time ge 0 & tdiff gt 0).<br />
GRAPH<br />
/LINE(multiple)=VALUE(go1 g1 gu1) BY time .<br />
save outfile='C:\prog_dos\wintda\bsp_buch\g1.dat'<br />
26
keep time g1 gu1 go1 .<br />
**************************************************.<br />
**** Gruppe 2*****.<br />
*** Dateiname ***.<br />
set decimals=dot.<br />
DATA LIST free FILE = 'C:\prog_dos\wintda\bsp_buch\gruppe2.dat'<br />
/ i2 t2 g2 gu2 go2 .<br />
exe.<br />
compute i_1=i2*(-1).<br />
execute.<br />
sort cases by i_1.<br />
compute n=2.<br />
if (i2 gt 0) n=lag(t2) - t2.<br />
if (i2 eq 0 & lag(t2) - t2 gt 1) n=lag(t2) - t2 +1.<br />
recode n (sysmis=1).<br />
execute.<br />
sort cases by i2.<br />
format t2 (F3.0).<br />
*** als ASCII Datei herausschreiben, um dann wieder <strong>mit</strong> data list einzulesen.<br />
save translate out='C:\prog_dos\wintda\bsp_buch\ple.asc'<br />
/type= tab<br />
/map/ replace/<br />
keep=n t2 i2 g2 gu2 go2.<br />
execute.<br />
input program.<br />
data list file='C:\prog_dos\wintda\bsp_buch\ple.asc' free/ N.<br />
loop #i=1 to N.<br />
reread.<br />
data list free/n t2 i2 g2 gu2 go2 .<br />
compute n_sub = #i.<br />
end case.<br />
end loop.<br />
end input program.<br />
execute.<br />
compute time= t2 + n_sub - 1 -1.<br />
sort cases by time.<br />
exe.<br />
compute tdiff= time - lag(time).<br />
exe.<br />
format time (F3.0).<br />
**********Grafik fuer eine Gruppe *****.<br />
sel if ( time ge 0 & tdiff gt 0 ).<br />
GRAPH<br />
/LINE(multiple)=VALUE(go2 g2 gu2) BY time .<br />
*** matching von Gruppe 1 und Gruppe2***.<br />
match files /file=*<br />
/file='C:\prog_dos\wintda\bsp_buch\g1.dat'<br />
/by time.<br />
exe.<br />
save outfile='C:\prog_dos\wintda\bsp_buch\g12.dat'<br />
/keep time g1 gu1 go1 g2 gu2 go2 .<br />
**********Grafik fuer zwei Gruppen *****.<br />
temporary.<br />
sel if (time le 180).<br />
GRAPH<br />
/LINE(multiple)=VALUE( go1 g1 gu1 go2 g2 gu2 ) BY time .<br />
**************************************************.<br />
**** Gruppe 3*****.<br />
*** Dateiname ***.<br />
set decimals=dot.<br />
DATA LIST free FILE = 'C:\prog_dos\wintda\bsp_buch\gruppe3.dat'<br />
/ i3 t3 g3 gu3 go3.<br />
exe.<br />
compute i_1=i3*(-1).<br />
execute.<br />
sort cases by i_1.<br />
compute n=2.<br />
if (i3 gt 0) n=lag(t3) - t3.<br />
if (i3 eq 0 & lag(t3) - t3 gt 1) n=lag(t3) - t3 +1.<br />
27
ecode n (sysmis=1).<br />
execute.<br />
sort cases by i3.<br />
format t3 (F3.0).<br />
*** als ASCII Datei herausschreiben, um dann wieder <strong>mit</strong> data list einzulesen.<br />
save translate out='C:\prog_dos\wintda\bsp_buch\ple.asc'<br />
/type= tab<br />
/map/ replace/<br />
keep=n t3 i3 g3 gu3 go3 .<br />
execute.<br />
input program.<br />
data list file='C:\prog_dos\wintda\bsp_buch\ple.asc' free/ N.<br />
loop #i=1 to N.<br />
reread.<br />
data list free/n t3 i3 g3 gu3 go3.<br />
compute n_sub = #i.<br />
end case.<br />
end loop.<br />
end input program.<br />
execute.<br />
compute time= t3 + n_sub - 1 -1.<br />
sort cases by time.<br />
exe.<br />
compute tdiff= time - lag(time).<br />
exe.<br />
format time (F3.0).<br />
sel if (time ge 0 & tdiff gt 0).<br />
GRAPH<br />
/LINE(multiple)=VALUE(go3 g3 gu3) BY time .<br />
*** matching von Gruppe 1_2 und Gruppe3***.<br />
match files /file=*<br />
/file='C:\prog_dos\wintda\bsp_buch\g12.dat'<br />
/by time.<br />
exe.<br />
save outfile='C:\prog_dos\wintda\bsp_buch\g123.dat'<br />
/keep time g1 gu1 go1 g2 gu2 go2 g3 gu3 go3 .<br />
temporary.<br />
sel if (time le 180).<br />
GRAPH<br />
/LINE(multiple)=VALUE( go1 g1 gu1 go2 g2 gu2 go3 g3 gu3 ) BY time .<br />
28
Abb. 16: Beendigung von Arbeitsstellen,<br />
Vergleich von Prestigegruppen, Kaplan-<br />
Meier-Schätzer<br />
Anteil noch im Job<br />
1,0<br />
,8<br />
,6<br />
,4<br />
,2<br />
0,0<br />
0<br />
20<br />
40<br />
Abb. 16: Beendigung von Arbeitsstellen,<br />
Vergleich von Prestigegruppen, Kaplan-Meier-<br />
Schätzer<br />
Quelle: MPI-Lebensverlaufsstudie, eigene Berechungen Quelle: MPI-Lebensverlaufsstudie, eigene Berechungen<br />
Diese Zusammenführung erfolgt nach dem Verknüpfungskriterium der Prozesszeit (by<br />
time). Falls Sie die Survivorfunktionen ohne Konfidenzintervalle plotten möchten, sollten<br />
Sie wissen, dass innerhalb der graph Befehle aus der Klammer hinter value= einfach nur<br />
die go1 und gu1 bzw. go2 und gu2 usw. herausnehmen müssen. Dort bedeutet go (gu)<br />
„G(t) oberes Konfidenzintervall“ („G(t) unteres Konfidenzintervall“), die Nummer bezeichnet<br />
die Nummer der Gruppe.<br />
Beschränken wir uns auf den Vergleich der Gruppen „geringes Prestige“ und „<strong>mit</strong>tleres<br />
Prestige“ (gruppe1 und gruppe2), erhalten wird das Ergebnis aus Abb. 16. Auf die Legende<br />
wurde hier verzichtet. Die Beschriftung der Funktionen erfolgte <strong>mit</strong> Word-Textfeldern und<br />
Zeichenelementen.<br />
Gruppe 1: <strong>mit</strong>tleres Prestige<br />
60<br />
Gruppe 2: geringes Prestige<br />
80<br />
100<br />
120<br />
Prozesszeit in Monaten<br />
140<br />
160<br />
180<br />
Anteil noch Job<br />
1,0<br />
,8<br />
,6<br />
,4<br />
,2<br />
0,0<br />
0<br />
20<br />
40<br />
60<br />
80<br />
100<br />
120<br />
Prozesszeit in Monaten<br />
140<br />
160<br />
29<br />
180
In den Abbildungen 16 und 17 sind die Ergebnisse der Kaplan-Meier Schätzungen in Form<br />
der Survivorfunktionen samt der sogenannten „Signifikanzbänder“ dargestellt. Trotz der<br />
geringen Zahl der Episoden sind in Abb. 16 per Augenschein signifikante Unterschiede in den<br />
Abstromprozessen zwischen der Gruppe <strong>mit</strong> dem geringen Prestige und der <strong>mit</strong> <strong>mit</strong>tlerem<br />
Prestige festzustellen. Personen <strong>mit</strong> geringem Prestige verlassen ihre Arbeitsstellen schneller.<br />
Woran das liegt, spielt an dieser Stelle keine Rolle. Die eigentlichen Survivorfunktionen sind<br />
die dickeren Linien, während die dünnen gestrichelten Linien die oberen bzw. unteren<br />
Grenzen der Konfidenzintervalle abbilden. Abbildung 17 ist sehr unübersichtlich, was aber<br />
auch an der Breite der Konfidenzintervalle und das wiederum unter anderem an den geringen<br />
Fallzahlen liegt. Gut, dass wir in einem Fall wie in Abb. 17 nicht auf die Grafiken angewiesen<br />
sind, sondern auf unsere statistischen Test (log-rank und Wilcoxon) zurückgreifen können!<br />
Und später ohnehin zur Modellbildung übergehen.<br />
30