English (United States) Deutsch (Deutschland)

    SC4: Merge Biography mit pTarget

    Liebes NEPS-Forum,

    ich arbeite aktuell daran, die beruflichen Bildungsverläufe selbst zugewanderter Gruppen zu analysieren und arbeite mich in das Aufbereiten des Biographiedatensatzes ein. Mir ist nicht ganz klar, wie ich nun den Biographiedatensatz mit pTarget mergen kann.

    Folgenden Code verwende ich, um den Biographiedatensatz vorzubereiten.

    * set up information for -nepsuse-
    * adjust file path to your setup
    global NEPSuse_directory "C:\Daten\NEPS SC4\SC4_D_9-1-0\Stata14"
    global NEPSuse_cohort SC4
    global NEPSuse_version 9.1.0
    global NEPSuse_level D
    global NEPSuse_language en
    
    * we will need some temporary variables and datasets, so tell Stata
    tempfile biography
    tempvar expandmarker
    
    * open up Biography dataset
    nepsuse `"Biography"' , clear
    
    * bloat up dataset to one observation per month
    generate startdate=ym(starty,startm)
    generate enddate=ym(endy,endm)
    drop if (missing(enddate) | missing(startdate)) // we can't use episodes without date information
    generate duration=enddate-startdate+1
    expand=duration , generate(`expandmarker')
    generate month=.
    generate monthnum=.
    bysort ID_t splink (`expandmarker') : replace monthnum=_n-1
    replace month=startdate+monthnum
    format startdate enddate month %tm
    
    * double check and drop temporary variable
    assert startdate==month if (!`expandmarker')
    assert enddate==month if (!`expandmarker'[_n+1] | missing(`expandmarker'[_n+1]))
    drop `expandmarker'

    Ich wäre für jeden Tipp dankbar.

    Mit freundlichen Grüßen

    Robin

     


    Edit DS: Syntax-Highlighting eingefügt

    Edit DS: Tags hinzugefügt.

    gefragt vor 02.07.2018
    Robin23
    Robin
    bearbeitet vor 13.12.2018
    Simon Dickopf77
    Simon Dickopf

    comments

    10 Antworten

    Diese Antwort wurde von dem/der ErstellerIn der Frage als die beste Antwort markiert.

    Lieber Robin,

    Designbedingt fehlend sind viele Fälle nur deswegen, weil in späteren Wellen die Variable nicht mehr erhoben worden ist. Die Zeile 

    drop if t40503m==-54 // entferne "designbedingt fehlend"

    ist in meinem Beispiel oben nur der schnellste Weg, dafür Sorge zu tragen, dass es nur noch eine Zeile pro Befragter gibt. Bei mehreren Variablen kommst du so einfach nicht dran, da ja die Missings (wahrscheinlich) unterschiedlich verteilt sind. Entweder, du führst diesen Schritt für jede Variable einzeln aus, speicherst jeweils einen Datensatz und mergest dann diese 3 Datensätze an den Arbeitsdatensatz. Da du aber in deinem Beispiel wieder an pTarget mergest, gehe ich davon aus, du hättest gerne einen pTarget-Datensatz, in dem die Missings in späteren Wellen aufgefüllt sind. Das geht z.B. auch dadurch, indem du die Werte einer früheren Welle in eine spätere reinkopierst (sofern vorhanden):

    use pTarget.dta, clear
    tab t400500_g1 wave, miss // die Verteilung zeigt die meisten Werte in Welle 1
    foreach var in t700031 t70004m t70004y t400500_g1 {
       // der Befehl nepsmiss wandelt negative Werte in Stata-Missings um
       // ohne ihn funktioniert es auch, dann muss nur die Filterbedingung unten
       // (if ...) angepasst werden
       nepsmiss `var' 
    
       // sortiere nach ID und Welle und ersetze innerhalb dieser Gruppe
       // einen fehlenden Wert durch den Wert aus der darüberliegenden ("_n-1") Zeile
       bysort ID_t (wave): replace `var'=`var'[_n-1] if missing(`var')
    }
    tab t400500_g1 wave, miss // vorhandene Werte wurden in spätere Wellen kopiert

    Ich hoffe das hilft!

    Tobias

    beantwortet vor 30.08.2018 Tobias Koberg 217
    Tobias Koberg
    • Lieber Tobias eine Rückfrage habe ich noch. Das mit dem Auffüllen ist ein sehr hilfreicher Befehl. Besteht denn ebenfalls die Möglichkeit immer nur die erste Beobachtung auszuwählen. Und zwar möchte ich eine Variable generieren, die mir sagt, in welcher Episode eine Person zum ersten Mal in den Arbeitsmarkt übergeht. Hierzu ist sicherlich mit einem IF-Befehl zu arbeiten:
      *** Generie ersten Eintritt in berufliche Ausbildung ***
      gen voc_first=.
      foreach var in voc_first {
      replace voc_first=epinr if sptype == 24
      }

      Leider wird hierbei nicht nur die erste Beobachtung, sondern eben alle Beobachtung mit sptype==24 ausgeworfen.

      Hast du eine Idee? - Robin 05.10.2018

    Lieber Robin,

    das Problem sind die unterschiedlichen Strukturen: Biography ist ein Episodendatensatz, bei pTarget handelt es sich um Paneldaten. Du schreibst leider nicht, welche Daten aus pTarget du ranspielen möchtest. Wenn es sich um letztliche Querschnittsinformationen handelt (z.B. Geburtsland), reicht es, den Datensatz pTarget so zu selektieren, dass du für jede Person nur noch eine Zeile im Datensatz hast, also etwa so (Syntax ungetestet):

    nepsuse pTargetCATI, clear
    keep if wave==1 // damit ist ID_t der alleinige Identifikator in pTarget
    tempfile ptc
    save `ptc'
    
    nepsuse Biography, clear
    merge m:1 ID_t using `ptc'

    Falls du an tatsächlichen Panelinformationen interessiert bist (d.h. Variablen, die sich Welle für Welle ändern können), müsstest du vorher das Interviewdatum bzw. den Monat des Interviews aus dem Methodendatensatz/CohortProfile an pTarget anspielen. Dann kannst du über diesen Monat an deinen Biography ranspielen.

    Hoffe das hilft dir!

    Beste Grüße,

    Tobias

    beantwortet vor 05.07.2018 Tobias Koberg 217
    Tobias Koberg

    Lieber Tobias,

    ganz herzlichen Dank für deine Hilfe. Das hiflt mir ein ganzes Stück weiter.

    Zu deiner Frage: Ich möchte die Variablen t40503y und t40503m an Biography anspielen. Somit spiele ich Querschnittsinformationen an den Datensatz heran. Das dürfte mit dem nachfolgenden Code (hoffentlich fehlerlos) soweit geklappt haben. Mich interessieren die Lebensverläufe selbst zugewanderter Personen. Erwarten würde ich, dass der Lebensverlauf erst nach der Zuwanderung erhoben wird (vielleicht liegt auch schon ein Fehler in der Annahme). Es gibt jedoch eine Menge Fälle, bei denen auch schon vor der Zuwanderung Episoden vorliegen.

    Ein fiktives Beispiel zum besseren Verständnis: Eine Person wandert 1998 zu, geht jedoch seit 1991 zur Schule.

    Wie ist das möglich? Wurde hier der Schulbesuch im Ausland erhoben?

    Ganz herzliche Grüße

    Robin

    ********************************************************************************
    * Preparation: pTarget	
    ********************************************************************************
    
    use "${data}\SC6_pTarget_D_${SUF}.dta", clear
    keep if wave==1 // damit ist ID_t der alleinige Identifikator in pTarget
    keep ID_t splink t40503y t40503m
    save "${project}\pTarget.dta", replace
    
    *********************************************************************************
    * Step 1: Split into monthly structure: Expand, identify multiple months, reshape
    
    FROM: ***** Kai, Corinna, 24.01.2016 ******     
    *********************************************************************************
    *Use Biography-Data 
    use "${data}\SC6_Biography_D_${SUF}.dta", clear
    nepsmiss _all
    
    * Check and adjust data variables
    fre starty endy startm endm
    egen missy = rowmiss(starty endy)
    egen missm = rowmiss(startm endm)
    fre missy
    
    * Drop spells with missing date information
    drop if missy>0 | missm>0
    drop missy missm
    
    *Generate a new starting and ending variable (time format: yearmonth)
    gen start = ym(starty,startm)
    gen end = ym(endy,endm)
    format start end %tm
    lab var start "Monthly starting date (months since Jan 1960)"
    lab var end "Monthly ending date (months since Jan 1960)"
    
    *Generate and check the duration of each spell 
    gen dur = end-start+1
    sum dur, detail // no negative values or 0 durations
    
    *Drop unnecessary variables
    drop wave splast-endy
    
    *Count number of episodes by person
    sort ID_t start end 
    by ID_t: gen epinr = [_n]
    lab var epinr "Episode number"
    fre epinr // up to 62 episodes per person
    
    *Expand data by duration of episodes
    sort ID_t start end
    expand dur
    sort ID_t epinr
    
    *Counter for month number by person
    by ID_t epinr: gen monnr = [_n]
    
    *Generate a month variable containing each month of episodes
    gen month = start+monnr-1
    
    *Counter for multiple months
    *For similar months, first sort by module (sptype) and then by spell number
    sort ID_t month sptype splink
    by ID_t month: gen monthnr = [_n]
    
    *Check and drop strange cases
    fre monthnr // maximum 15 similar spells, but only some cases with >6 spells
    list if monthnr>6 // only one person --> errors in biography: see biography-file
    drop if ID_t==8007327 
    drop monthnr
    *NOTE: if you work with more recent SUF-versions, there might be more than 
    *6 parallel events for a month. In this case syntax structure has to be modified 
    *(e.g. lines 284-286) 
    		 
    *For improving usability, sort information of multiple months 								
    *sort order: 
    *a) dominant event prior to side event
    *b) Spell types, which allow no parallel events prior to others
    
    *First recode sptype in a new order 
    recode sptype 22=2 23=4 24=3 25=1 26=8 27=5 29=6 30=7 99=9, gen(spsort)
    *Then order first by a) and then by b) 
    sort ID_t month spms spsort splink 
    drop spsort
    by ID_t month: gen monthnr = [_n] 
    
    ********************************************************************************
    * Step 2: Merge information from p-datasets 
    ********************************************************************************
    
    merge m:1 ID_t using "${project}\pTarget.dta",
    nepsmiss t40503y t40503m
    
    * Check and adjust data variables
    
    egen misszuwy = rowmiss(t40503y)
    egen misszuwm = rowmiss(t40503m)
    fre misszuwy
    
    * Drop spells with missing date information
    drop if misszuwy>0 | misszuwm>0
    drop misszuwy misszuwm
    
    gen zuwstart = ym(t40503y,t40503m)
    format zuwstart %tm
    lab var zuwstart "Monthly starting immigration date (months since Jan 1960)"
    
    save "${project}\sc6bio.dta", replace
    
    
    

     

     

    beantwortet vor 09.07.2018 Robin 23
    Robin

    Liebes NEPS Forum,

    mir ist jetzt noch nicht so ganz klar wie ich Panelinformationen aus Education an das Masterfile Biography anspielen kann:

    Variable aus Datensatz Education: tx28101

    Ich habe das Biography File im Monatsformat aufbereitet und möchte wissen, in welchem Monat ein Befragter welchen Casmin hat.

    Vielen Dank für die Hilfe.


     

    beantwortet vor 19.12.2018 Robin 23
    Robin

    Hi Jonas!

    Du stolperst hier über unser Erhebungsdesign, welches leider in den Daten immer noch nicht so gut dokumentiert ist, wie es seien sollte:

    Solange die Schüler noch in die ursprünglich gesampelte Klasse gehen (wir sprechen in unseren Daten dann von "Hauptfeld") werden sie in der Schule via PAPI befragt. Erst sobald sie diese Klasse verlassen haben (aus unterschiedlichen Gründen, z.B. Abschluss, Schulwechsel, Schulartwechsel,Wiederholen, etc.) werden sie individuell befragt; dann zum Großteil via Telefon (CATI). Siehe Variable tx80230 "Panel Frame" in CohortProfile.

    Aus diesen CATI-Interviews resultieren u.a. die Datensätze TargetMethods und spSchool. Du hast also in diesen Dateien nur Daten von Personen, die so lange Teil der Befragung waren, dass sie an einem CATI teilgenommen haben. Im Datensatz pTarget hingegen sind die Daten aus den PAPI-Befragungen sowie Inhalte aus den Online-Erhebungen (CAWI) und CATI-Befragungen, die dazu passen (also z.B. die Panelerhebung von bestimmten Inhalten, die PAPI gestartet wurden und dann im CAWI weitererhoben wurden). Die Überschneidung TargetMethods/pTarget existiert also nur dann, wenn in derselben Welle für eine Person sowohl PAPI/CAWI als auch CATI Daten vorliegen. Darum diese relative geringe Fallzahl.

    Für deine Fragestellung ist das aber ja zunächst nicht so entscheidend, weil du ja weniger am Panelverlauf direkt interessiert bist. Wenn ich es richtig verstehe, benötigst du zwei Querschnittsinformationen:
    a) Welche Schulart besuchte das Kind in der neunten Klasse?
    b) Wann besucht das Kind nicht mehr diese Schule?

    Ich würde versuchen, für diese beiden Fragestellung jeweils einen Querschnittsdatensatz zu erzeugen.

    spSchool zu verwenden ist sicher ergiebig, leider hast du hier das o.g. PAPI/CATI-Problem, d.h., nur Schüler, die am CATI mitgemacht haben, haben ihre Schulhistorie hier berichtet. Du könntest außerdem noch spParentSchool zu Rate ziehen, das ist die von den Eltern berichtete Schulgeschichte. Die hingegen ist allerdings nur vorhanden, sofern die Eltern an der Befragung teilgenommen haben. Starten könntest du ja erstmal mit den Daten aus CohortProfile. Hier gibt es z.B. die Variablen tx80234 "Hauptfeld: Klassenstufe" und t723080_g1 "aktuelle Schulform (konstruiert)".

    beantwortet vor 14.09.2018 Tobias Koberg 217
    Tobias Koberg

    Hallo Tobias, 

    da du mir bereits mit deinem vorherigen Post extrem weiter geholfen hast, hoffe ich, dass du mir noch eine weitere Frage beantworten wirst. Ich glaube nämlich, dass ich deinen Input gegenwärtig sehr gut gebrauchen kann. Entschuldigung, es wird etwas länger...

    Was habe ich vor: Ich möchte zuallererst herausfinden ob Schülerinnen und Schüler zum Erhebungszeitpunkt (d.h. 3. Welle) in einer allgemeinbildenden Schule waren um dann in einem nächsten Schritt zu bestimmen wer von diesen Schülerinnen und Schüler in die gymnasiale Oberstufe gewechselt ist und wer einen anderen Bildungsweg eingeschlagen hat. Was der oder die Schüler*in nach Verlassen der allgemeinbildenden Schule macht ist für mich irrelevant. Ich möchte quasi eine Dummy  Variable (0 "hat die Schule verlassen"   1 "ist in die gymnasiale Oberstufe gewechselt") die nur unterscheided ob ein Schüler bzw. eine Schülerin nach der 10. Klasse unmittelbar mit der Schule weitermacht oder nicht.

    Ich bin bisher davon ausgegangen, dass ich dafür die Informationen aus den Episodendatensatz spSchool an den Biographiedatensatz heranspiele, die für mich relevanten Variablen herauspicke – ich habe jetzt an ts11204 und ts11209 gedacht,  den Datensatz speicher und ihn anschließend mit dem Paneldatensatz CohortProfile merge.

    Folgendes habe ich diesbezüglich unternommen: Erstens, Datensatz spSchool mit Biographiedatensatz mergen, Stata-Datumsvariable erzeugen, Episodendauer berechnen, monatsgenaue Abbildung erstellen und die einzelnen Monate datieren. Quasi alle Schritte, die du mir in deinem letzten Post mit an die Hand gegeben hast.

     

    *-------------------------------------------------------
    * Schritt 1: spSchool & Biography mergen u. aufbereiten
    *-------------------------------------------------------
    
    // Datensatz spSchool laden
    local spvar ID_t wave splink subspell ts11209 ts11204 tf11218
    use `spvar' using "${Data}/SC4_spschool_D_9-1-0.dta", clear
    keep if subspell == 0	// subspells löschen
    drop subspell			// variable subspell droppen
    
    
    // Merge mit Biographiedatensatz
    merge 1:1 ID_t splink using "${Data}/SC4_Biography_D_9-1-0.dta", ///
    	keep(match) keepusing(splast starty startm endy endm sptype) nogen // -> 34,489 matches
    keep if sptype == 22	// nur School Spells behalten
    keep if splast == 2		// nur abgeschlossene Spells verwenden
    drop sptype splast
    
    
    // eruzeuge Stata-Datumsvariable
    gen sdate = ym(starty, startm)
    gen edate = ym(endy, endm)
    format sdate edate %tm
    drop if (missing(edate) | missing(sdate)) 
    
    
    // berechne die Dauer einer Episode
    gen dur = edate - sdate +1
    list ID_t starty startm sdate endy endm edate dur in 1/20, sepby(ID_t) noobs
    
    
    // erzeuge für jeden Monat eine Zeile
    expand dur
    
    
    // erstellte Monate datieren
    bysort ID_t splink: generate curdate = sdate + _n-1
    format curdate %tm
    list ID_t starty startm sdate endy endm edate dur curdate in 1/100, ///
    	sepby(ID_t splink) noobs
    
    
    // Duplikate entfernen
    * ...
    
    
    // Datensatz speichern
    save "${Prepdata}/Biodata.dta", replace

     

    Zweitens, den Datensatz CohortProfile mit dem Methodendatensatz TargetMethods verschmolzen um so die Merge-Variable curdate im Datensatz CohortProfile erstellen zu können. Anschließend habe ich dann den zuvor bearbeiteten Datensatz Biodata.dta mit dem Datensatz CohortProfile gemerged.

     

    
    // Datensatz CohortProfile laden
    local cohortvar ID_t wave t723080_g1 tx80106
    use `cohortvar' using "${Data}/$CohortProfile", clear
    drop if tx80106==7	// Sonderschüler*innen droppen
    
    
    // Merge mit TargetMethods
    merge 1:1 ID_t wave using "${Data}/SC4_TargetMethods_D_9-1-0.dta", ///
    	keep(3) nogen keepusing(intm inty)
    
    
    // erzeuge Stata-Datumsvariable
    gen curdate = ym(inty, intm)
    format curdate %tm
    drop if missing(curdate)
    
    
    
    *-----------------------------------------------------------------
    * Schritt 3: Informationen aus Biodata an CohortProfile anspielen
    *-----------------------------------------------------------------
    
    // Merge CohortProfile mit Biodata
    merge 1:m ID_t curdate using "${Prepdata}/Biodata.dta", nogen keep(1 3) ///
    	keepusing(ts11209 ts11204 tf11218)
    list ID_t wave
    

     

    Was ich allerdings nicht verstehe und wobei ich deine Hilfe bzw. deinen Input bräuchte ist folgendes:

    1. Wieso verliere ich so viele Fälle? 
      Im Grunde genommen bin ich an den Variablen im Datensatz pTarget und pParent interessiert. Wenn ich den Datensatz pTarget mit dem Datensatz CohortProfile merge habe ich 55,158 Matches. Wenn ich den Datensatz CohortProfile mit TargetMethods merge habe ich 59,668 matches. Fälle die sowohl aus dem Datensatz TargetMethods als auch pTarget gematcht werden können sind lediglich noch 6,164 Fälle. Wenn ich zusätzlich berücksichtige dass ich Informationen aus dem pTarget Datensatz brauche, dann befürchte ich dass ich letztlich überhaupt keine Fälle mehr habe. Oder mach ich in meinen Gedanken und in meiner Vorgehensweise irgendwo einen Fehler den ich nicht sehe?
    2. Hast du eine Idee wie ich die von mir gewünschte Dummy Variable am besten aus dem Datensatz spSchool herausziehen/aggregieren kann. Ich bin im Moment nämlich ehrlich gesagt ein bisschen ratlos. Wahrscheinlich ist das Problem relativ einfach nur ich sehe gerade die Lösung nicht.

    Beste Grüße und nochmal danke für deine Hilfe

    Jonas

    beantwortet vor 11.09.2018 Jonas J 4
    Jonas J
    bearbeitet vor 11.09.2018
    Jonas J4
    Jonas J

    Hi Jonas, willkommen im Forum!

    Deine Frage ist leider nicht so einfach zu beantworten, da es sehr stark davon abhängt, welche Variablen dich genau interessieren und was du damit machen möchtest. Ganz abstrakt beschrieben ist das Problem hier das Vorhandensein von sowohl Zeitpunkten als auch Zeitspannen, die sich eben nicht eins zu eins aufeinander abbilden lassen.

    Ich versuche das mal an einem Beispiel zu verdeutlichen, entschuldigung, es wird etwas länger...

    Datensatz A ist ein Längsschnittdatensatz im Wellenformat (also vergleichbar mit unseren Datensätzen pTarget, CohortProfile, etc.). L1 ist das Längschnittsmerkmal Familienstand, zur Verfügung steht neben der Wellenvariable wave auch noch der Interviewzeitpunkt int (als Jahr, Monat, Tag).

    
    clear
    input id wave inty intm intd       str20 L1
           1    1 2017    9   23        "ledig"
           1    2 2018    6   11  "verheiratet"
           2    1 2017    9   21        "ledig"
           2    2 2018    5   29   "geschieden"
    end
    tempfile A
    save `A'
    

    Datensatz B ist ein Datensatz im Episodenformat, vergleichbar also mit Biography und den Spellmodulen (spEmp, etc.). Neben dem Episodenidentifikator spell gibt es auch noch den Start und Endmonat der jeweiligen Episode, außerdem das Episodenmerkmal S1 Beschäftigungsverhältnis.

    
    clear
    input id spell starty startm endy endm     str20 S1
           1     1   2017      1 2017    7   "vollzeit"
           1     2   2017      8 2017   11 "arbeitslos"
           1     3   2017     12 2018    6   "teilzeit"
           2     1   2016     11 2017    4   "vollzeit"
           2     2   2017      5 2018    6   "vollzeit"
     end
    tempfile B
    save `B'
    

    Die Frage ist nun: Wie bekomme ich die beiden Datensätze zusammengespielt bzw. die Information in beiden konsolidiert? Um das zu erreichen gibt es nur leider viele unterschiedliche Herangehensweisen, und je nachdem, wie die weitere Analyse aussieht, muss man ggf. Annahmen und Entscheidungen anders treffen. Ein paar Beispiele (ohne Anspruch auf Vollständigkeit!):

    1. Der einfachste Weg ist wahrscheinlich, die Daten auf Querschnitte zu verdichten. Möglicherweise ist das ja für die eigene Analyse ausreichend. Im Beispiel oben z.B. nur die Antwort auf die Frage "War die Person jemals verheiratet" bzw. "War die Person jemals arbeitslos"

     

    ** erzeuge einen Querschnittsdatensatz aus A
    use `A', clear
    ** Der Wert L1=="verheiratet" ist entweder 1 (falls verheiratet)
    ** oder 0 (falls nicht verheiratet). 
    ** Die Funktion 'bysort id: egen .. = max(..)' erzeugt eine Variable,
    ** die das Maximum dieses Wertes innerhalb der id beinhaltet (in allen Zeilen)
    bysort id: egen married=max(L1=="verheiratet")
    list
    /*
      +-----------------------------------------------------------------+
      | id   spell   starty   startm   endy   endm           S1   unemp |
      |-----------------------------------------------------------------|
      |  1       1     2017        1   2017      7     vollzeit       1 |
      |  1       2     2017        8   2017     11   arbeitslos       1 |
      |  1       3     2017       12   2018      6     teilzeit       1 |
      |  2       1     2016       11   2017      4     vollzeit       0 |
      |  2       2     2017        5   2018      6     vollzeit       0 |
      +-----------------------------------------------------------------+
    */
    keep id married
    duplicates drop
    list
    tempfile A_QS
    save `A_QS'
    
    ** erzeuge einen Querschnittsdatensatz aus B
    use `B', clear
    bysort id: egen unemp=max(S1=="arbeitslos")
    list
    keep id unemp
    duplicates drop
    list
    tempfile B_QS
    save `B_QS'
    
    ** beide Datensaetze zusammenspielen
    use `A_QS', clear
    merge 1:1 id using `B_QS', nogen
    list
    /*
      +----------------------+
      | id   married   unemp |
      |----------------------|
      |  1         1       1 |
      |  2         0       0 |
      +----------------------+
    */
    

     

    2. Die Daten der zum jew. Interviewzeitpunkt gültigen Episode an den Welleneintrag des Längschnittdatensatz anspielen (also die Information aus B rauspicken, die zur entsprechenden Zeile in A passt).

    use `B', clear
    ** erzeuge Stata-Datumsvariablen
    gen sdate = ym(starty, startm)
    gen edate = ym(endy, endm)
    format sdate edate %tm
    ** berechne die Dauer einer Episode (in Monaten)
    gen dur   = edate - sdate +1
    list, noobs
    ** erzeuge fuer jeden Monat eine Zeile
    expand dur
    ** erzeuge das Datum dieses Monats
    bysort id spell: generate curdate = sdate + _n-1
    format curdate %tm
    list in 1/8, sepby(id spell) noobs
    /*
      +--------------------------------------------------------------------------------------------+
      | id   spell   starty   startm   endy   endm           S1    sdate     edate   dur   curdate |
      |--------------------------------------------------------------------------------------------|
      |  1       1     2017        1   2017      7     vollzeit   2017m1    2017m7     7    2017m1 |
      |  1       1     2017        1   2017      7     vollzeit   2017m1    2017m7     7    2017m2 |
      |  1       1     2017        1   2017      7     vollzeit   2017m1    2017m7     7    2017m3 |
      |  1       1     2017        1   2017      7     vollzeit   2017m1    2017m7     7    2017m4 |
      |  1       1     2017        1   2017      7     vollzeit   2017m1    2017m7     7    2017m5 |
      |  1       1     2017        1   2017      7     vollzeit   2017m1    2017m7     7    2017m6 |
      |  1       1     2017        1   2017      7     vollzeit   2017m1    2017m7     7    2017m7 |
      |--------------------------------------------------------------------------------------------|
      |  1       2     2017        8   2017     11   arbeitslos   2017m8   2017m11     4    2017m8 |
      +--------------------------------------------------------------------------------------------+
     */
    tempfile B_exp
    save `B_exp'
    
    use `A', clear
    ** erzeuge Stata-Datumsvariable
    gen curdate = ym(inty, intm)
    format curdate %tm
    ** spiele die Information aus dem monatsgenauen Datensatz von oben an
    merge 1:m id curdate using `B_exp', nogen keep(master match) keepusing(S1)
    list, noobs
    tempfile A_S1
    save `A_S1'
    

     

    3. Die Episodendaten in B mit Daten aus A anreichern. Hier fangen die Probleme an. Hierzu muss ich die Episode identifizieren, in deren Spanne das Interviewdatum liegt. Aber: Was bedeutet das für Episoden, für die kein Interviewzeitpunkt vorliegt (im Beispiel oben spell 1)? Was bedeutet das für den Zeitraum, der zwar innerhalb der identifizierten Episode, aber nicht genau auf dem Interviewzeitpunkt liegt (Im Beispiel oben die Monate August, Oktober, November 2017 in Episode 2 von id 1)? Fehlen offensichtliche Daten und wie kann ich damit umgehen (im Beispiel oben: Wann war Person 2 verheiratet?). Mit der nachfolgende Syntax kann man sich das anschauen, allerdings sind jetzt die Daten weder im Panel- noch im Episodenformat (sondern monatsgenau), und müssen, so man denn mit einem dieser Format arbeiten möchte, erst wieder zusammengefasst werden.

    
    use `B_exp', clear
    merge m:1 id curdate using `A_S1', nogen keepusing(L1)
    list
    

     

    Kombinationen dieser unterschiedlichen Ansätze sind natürlich auch möglich. So macht es wahrscheinlich in vielen Fällen Sinn (und so verstehe ich deine Frage auch), Daten aus den Spellmodulen soweit zu reduzieren bzw. zu aggregieren (siehe 1.), dass sie problemlos an Längsschnitt- oder Querschnittsdaten angespielt werden können (siehe 2.).

    Hoffe das hilft dir weiter!

    Tobias

    beantwortet vor 07.09.2018 Tobias Koberg 217
    Tobias Koberg

    Hallo Robin, hallo Tobias,

    zuallererst möchte ich mich bei euch für die hilfreieche Diskussion inklusive Code in diesem Thread bedanken. Euer kleiner Austausch hat mir in meiner Datenaufbereitung der SC4 bereits jetzt sehr viel geholfen.

    Eine Frage habe ich dann allerdings doch: Tobias, du schreibst weiter oben in diesem Thread, dass man "das Interviewdatum bzw. den Monat des Interviews aus dem Methodendatensatz/CohortProfile an pTarget anspielen" muss um dann in einem nächsten Schritt den Datensatz pTarget an den Datensatz Biography anspielen zu können. Ich hoffe das habe ich richtig verstanden.

    Jetzt meine Frage: Hast du, oder du Robin, für diesen Schritt vielleicht einen Stata Code für mich oder einen Ausschnitt damit ich die Vorgehensweise nachvollziehen und selbst replizieren kann?

    Edit: D.h. ich möchte nicht wie im obigen Beispiel die Querschnittsinformationen aus pTarget an den Biography Datensatz anspielen, sondern ich beabsichtige den umgekehrten Weg zu gehen und Informationen aus dem Biography Datensatz (bzw. dort angespielten Spellfiles) in den pTarget Datensatz zu transferieren. Mein Ziel ist es die Panelstruktur zu behalten.

    Ihr würdet mir damit einen großen Dienst erweisen und mir helfen die Vorgehensweise zu verstehen.

    Beste Grüße,

    Jonas

    beantwortet vor 05.09.2018 Jonas J 4
    Jonas J
    bearbeitet vor 05.09.2018
    Jonas J4
    Jonas J
    • Hallo Tobias,

      du hast mich vollkommen richtig verstanden. Beispiel 1 bzw. Beispiel 2 aus deinem Post sind genau der richtige Input der mir gefehlt hat. Vielen Dank für deine ausführlichen Erklärungen. Sie haben mir sehr geholfen!

      Grüße und nochmals besten Dank

      Jonas - Jonas J 09.09.2018

    Lieber Tobias,

    eine Rückfrage hätte ich: Ich arbeite nun ebenfalls mit der SC4 und versuche dort den Generationsstatus über die Variable t400500_g1 an das Masterfile (SC4_Biography_D_${SUF}.dta) anzuspielen. Jedoch gibt es viele designbedingte Missings bei dieser Variable, sodass bei vielen Befragten keine Informationen über den Generationsstatus vorliegen. Gibt es eine andere "ertragreichere" Alternative? 

    Folgenden Befehl verwende ich fürs Aufbereiten und Mergen.

    *Aufbereiten pTarget Datensatz
    use "${data}\SC4_pTarget_D_${SUF}.dta", clear
    keep ID_t wave t700031 t70004m t70004y t400500_g1
    isid ID_t wave
    drop if t400500_g1==-54 /Ausschluss designbedingter Missings
    save "${project}\pTarget.dta", replace
    
    
    *Hier wird der Biografie-Datensatz aufbereitet
    *...........
    
    
    *Merge pTarget Datensatz
    merge m:1 ID_t wave using "${project}\pTarget.dta",
    nepsmiss t700031 t70004m t70004y t400500_g1
    drop _merge
    

     

    beantwortet vor 29.08.2018 Robin 23
    Robin
    bearbeitet vor 29.08.2018
    Robin23
    Robin

    Lieber Robin,

    vielen Dank für die umfangreiche Syntax, ich habe sie jetzt nicht überprüft, sie sieht aber sehr vernünftig aus! Deine Frage beantwortest du dir ja schon selbst: Lebensverlaufsepisoden in der SC6 wurden/werden retrospektiv erfasst (am Zeitpunkt des Interviews) und sind somit unabhängig vom Datum der Zuwanderung.

    Vielleicht noch ein Hinweis: Wenn du die Variablen t40503y/m mit wave kreuztabellierst, siehst du, dass es auch noch Fälle in anderen Wellen gibt, nämlich in Welle 2 (Nacherhebung) und Welle 4 (Aufstockung). Das ist auch eine nicht zu vernachlässigende Population. Wahrscheinlich willst du diese auch noch mitnehmen? Einfachster Weg wäre z.B.

    use pTarget.dta
    keep ID_t wave t40503y t40503m
    drop if t40503m==-54 // entferne "designbedingt fehlend"
    isid ID_t // Datensatz ist jetzt ein Querschnitt
    fre wave // jedoch kommt die Information aus verschiedenen Wellen
    drop wave

    Alles Gute!

    beantwortet vor 10.07.2018 Tobias Koberg 217
    Tobias Koberg

    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...