English (United States) Deutsch (Deutschland)

    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

    gefragt vor 4 Monat(en)
    SAS3
    SAS

    comments

    2 Antworten

    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

     

     

     

    beantwortet vor 4 Monat(en) Dietmar Angerer 38
    Dietmar Angerer
    bearbeitet vor 4 Monat(en)
    Dietmar Angerer38
    Dietmar Angerer

    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

    beantwortet vor 4 Monat(en) SAS 3
    SAS
    bearbeitet vor 4 Monat(en)
    SAS3
    SAS

    Ihre Antwort

    Um Beiträge zu erstellen, müssen Sie eingeloggt sein. Hier geht es zum Login

    Ich melde diesen Beitrag,..




    10 Moderator über verbleibende Meldungen informieren

    Ich lösche diesen Beitrag,...




    Ich melde diese Antwort,...




    10 Moderator über verbleibende Meldungen informieren

    Melden eines Beitrags

    Sie haben diesen Beitrag bereits gemeldet. Wenn Sie auf 'Meldung entfernen' klicken, wird die Anzahl der Meldungen für diesen Beitrag um eins verringert.

    Ich lösche diese Antwort, weil...