Liebe Laura.
Vielen Dank für deine Nachricht.
Ohne ein wenig detaillierter zu wissen, was du aus den jeweiligen Datensätzen zu welchem Zwecke zusammenbringen möchtest, kann ich leider nur anhand deiner paar Syntaxzeilen Vermutungen anstellen und versuchen, dir zumindest anhand derer schonmal ein paar Tipps zu geben:
(1) Ganz grundsätzlich vorneweg: Der Datensatz “Basics” ist eigentlich nur dazu gedacht, sich schnell einen kurzen Überblick über die Datenlage zu verschaffen. Er sollte allerdings in vermutlich 99.9% der Fälle NICHT für Analysen herangezogen werden, da man darin immer nur die letztbekannte Information findet, die bei unterschiedlichen Person aus vollkommen unterschiedlichen Befragungswellen stammen können. Ausnahmen bestätigen die Regel und wenn du weißt, was du tust und warum, ist alles fein.
(2) Du versuchst anscheinend soetwas wie ein Monatssplitting der Erwerbsepisoden. Ich kann nicht herauslesen, wie du auf diesen Schritt gekommen bist, aber vielleicht benutzt du hier mal im Forum die Suchfunktion und schaust dir ein paar andere Beiträge zu dem Thema an. Auf Basis deiner Syntax komme ich zu der Vermutung, dass du versuchst, eine Art Indikatorvariable zu erstellen, ob eine Person zum Interviewzeitpunkt erwerbstätig war, richtig? Ich muss zu meiner Schande gestehen, dass ich in nunmehr 16 Jahren Datenarbeit fürs NEPS die Befehle joinby und collapse derart noch nie verwendet habe und auch gerade daran zweifle, ob dadurch das rauskommt, was du möchtest. Wenn meine obige Vermutung richtig ist, würde ich dir einen einfacheren Weg empfehlen:
(1) VOR dem Monatssplitting ist es wichtig, einen genaueren Blick auf die beiden Monatsvariablen zu werfen. Hier gibt es auch sowas wie Schätzangaben “Jahresanfang” “Frühling” etc, die man mit ein paar Annahmen wieder auf konkrete Monate zurückcodieren könnte, um dann beim expand nicht so viele Fälle zu verlieren.
Das wäre zb möglich über
recode ts2311m ts2312m (21=1) (24=4) (27=7) (30=10) (32=12)
bevor du die Start- und Endzeiten generierst.
(2) Leider ist deine Syntax für mich so nicht lauffähig, weil für die Ausführung des joinby die Variable emp_flag fehlt. Wahrscheinlich hast du da eine Syntaxzeile vergessen, mit in die Nachricht zu kopieren. Ich würde dir aber ohnehin einen anderen Weg als die für mich zweifelhafte Kombination joinby/collapse empfehlen: merge! Bevor man hier jedoch einen merge der Episodenzeiten mit den vorbereiteten Interviewdatumsangaben aus CohortProfile machen kann, muss man sicherstellen, dass in einem der beiden Datensätze die Beobachtungen hinsichtlich der Schlüsselvariablen des merges eineindeutig sind, dh keine Duplikate haben. Es kommt leider in sehr vielen Fällen vor, das eine Person nicht nur einen, sondern gleich mehrere parallele Jobs hat, dh eine Person kann gerade vor dem Zusammenführen mit den CohortProfile Daten mehrere identische Beobachtungen im selben Monat haben. Doch darum können wir uns auch erst später kümmern, wenn wir in deiner Aufbereitung von CohortProfile einfach alle Fälle löschen, in denen kein gültiges Interviewdatum angegeben wurde - was in der SC6 eigentlich immer nur dann der Fall sein kann, wenn eine Person nicht an der Befragung teilgenommen hat. Dazu fügen wir oben die Zeile
drop if missing(int_tm)
ein. Dann können wir einen m:1 merge anhand ID_t und tm durchführen und wir behalten hier NUR die matches. Dann haben wir jeweils für jede Person nur noch (unter Umständen parallele) Erwerbstätigkeitszeilen, die mit einem Interviewdatum übereinstimmen. Um danach jedoch die Wellenvariable sinnvoll weiterbenutzen zu können, müssten wir noch sicherstellen, dass nicht die Information aus spEmp, sondern aus CP benutzt wird. Das liegt am Datenformat von spEMP (Hintergründe hierzu kann ich auf Nachfrage erklären).
merge m:1 ID_t tm using `cp', keep(match) keepusing(wave) nogen
gen employed_in_wave =1 // alle Personen im aktuellen Datensatz sind erwerbstätig
Und wenn ich dich jetzt richtig verstanden habe, möchtest du jetzt pro Person und Welle wissen, ob eine Erwerbstätigkleit vorlag und auch wie viele. Dann könnten wir uns jetzt noch die Jobanzahl pro Welle generieren, indem wir einfach die Anzahl der Duplikate berechnen:
bysort (ID_t wave): gen n_jobs_in_wave = _N
keep ID_t wave employed_in_wave n_jobs_in_wave // zum späteren merge reduzieren
Wenn du allerdings an weiteren jetzt noch im Datensatz befindlichen Variablen wie Erwerbseinkommen, Berufsbezeichnung, Arbeitszeiten etc interessiert bist, so müsstest du dir vergegenwärtigen, dass du zumindest für die eben gelöschten Duplikate dann einen Fehler machst und ggf vorher darüber nachdenken müsstest, ob du gezielt nur einen der parallelen Jobs im Datensatz behältst wie zB denjenigen mit dem höchsten Erwerbseinkommen, mit der höchsten Wochenarbeitszeit etc.
(3) Deine Abschlussmerges kann ich so leider auch nicht überprüfen, weil mir dazu die Variable fe_dur_m fehlt, deren Generierungssyntax du offenbar auch nicht mitkopiert hast. Aber ich glaube, in dem anderen parallelen Thread hierzu habe ich dir dazu Tipps gegeben
(Thread 5241/2)
(4) Wenn ich richtig im Bilde bin, was einen “balancierten Paneldatensatz” angeht, so müsste man dafür für jede Beobachtungseinheit zu jedem Beobachtungszeitpunkt irgendeine Messung oder irgendeinen Datenpunkt vorliegen haben, richtig? Nun, als Befragungspanel liegen uns leider nicht für alle Personen für alle Zeitpunkte Daten vor, weil Personen eben auch mal temporär oder dauerhaft aussteigen. Solltest du dennoch für alle Zeitpunkte Daten benötigen, so müsstest du vermutlich ein paar Dummyvariablen anlegen, die für die fehlenden Datenpunkte dann missing oder 0 sind und dann aber auch deine MergeReihenfolge anpassen und als Ausgangspunkt CohortProfile verwenden, da das der einzige Datensatz ist, in dem du für jede Person für jede Befragung ab Paneleintritt eine Datenzeile findest.
Ich hoffe, ich konnte dir hier zumindest ein wenig weiterhelfen. Bei weiteren Fragen muss ich dich vermutlich wohl auf Mitte Oktiober vertrösten, weil ich mich bis dahin ab kommendem Montag auf Reha befinde.
Beste Grüße und alles Gute,
Benno Schönberger