Merging der Datensätze spEmp, spVocTrain, CohortProfile, pTargetCATI und pTargetCAWI aus SC5

Hallo liebes Team:)
Ich sitze gerade an meiner Masterarbeit und versuche mich in stata und den NEPS Daten noch einzulesen. Ich untersuche, inwieweit die Erwerbstätigkeit den Studienerfolg beeinflusst. Dafür habe ich mir Variablen aus den o. g. Datensätzen rausgesucht und versuche diese nun zu mergen. Das klappt allerdings nur nicht all zu gut. Hier mein Code:

// ************************************************************

// 1. Arbeitsverzeichnis setzen

// ************************************************************

cd „…Eigene Dateien\Masterarbeit_NEPS_Daten\stata14“

// ************************************************************

// 2. spVocTrain mit Biography mergen → Studienepisode

// ************************************************************

use „SC5_spVocTrain_D_19-0-0.dta“, clear

keep ID_t wave splink tg24170_g5 ts15211 ts15201 ts1511y ts1511m ts1512y ts1512m subspell

keep if subspell == 0

tempfile voctrain

save `voctrain’

use „SC5_Biography_D_19-0-0.dta“, clear

merge 1:1 ID_t wave splink using `voctrain’, keep(master match)

drop _merge

keep if sptype == 24 // 24 = Studium laut NEPS

replace ts15201 = . if inlist(ts15201, -28, -29, -55, -92, -97, -98) // Ungültige Werte bereinigen

keep if subspell == 0 // Nur harminisierte Episoden

keep if inrange(ts15201, 9, 10) // Nur Uni / FH

replace tg24170_g5 = . if inlist(tg24170_g5, -22, -55, -92, -95, -96, -97, -98)

keep if inrange(tg24170_g5, 1, 8)

*drop if missing(tg24170_g5) // Nur mit Studienfach

drop if missing(ts1511y, ts1511m, ts1512y, ts1512m) // Nur vollständige Datumsangaben

gen studium_start = ym(ts1511y, ts1511m) // Startdatum aus Jahr und Monat

gen studium_end = ym(ts1512y, ts1512m) // Enddatum aus Jahr und Monat

format %tm studium_start studium_end // Formatierung als Monatsdatum

drop if missing(studium_start) | missing(studium_end) // Nur vollständige Start- und Enddaten

gen duration = studium_end - studium_start

bysort ID_t (duration): keep if _n == _N // Längste Episode für jede Person auswählen

rename tg24170_g5 studienfach_spell

tempfile studium

save `studium’

// ************************************************************

// 3. spEmp mit Biography mergen → Erwerbsepisode

// ************************************************************

use „SC5_spEmp_D_19-0-0.dta“, clear

keep ID_t wave splink tg2608b ts2311y ts2311m ts2312y ts2312m ts23256 ts23257 subspell

keep if subspell == 0

tempfile spemp

save `spemp’

use „SC5_Biography_D_19-0-0.dta“, clear

merge 1:1 ID_t wave splink using `spemp’, keep(master match)

drop _merge

keep if sptype == 26 // 26 = Erwerbstätigkeit laut NEPS

replace tg2608b = . if inlist(tg2608b, -54, -55, -97, -98) // Ungültige Werte bereinigen

keep if inrange(tg2608b, 1, 8)

drop if missing(ts23256, ts23257, ts2311y, ts2311m, ts2312y, ts2312m) // Nur vollständige Datumsangaben

gen erwerb_start = ym(ts2311y, ts2311m) // Startdatum aus Jahr und Monat

gen erwerb_end = ym(ts2312y, ts2312m) // Enddatum aus Jahr und Monat

gen erwerb_dauer = erwerb_end - erwerb_start + 1

format %tm erwerb_start erwerb_end // Formatierung als Monatsdatum

drop if missing(erwerb_start) | missing(erwerb_end) // Nur vollständige Start- und Enddaten

bysort ID_t (erwerb_dauer): keep if _n == _N // Längste Episode für jede Person auswählen

rename tg2608b erwerbstätigkeit_art

rename ts23256 stud_erwerbstätig

tempfile arbeit

save `arbeit’

// ************************************************************

// 4. Merge Studien- und Erwerbsepisode

// ************************************************************

use `studium’, clear

merge 1:1 ID_t using `arbeit’, keep(master match)

drop _merge

save „studium_arbeit.dta“, replace

// ************************************************************

// 6. Merge der Hintergrunddaten mit CohortProfile

// ************************************************************

use „SC5_CohortProfile_D_19-0-0.dta“, clear

keep ID_t wave tx8600y tx8600m

replace tx8600y = . if inlist(tx8600y, -54, -55, -56) // Ungültige Werte bereinigen

replace tx8600m = . if inlist(tx8600m, -54, -55, -56) // Ungültige Werte bereinigen

gen wave_date = ym(tx8600y, tx8600m) // Wellenzeitpunkt in Monatsform

format wave_date %tm

bysort ID_t wave: keep if _n == 1

tempfile cohortprofile

save `cohortprofile’

// ************************************************************

// 5. Hintergrunddaten aus pTargetCATI

// ************************************************************

use „SC5_pTargetCATI_D_19-0-0.dta“, clear

keep ID_t wave t700001 t70000y t731301 t731303 t731310 t731351 t731353 t731360 t66406a t66407a t66408a t66406b t66407b t66408b t66406c t66407c t66408c t66406d t66407d t66408d t66405a t66405b t66405c t66405d

replace t700001 = . if inlist(t700001, -55)

replace t70000y = . if inlist(t70000y, -55)

replace t731301 = . if inlist(t731301, -20, -54, -97, -98)

replace t731303 = . if inlist(t731303, -20, -54, -55, -97, -98)

replace t731310 = . if inlist(t731310, -54, -98)

replace t731351 = . if inlist(t731351, -20, -54, -97, -98)

replace t731353 = . if inlist(t731353, -20, -54, -55, -97, -98)

replace t731360 = . if inlist(t731360, -54, -98)

replace t66406a = . if inlist(t66406a, -54)

replace t66407a = . if inlist(t66407a, -54, -98)

replace t66408a = . if inlist(t66408a, -54, -97, -98)

replace t66406b = . if inlist(t66406b, -54)

replace t66407b = . if inlist(t66407b, -54, -97, -98)

replace t66408b = . if inlist(t66408b, -54, -97)

replace t66406c = . if inlist(t66406c, -54, -98)

replace t66407c = . if inlist(t66407c, -54, -97, -98)

replace t66408c = . if inlist(t66408c, -54, -98)

replace t66406d = . if inlist(t66406d, -54, -98)

replace t66407d = . if inlist(t66407d, -54, -97)

replace t66408d = . if inlist(t66408d, -54, -97, -98)

replace t66405a = . if inlist(t66405a, -54, -97, -98)

replace t66405b = . if inlist(t66405b, -54, -97, -98)

replace t66405c = . if inlist(t66405c, -54, -98)

replace t66405d = . if inlist(t66405d, -54, -98) // Nur vollständige Datumsangaben

rename t700001 geschlecht

rename t70000y geburtsjahr

// Motivation berechnen

egen mot_intrinsisch = rowmean(t66405a t66405b t66405c t66405d)

egen mot_leistung = rowmean(t66406* t66407*)

egen mot_extrinsisch = rowmean(t66408a t66408b t66408c t66408d)

*collapse (mean) mot_intrinsisch mot_leistung mot_extrinsisch, by(ID_t) // Die bereits berechneten Mittelwerte sollen für jeden ID_t aggregiert werden

tempfile ptargetcati

save `ptargetcati’

use `cohortprofile’, clear

merge 1:1 ID_t wave using `ptargetcati’, keep(master match)

drop _merge

save „cati.dta“, replace

// ************************************************************

// 7. Studiumfach und Note aus pTargetCAWI

// ************************************************************

use ID_t wave tg51311_g5 tg52020 t241014 t531043 t531021 using „SC5_pTargetCAWI_D_19-0-0.dta“, clear

replace tg51311_g5 = . if inlist(tg51311_g5, -55, -91, -96, -97, -99) // Ungültige Werte bereinigen

keep if inrange(tg51311_g5, 1, 8) // Von Pädagogik- bis Dienstleistungsstudienfächer

replace tg52020 = . if inlist(tg52020, -20, -28, -29, -91, -92, -97, -98, -99) // Ungültige Werte bereinigen

keep if inrange(tg52020, 1.00, 5.00) // Note 1,0 bis 5,0

rename tg51311_g5 studienfach_panel

rename tg52020 note

// Erwerbstätigkeitsintensität (Stunden pro Woche)

gen arbeitsstunden = t241014

// Kategorisierung der Arbeitsstunden in Gruppen

gen arbeitsstunden_gruppe = .

replace arbeitsstunden_gruppe = 1 if inrange(t241014, 0, 10)

replace arbeitsstunden_gruppe = 2 if inrange(t241014, 11, 20)

replace arbeitsstunden_gruppe = 3 if inrange(t241014, 21, 30)

replace arbeitsstunden_gruppe = 4 if inrange(t241014, 31, 40)

replace arbeitsstunden_gruppe = 5 if inrange(t241014, 41, 85)

label define arbeitszeit 1 „0 bis 10 Stunden“ 2 „11 bis 20 Stunden“ 3 „21 bis 30 Stunden“ 4 „31 bis 40 Stunden“ 5 „41 bis 85 Stunden“

label values arbeitsstunden_gruppe arbeitszeit

// BaföG Dummy für Erhalt

gen bafög_dummy = (t531043 == 1) if !missing(t531043) // 1=ja und 0=nein

// BaföG-Höhe

// Kategorien: 1-200 | 201-400 | 401-600 | 601-800 | 801-1000

gen bafög_höhe = .

replace bafög_höhe = 1 if inrange(t531021, 1, 200)

replace bafög_höhe = 2 if inrange(t531021, 201, 400)

replace bafög_höhe = 3 if inrange(t531021, 401, 600)

replace bafög_höhe = 4 if inrange(t531021, 601, 800)

replace bafög_höhe = 5 if inrange(t531021, 801, 1000)

label define BaföG_Höhe 1 „1 bis 200 €“ 2 „201 bis 400 €“ 3 „401 bis 600 €“ 4 „601 bis 800 €“ 5 „801 bis 1000 €“

label values bafög_höhe BaföG_Höhe

tempfile ptargetcawi

save `ptargetcawi’

use `cohortprofile’, clear

merge 1:1 ID_t wave using `ptargetcawi’, keep(master match)

drop _merge

save „cawi.dta“, replace

use „cati.dta“, clear

merge 1:1 ID_t wave using „cawi.dta“, keep(master match)

drop _merge

save „caticawi.dta“, replace

use „caticawi.dta“, clear

merge 1:1 ID_t wave using „studium_arbeit.dta“, keep(master match)

drop _merge

*bysort ID_t wave: keep if _n == _N // Duplikate löschen und nur eine Zeile pro Welle erhalten

*duplicates drop

save „master_final_version.dta“, replace

Ich verstehe tatsächlich nicht, warum ich die einzelnen Datensätze nicht richtig mergen kann. Laut stata klappt der merge zwar, aber ich verliere jede Menge Beobachtungen, womit der merge wieder hinfällig ist.

Vielleicht kann mir jemand helfen?
Vielen Dank schon einmal im Voraus:)
LG
Thorben