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