SC4: Hochschulabschluss bzw. -besuch bis inkl. Welle 12

Liebes NEPS-Team,
leider konnte ich bisher an keiner der Schulungen teilnehmen, daher habe ich hauptsächlich mit den Tutorials & Data Manuel versucht, etwas Gespür für die Daten(sätze) zu bekommen. Ich bitte daher um Nachsicht, vermutlich habe ich einiges noch nicht richtig erfasst und freue mich umso mehr über Feedback & Hilfe.

Ich habe zwei Anliegen:

Frage 1: Ich möchte 2 Gruppen bilden: wer (zum Stand von Welle 12) bis einschließlich Welle 12 aus SC_4 eine Hochschule besucht hat (unabhängig davon, ob das Studium beendet wurde.) und wer nicht.
Meine bisherigen Versuche waren mit ts15201 (bzw. ts15219, aber diese Var. scheint vor allem auf Abschlüsse abzuzielen.)


  • Teil 1: Cohort + pTarget aufbereiten

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

*Wellenlabel ändern
label define wave_lbl 1 „Welle 1“ 2 „Welle 2“ 3 „Welle 3“ 4 „Welle 4“, replace
label define wave_lbl 5 „Welle 5“ 6 „Welle 6“ 7 „Welle 7“ 8 „Welle 8“ 9 „Welle 9“ 10 „Welle 10“ , modify
label define wave_lbl 11 „Welle 11“ 12 „Welle 12“ 13 „Welle 13“ 14 „Welle 14“ 15 „Welle 15“, modify
label values wave wave_lbl

keep ID_t wave tx8600y tx8600m tx28303 tx80220 tx80521
ssc install distinct
sort ID_t wave

*Vorbereitungen für Monatssplitting um anhand des Interviewdatums und des Spelldatums beide Datensätze zum richtigen Zeitpunkt zu mergen
keep if tx80521 == 1 // gibt es Infos zur Zielperson?
generate month = ym(tx8600y,tx8600m) // Interviewdatum als eine Variable (month) erstellen
format %tm month
keep if !missing(month) //nur Fälle mit einem Interviewdatum = Teilnahme
distinct ID_t // N=13482

*Duplikate ausschließen (aufgrund von Panelfehlern)
duplicates tag ID_t month, generate(dup)
isid ID_t month // check ob ID_t+month unique ist
distinct ID_t // N=13482 bleibt
drop dup

save „TARGET.dta“, replace

*check Eindeutigkeit → ja!
isid ID_t month


  • Teil 2: Ausbildungsepisoden vorbereiten

use ID_t wave splink spms spell subspell disagint ts15201 ts15218 ts15219 using „SC4_spVocTrain_D_15-0-0.dta“, clear

Studium ja/nein
gen Studium = .
replace Studium = 1 if inlist(ts15201, 6, 7, 8, 9, 10, 11, 15, 16)
replace Studium = 0 if inlist(ts15201, 1, 2, 3, 4, 5, 12, 13, 14, 17)
replace Studium = . if inlist(ts15201, -98, -97, -29, -28)
label define aus_lbl 0 „kein Studium“ 1 „Studium“
label values Studium aus_lbl
keep if wave<=12 // Da nur bis W12 relevant

*Nur harmonisierte Subspells nutzen
keep if subspell == 0 // nur abgeschlossene Spells
drop if disagint == 2 //
bysort ID_t(splink): egen anz_widerspr=total(disagint)
distinct ID_t //
drop if anz_widerspr > 2 // Personen mit mehr als zwei Widersprüche Im Datensatz droppen
distinct ID_t // 2 raus

*Mit Biography.dta mergen, um Interviewzeitpunkt zu generieren
merge 1:1 ID_t splink using „SC4_Biography_D_15-0-0.dta“, keepusing(starty startm endy endm splast) keep(matched) nogenerate
distinct ID_t //
format ts15201 ts15219 ts15218 %20.0g // Zeilenlänge kürzen

*Episodendauern erstellen anhand Start- und Enddatum des jeweiligen Spells
gen start = ym(starty, startm)
gen end = ym(endy, endm)
drop starty startm endy endm anz_widerspr subspell
keep if !missing(start,end)
format %tm start end

*Check ob mehrer Episoden einer Person gleichzeitg vorliegen (zB Studium und Lehrgang)
bysort ID_t (splink): generate anz_spells = _N
generate overlap = 0
summarize anz_spells // mean=1,97 spells / max. 9 spells!

*Überlappungen identifizieren: eine Schleife von Zeile 1 bis zu höchstmöglichen Ereignis läuft innerhalb der jeweiligen Personen und checkt, ob sich Episoden überschneiden
forvalues num = 1/r(max)' { bysort ID_t (start end splink): replace overlap = 1 if ((start <= end[_n-num’]) & ID_t == ID_t[_n-num']) bysort ID_t (start end splink): replace overlap = 1 if ((end >= start[_n+num’]) & ID_t == ID_t[_n+`num’])
}
bysort ID_t (start end splink): egen any_overlap = max(overlap)
br ID_t overlap start end splast spms ts15201 if any_overlap //
drop anz_spells

distinct ID_t // N=16112, davon 10591 eindeutig

*----> 1.Löschgang // nur Hauptereignisse drin lassen
drop if overlap == 1 & spms != 1

distinct ID_t // N=15183, davon 10588 eindeutig

*Erneuter Überlappungscheck
drop overlap any_overlap
bysort ID_t (splink): generate anz_spells = _N
generate overlap = 0
sum anz_spells
forvalues num = 1/r(max)' { bysort ID_t (start end splink): replace overlap = 1 if ((start <= end[_n-num’]) & ID_t == ID_t[_n-num']) bysort ID_t (start end splink): replace overlap = 1 if ((end >= start[_n+num’]) & ID_t == ID_t[_n+`num’])
}
bysort ID_t (start end splink): egen any_overlap = max(overlap)
br ID_t overlap start end ts15201 if any_overlap // N=10587 Fälle und 600 Überlappungem
drop anz_spells

*----> 2.Löschgang // alle Überlappungen, die kürzer als 3 Monate sind raus
generate duration = end - start + 1
drop if duration <= 3 & overlap == 1
assert duration >= 1

distinct ID_t // N=14703, davon 10587 eindeutig

*Erneuter Check nach Überschneidungen
drop overlap any_overlap
bysort ID_t (splink): generate anz_spells = _N
generate overlap = 0
sum anz_spells
forvalues num = 1/r(max)' { bysort ID_t (start end splink): replace overlap = 1 if ((start <= end[_n-num’]) & ID_t == ID_t[_n-num']) bysort ID_t (start end splink): replace overlap = 1 if ((end >= start[_n+num’]) & ID_t == ID_t[_n+`num’])
}
bysort ID_t (start end splink): egen any_overlap = max(overlap)
br ID_t overlap start end ts15201 if any_overlap // N=10587 Fälle und 600 Überlappungem
drop anz_spells

*------> 3. Löschgang
*Bei gleicher Ausbildungsart (ts15201) und gleichem Enddatum->zusammenlegen mit frühstem Startdatum
bysort ID_t ts15201 end (start): gen keepflag = _n == 1
drop if keepflag == 0
drop keepflag

distinct ID_t //N=14655, davon 10588 eindeutig

*Erneuter Check nach Überschneidungen
drop overlap any_overlap
bysort ID_t (splink): generate anz_spells = _N
generate overlap = 0
sum anz_spells
forvalues num = 1/r(max)' { bysort ID_t (start end splink): replace overlap = 1 if ((start <= end[_n-num’]) & ID_t == ID_t[_n-num']) bysort ID_t (start end splink): replace overlap = 1 if ((end >= start[_n+num’]) & ID_t == ID_t[_n+`num’])
}

bysort ID_t (start end splink): egen any_overlap = max(overlap)
br ID_t overlap start end splast spms ts15201 if any_overlap // bei Bedarf diese Duplikate betrachten
drop anz_spells

*----> 4. Löschgang
*Bei gleichem Startdatum & gleicher Ausbildungsart, Zeile mit längerer Dauer behalten.
bysort ID_t ts15201 start (duration): gen group_rank = _n
bysort ID_t ts15201 start: gen group_size = _N
gen keepflag = 1
replace keepflag = 0 if overlap==1 & group_size>1 & group_rank != group_size
drop if keepflag == 0
drop group_rank group_size keepflag

distinct ID_t // N=14646, davon 10587 eindeutig

*Erneuter Check nach Überschneidungen
drop overlap any_overlap
bysort ID_t (splink): generate anz_spells = _N
generate overlap = 0
sum anz_spells
forvalues num = 1/r(max)' { bysort ID_t (start end splink): replace overlap = 1 if ((start <= end[_n-num’]) & ID_t == ID_t[_n-num']) bysort ID_t (start end splink): replace overlap = 1 if ((end >= start[_n+num’]) & ID_t == ID_t[_n+`num’])
}

bysort ID_t (start end splink): egen any_overlap = max(overlap)
br ID_t overlap start end splast spms ts15201 if any_overlap // bei Bedarf diese Duplikate betrachten
drop anz_spells

*----> 5. Löschgang
*Bei gleichem Startdatum & Ausbildungsart, die Zeile, deren Episode noch anhält (splast=1
gen keepflag = 1
bysort ID_t ts15201 start (splast): replace keepflag = splast == 1 if overlap==1
drop if overlap==1 & keepflag == 0
drop keepflag

distinct ID_t // N=14266, davon 10486 eindeutig

*Erneuter Check nach Überschneidungen
drop overlap any_overlap
bysort ID_t (splink): generate anz_spells = _N
generate overlap = 0
sum anz_spells
forvalues num = 1/r(max)' { bysort ID_t (start end splink): replace overlap = 1 if ((start <= end[_n-num’]) & ID_t == ID_t[_n-num']) bysort ID_t (start end splink): replace overlap = 1 if ((end >= start[_n+num’]) & ID_t == ID_t[_n+`num’])
}

bysort ID_t (start end splink): egen any_overlap = max(overlap)
br ID_t overlap start end splast spms ts15201 if any_overlap // bei Bedarf diese Duplikate betrachten
drop anz_spells

*----> 5. Löschgang
*Dropnnen, wenn keine Lehre, sondern „Kurs“
drop if overlap == 1 & ts15201 != 1

distinct ID_t // N=14251, davon 10484 eindeutig

*Erneuter Check nach Überschneidungen
drop overlap any_overlap
bysort ID_t (splink): generate anz_spells = _N
generate overlap = 0
sum anz_spells
forvalues num = 1/r(max)' { bysort ID_t (start end splink): replace overlap = 1 if ((start <= end[_n-num’]) & ID_t == ID_t[_n-num']) bysort ID_t (start end splink): replace overlap = 1 if ((end >= start[_n+num’]) & ID_t == ID_t[_n+`num’])
}

bysort ID_t (start end splink): egen any_overlap = max(overlap)
br ID_t overlap start end splast spms ts15201 if any_overlap // bei Bedarf diese Duplikate betrachten
drop anz_spells
*--------> keine Überlappungen mehr!! N=14251, 10484 eindeutig

*Variable für möglichen Interviewzeitpunkt generieren („Aufblasen“)
expand duration
bysort ID_t splink: generate month = start + _n - 1
format %tm month
assert month >= start & month <= end

isid ID_t month // keine Überlappungen/Duplikate
merge 1:1 ID_t month using „TARGET“, keep(matched) nogenerate

save „KOMPLETT“, replace


Problem: das Merging klappt zwar 1:1 via ID_t month, aber leider sind im neuen Datensatz wieder mehrer Zeilen pro ID_t, einige Wellen doppelt. Das liegt wohl daran, dass die einzelnen Spells (Ausbildungsepisoden) einer Person angezeigt werden.

Frage 2: Nur zur Sicherheit: Die Datensätze pTarget und pParent dürfen via ID_t und wave gemergt werden und dieser verbundene Datensatz dann über dieselben Variablen mit CohortProfile. CohortProfile ist somit sozusagen das Verbindungsstück zu den in Punkt 1 transformierten Spelldaten, korrekt?

Vielen, vielen Dank für Hilfe!

Liebe Yvonne,
vielen Dank für deinen Beitrag. Die Beantwortung wird noch etwas dauern.
Vielen Dank für dein Verständnis und viele Grüße
Martina

Liebe Yvonne,

gerade dazu gekommen meinen Maileingang durchzuschauen und steppe mal hinein. Wenn ich das richtig verstehe, interessiert dich lediglich, ob die befragte Person zu einem beliebigen Zeitpunkt vor der Welle 12 eine Hochschule besucht hat, bzw. ein Studium abgeschlossen hat. Du möchtest nicht nachvollziehen, was die Personen zu jedem Interviewzeitpunkt vor Welle 12 gemacht hat? Dann kannst du dir die Informationen m.E. wesentlich effizienter aus dem spVocTrain herausholen. Bei dem Ansatz zunächst die konsistente Biographie monatsgenau aufzubereiten, reduzierst du zudem noch informationen, die dich unter Umständen interessieren, z.B. berufsbegleitend (= nebenher) Studieren. Im zweiten Schritt, mergen über das Interviewdatum werden nur noch informationen zum Zeitpunkt des jeweiligen Interviews behalten. Dadurch werden Hochschulepisoden systematisch ausgeschlossen (abgebrochene kurze Episoden, Studienepisode im Ausland, wenn Befragte dann nicht am Interview teilnehmen). Ich habe dir mal exemplarisch einen Code-Schnipsel aufbereitet, wie du aus dem Längschnitt Cross-Sectional Infos rausziehen könntest:
ZP_hat_jemals_studiert.do (2.4 KB)

Zur Struktur der Längsschnittdaten sei gesagt, dass eine Datenzeile in den spell-Files (z.B. spVocTrain) jeweils eine Bearbeitung eines Spells in einem Interview darstellt. Eine Person kann also pro Welle mehrere parallele Episoden haben (auch mehrere Ausbildungs- oder Studienepiosden). Eine einzelne Episode kann sich aber auch über mehrere Wellen erstrecken. Der Spell, zum Beispiel eine Studienepisode, die über 3 Jahre andauert, hat dann eine Zeile pro Interview, in dem die Befragten über dieses Studium berichten (siehe wave-Variable). Um die Arbeit mit den Spells zu vereinfachen, gibt es wie gesagt die harmonisierten Spells. (subspell == 0, nicht gleichzusetzen mit abgeschlossenen spells, auch andauernde Spells können subspells haben) Die harmonisierten spells (subspell == 0) haben in der wave variable jeweils die Welle eingetragen, in der der spell zuletzt bearbeitet wurde.

Zu deiner ersten Frage: im cohort Profile hat jede Person pro Welle eine Zeile durch das merging über das Interviewdatum wird jeweils die nach Definition der Löschgänge übrig gebliebene Hauptepisode zum Zeitpunkt des Interviews gemerged.

Bei pTarget und pParent, kannst du 1:1 über ID_t und wave mergen. Alternativ kannst du natürlich auch jeweils die Variablen einzeln aufbereiten, nur die interessierende Welle behalten und anschließend ausschließlich über ID_t einen 1:1 merge durchführen.

Ich hoffe, ich konnte dir etwas weiterhelfen.
Liebe Grüße
Hans (Etappen 6 & 8)