Hallo Theresa!
warum willst spSchool und spVocTrain mergen? Eigentlich sollten sich die Zeiträume nicht überlappen, da formale Schulbildung und Ausbildungsepisoden nicht gleichzeitig stattfinden - in den allermeisten Fällen.
Allgemeines:
Die verwendeten Analysemethoden entscheiden darüber wie du weiter vorgehen musst. Wenn du eine Ereignisdatenanaylse/Sequenzmusteranalyse machen willst, wirst du wahrscheinlich nur einzelne Variablen aus den pTarget-Datensätzen an die Ereignisdaten anspielen wollen.
Wenn du Panelregressionsmodelle verwendest, wird du wohl Daten aus den Ereignisdaten so zuspielen wollen, dass die Variablen auch in den richtigen Wellen landen.
Wenn du nur Daten aus Ereignisdaten brauchst, aber keine Daten aus den pTarget-Datensätzen, kannst du auf den Wellenindikator verzichten. Der wave-Indikator in den sp-/Ereignisdatensätzen gibt lediglich an, in welcher Welle die letzte Information einer Episode erhoben wurde und NICHT wann diese stattfand.
Nun zu deiner Syntax:
spSchool und spVocTrain kann man nicht über ID_t+spell+subspell mergen - spell und subspell beziehen sich immer nur auf die Episoden innerhalb eines Datensatzes. Es macht aber eigentlich keinen Sinn anzunehmen, dass sich Schul- und Ausbildungsepisoden in großem Maß überschneiden.
Ich habe mal deine Syntax durchlaufen lassen:
Du kannst du Daten nicht ins Wide-Format überführen, weil es in Ereignisdatensätzen mehr als eine Zeile pro Person und Welle geben kann. Der Befehl distinct, den man sich mit dem Befehl ssc install distinct
installieren kann, zeigt an, ob die Variablen geeignet sind um Zeilen eindeutig zu identifizieren:
distinct ID_t wave, joint
Observations
total distinct
35457 16824`
Hier sieht man, dass es pro Welle für jede Person im Schnitt mehr als zwei Zeilen gibt. Du müsstest also zweimal hintereinander reshapen - was aber keinen Sinn macht
Wenn du eine Strukur anstrebst in der ID_t+wave im long-format die Zeilen identifizieren und es dir egal ist, dass wave lediglich angibt, dass die Daten in dieser Welle erhoben, aber nicht zwingend zu diesem Zeitpunkt passierten, kannst du auch so vorgehen:
use "C:\Data\SC4_D_12-0-0\Stata14\SC4_spVocTrain_D_12-0-0.dta", clear
keep ID_t splink subspell spell wave ts1511y ts1512y ts15105 ts15300 ts15201 ts15218 ts15219 ts15201 ts15205 ts15401_R ts15207_g1 ts1511m ts1511y ts1512m ts1512c ts15227 spms
keep if subspell==0 //only keep harmonized spells for the sake of simplicity
generate start = ym(ts1511y,ts1511m) // Datumsvariable für Spellbeginn
generate end = ym(ts1512y,ts1512m) // Datumsvariable für Spellende
drop if missing(start,end) // Fälle wegwerfen, wenn missing in Datum
keep if inlist(spms,1,2) // nur behalten wenn kein Missing in Variable
duplicates report ID_t wave start end spms // Checken ob es noch missings gibt (Alternative zu isid oder distinct)
bysort ID_t wave start end spms (spell): keep if _n == 1 // einfach und ohne inhaltliche Berücksichtigung sortiere ich die Daten nach ID_t wave Start- und Ende des Spells, Haupt-/Nebentätigkeit und zusätzlich als Laufindex der spell. Jetzt werfe ich alle Spells weg, die nach dieser Sotierung nicht an erster Stelle stehen.
bysort ID_t wave (start end spms): generate line = _n // nach ID_t und wave sortieren und line als Laufindex nach der zusätztlichen Sortierung nach start end und spms
drop start end subspell // weg damit, obsolet
foreach var in splink spell ts15207_g1 ts15105 ts15300 ts15201 ts15205 ts15401_R ts1511m ts1511y ts1512m ts1512y ts1512c ts15227 ts15218 ts15219 spms {
rename `var' `var'_w // umbenennen, macht die Variablen nach dem reshape lesbarer
}
reshape wide *_w, i(ID_t wave) j(line)
save "C:\working_data\spVocTrain_shrinked.dta", replace
//Preparing spSchool >> wie oben nochmal
use "C:\Data\SC4_D_12-0-0\Stata14\SC4_spSchool_D_12-0-0.dta", clear
keep ID_t splink subspell spell spms ts11209 ts1111? ts1112? wave
keep if subspell==0
generate start = ym(ts1111y,ts1111m)
generate end = ym(ts1112y,ts1112m)
drop if missing(start,end)
keep if inlist(spms,1,2)
duplicates report ID_t wave start end spms
bysort ID_t wave start end spms (spell): keep if _n == 1
bysort ID_t wave (start end spms): generate line = _n
drop start end subspell
foreach var in splink spell ts1111m ts1111y ts1112m ts1112y spms ts11209 {
rename `var' `var'_w
}
reshape wide *_w, i(ID_t wave) j(line)
save "C:\working_data\spSchool.dta", replace
//merge
use "C:\working_data\spVocTrain_shrinked.dta", clear
merge 1:1 ID_t wave using "C:\working_data\spSchool.dta"
Result # of obs.
-----------------------------------------
not matched 26,516
from master 14,468 (_merge==1)
from using 12,048 (_merge==2)
matched 1,818 (_merge==3)
-----------------------------------------
A. Wenn Daten aus einen der pTarget-Datensätzen anspielen willst und das zeitlich mit der „richtigen“ Welle übereinstimmen soll, könntest du …
1.) ein Monatssplitting an spSchool durchführen, den wave-Indikator wegwerfen und dann via ID_t + Interviewdatum m:1 mit CohortProfile mergen, speichern
2.) das ganze Prozedere auch für spVocTrain durchführen
3.) Zeitlich parallel laufende Spells aus 1.) und 2.) so reduzieren oder den Datensatz reshapen, dass ID_t+wave wieder eindeutig eine Zeile identifizieren
4.) pTarget- und/oder pTargetCATI/CAWI-Daten via 1:1 ID_t+wave mergen
Das sind aber sehr viele Zeilen Syntax und so etwas ist schon etwas für weit fortgeschrittene User…
B. Wenn du keine Variablen aus den pTarget-Datensätzen brauchst, aber aus irgendwelchen Gründen doch eine solche Struktur anstrebst, dann kannst du wie bei A. vorgehen, aber kannst natürlich 4.) weglassen. Wenn du dann das Ganze nochmal reshapest, hast du nur eine Zeile pro Person, aber vermutlich sehr sehr sehr viele Variablen…
C. Wenn du „nur“ eine Ereignisdatenanalyse anstrebst, würde ich dir vorschlagen, die beiden Datensätze zuerst auf subspell 0 zu beschränken und dann diese beiden Datensätze appenden.
Anschließend spielst du diese Daten dann via ID_t+splink an Biography und behälst nur die gematchten Fälle. Hier eine Beispielsyntax
use "C:/SC4_D_12-0-0/SC4_spSchool_D_12-0-0.dta", clear
keep if subspell == 0
save "C:/working_data/spSchool.dta", replace
use "C:/SC4_D_12-0-0/SC4_spVocTrain_D_12-0-0.dta", clear
keep if subspell == 0
save "C:/working_data/spVocTrain.dta", replace
append using "C:/working_data/spSchool.dta"
merge 1:1 ID_t splink using "C:/SC4_D_12-0-0/SC4_Biography_D_12-0-0.dta", keep(matched) nogenerate
Anschließend muss du noch checken, ob es Überlappungen bei den Episoden gibt und diese dann auflösen.
Wenn ich noch studieren würde, dann würde ich es möglichst vermeiden mit Spelldaten zu arbeiten, das sage ich immer in Nutzerschulungen…
Ich hoffe du kannst damit was anfangen.
VG
Dietmar