25.02.2013 Aufrufe

Skript: "Arbeiten mit ´TDA" - Universität Bremen

Skript: "Arbeiten mit ´TDA" - Universität Bremen

Skript: "Arbeiten mit ´TDA" - Universität Bremen

MEHR ANZEIGEN
WENIGER ANZEIGEN

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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!