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!