SC5: Vorbereitungen zur Sequenzanalyse

Liebes NEPS-FDZ,

ich arbeite derzeit an einer Sequenzmuster-Analyse mit NEPS-Daten und habe diese mittlerweile auch grundsätzlich ans Laufen bekommen. Um die Spell-Daten ins Wide-Format umzuwandeln, habe ich das Package Newspell verwendet. Allerdings hänge ich noch an zwei Stellen und wäre für Ihren Input sehr dankbar. 

1) Im Biography-Datensatz gibt es Haupt- und Nebenereignisse, erkennbar an der Variable spms. Ich möchte die Nebenereignisse nur noch für die Zeiträume drin haben, die nicht durch Hauptereignisse abgedeckt sind. Oder anders ausgedrückt: Es soll für jeden Monat nur einen sptype geben. Einfach die Nebenereignisse rauszulöschen würde ja dazu führen, dass ich dann "Löcher" habe. Wie kann ich das in Stata lösen?

2) Ich bekomme durch die Umwandlung mit newspell state_547-state_607. Es wäre aber schöner, wenn ich bei state_1 loszähle. Geht das irgendwie? Ich habe mir schon erschlossen, dass die Angabe von der Stata-Zeit kommt, aber weiter bin ich bisher noch nicht. Ich habe auch schon in die Hilfe von newspell geschaut, aber das half mir auch nicht weiter, weil es ganz egal zu sein scheint, was ich bei time einsetze. 

newspell towide, time(n) id(ID_t) snumber(spell_chron) stype(state) begin(ts) end(te) nooverlaps(1, 2, 3, 4, 7, 6, 5, 8)

Vielen Dank schon mal vorab. 

Beste Grüße
SaS

Liebes NEPS-FDZ,

ich habe am Wochenende etwas nachgedacht und folgende Lösungen entwickelt:

1) Damit mein Ansatz besser verständlich ist, habe ich auch den Code davor reinkopiert. Mich würde insbesondere interessieren, ob ich im Abschnitt  "Nebenereignisse auf die Zeiten kürzen, die nicht von Hauptereignissen abgedeckt sind" etwas übersehen haben. 

Denn leider kommt bei späteren Analyseschritten: 

Error: case 3 state out of range

 Wenn ich den betreffenden Abschnitt auskommentiere, erscheint keine Fehlermeldung.

********************
// öffne Biography
use "${dataDir}/${cohort}_Biography_${dsversion}.dta", clear
sort ID_t wave


* Zeit
***********

// Start- und Endzeiten ins Stata-Format kodieren
generate ts = ym(starty,startm) 
lab var ts "Episodenstart"
generate te = ym(endy,endm)
lab var te "Episodenende"
format ts te %tm 

// Episoden ausfiltern, die nach Studienstart liegen
generate ws1011 = ym(2010,9) // Datum für Studienstart WS10/11==9/2010
lab var ws1011 "Beginn Studium"
drop if ts >= ws1011
replace te = ym(2010,8) if te >= ws1011 

// Episoden ausfiltern, die vor 8/2005 liegen
generate start = ym(2005,9) 
lab var start "Beginn Beobachtungszeitraum"
drop if te < start
replace ts = ym(2005,9) if ts < start 


* chronologischer Laufindex
*************************** 

// chronologischer Laufindex für Spells
bysort ID_t (ts): gen spell_chron=_n 
lab var spell_chron "Chronologischer Laufindex"

keep ID_t sptype spell_chron ts te spms


* Nebenereignisse auf die Zeiten kürzen, die nicht von Hauptereignissen abgedeckt sind
**************************************************************************************
tab spms
bysort ID_t (spell_chron): replace ts = te[_n-1]+1 if spms==2 
bysort ID_t (spell_chron): replace te = ts[_n+1]-1 if spms==2
replace ts = ym(2005,9) if ts == .
replace te = ym(2010,8) if te == .
drop if ts > te
tab spms

* neuer chronologischer Laufindex
*************************** 

// chronologischer Laufindex für Spells
bysort ID_t (ts): gen spell_chron_n=_n 
lab var spell_chron_n "Chronologischer Laufindex"

2) Hier ist mein Ansatz jetzt, die Ergebnisvariablen umzucodieren. Dürfte meines Erachtens für die Analyse keine Rolle spielen.

rename state_(#)(#)(#) state(#), renumber

Beste Grüße
SaS

Hallo SaS!

Zu 1.)

die spms-Variable wird von infas geliefert und generiert. Auch uns ist nicht ganz klar wie diese Variable generiert wird- Daher können wir auch keine klare Empfehlung aussprechen, diese Variable zu benutzen oder zu verwerfen. Auf der Doku-Seite der SC6 gibt es unter https://www.neps-data.de/Portals/0/NEPS/Datenzentrum/Forschungsdaten/SC6/Feldversionen/wave1-2/infas_Dokumentation_Pruefmodul_20120427.pdf auf Seite 31 ein paar Anmerkungen zu "Nebenher"-Episoden. Da die Logik des Prüfmoduls für alle Startkohorten als ähnlich/gleich angenommen werden kann kann man das auch analog auf die SC5 beziehen.

Ich persönlich würde dieser Variable nicht das höchste Gewicht beimessen. Bzgl. der Syntax kann man zumindest die Duplikate einer Person pro Startdatum eleminieren, wenn man die Syntax folgendermaßen abändert:

* Nebenereignisse auf die Zeiten kürzen, die nicht von Hauptereignissen abgedeckt sind
**************************************************************************************
tab spms
bysort ID_t (spell_chron): replace ts = te[_n-1]+1 if spms==2 
	bysort ID_t (spell_chron): replace te = ts[_n+1]-1 if spms==2 & _n!=_N  
replace ts = ym(2005,9) if ts == .
replace te = ym(2010,8) if te == .
drop if ts > te
tab spms

der Zusatz _n!=_N in Code-Zeile 5 bewirkt, dass te nur ersetzt wird, wenn es sich nicht um den letzten Spell einer Person handelt, ansonsten wird te im letzten Spell pro Person mit System Missings befüllt, sodass man dann in Folge keine Spelldauern mehr hat.

 

Nun geht es darum, die Duplikate in ts (Anfangszeitpunkt von Spells) zu eleminieren. Wenn man die Dauer des Spells berechnet, kann man im Fall von Duplikaten (=gleichzeitiger Beginn von mehreren Episoden), die längste Episode behalten.

* neuer chronologischer Laufindex
*************************** 
duplicates tag ID_t ts, gen(dup_id_start)  // Zur Veranschaulichung: indexiert alle Personen mit mehreren gleichen Startzeiten
gen duration=te-ts  // Spelldauer generieren, Vorschlag: längste Dauer wird behalten

Leider reicht das in manchen Fällen nicht aus und es gibt selbst Duplikate innerhalb einer Person wenn man Startdatum und Dauer mitteinbezieht (in Stata mit "isid ID_t ts duration" testen), sodass man priorisieren muss, welchen Spell man behalten will. Wie man priorisiert, muss nach inhaltlichen Kriterien entschieden werden. Wenn man den längsten Spell behalten will, sollte man die höchste Priorisierung auch dem Spelltyp mit der höchsten Ausprägung in einer Variable behalten:

gen priority=.
replace priority=10 if sptype==22
replace priority=9 if sptype==24
replace priority=8 if sptype==36
replace priority=7 if sptype==26
replace priority=6 if sptype==25
replace priority=5 if sptype==29
replace priority=4 if sptype==23
replace priority=3 if sptype==27
replace priority=2 if sptype==30
replace priority=1 if sptype==99

// damit werden alle Duplikate in dup_idts gelöscht >> ID_t + ts sind nun unique Identifier
bysort ID_t ts (duration priority) : drop if _N!=_n  //Spell mit höchster Dauer und höchster Priorisierung behalten
isid ID_t ts //check, ob es noch Duplikate gibt

In diesem Beispiel würde der Schule die höchste Priorität zugewiesen werden und Lückenepisoden die geringste. Das alles ist ziemlich willkürlich und vielleicht gibt es auch bestimmte Gründe, warum man nicht den längsten Spell nehmen oder ein Spelltyp dem anderen vorziehen sollte. Damit könnte man sich Verzerrungen einhandeln. Man kann auch versuchen das Verfahren zu randomisieren.

Falls einer der hier mitlesenden weiterhelfen kann, darf/dürfen diese Person(en) gerne in die Diskussion einsteigen.

 

Zu 2.)

Ich oder meine Kollegen haben bisher leider keine Erfahrungen im Umgang mit newspell sammeln können. Vielleicht löst sich das Problem mit der Eliminierung von Duplikaten? Auch hier bitte ich die Scientific Community gerne um Hilfe.

 

Viele Grüße und noch viel Erfolg

Dietmar