SC5: spVoctrain, spSchool in wide-Format

Liebes NEPS-Team,

für meine Masterarbeit benötige ich Informationen aus den SC5-Datensätzen CATI, CAWI, spVocTrain sowie spSchool, wobei mir das Mergen dieser anscheinend nicht vollständig gelingt. Grund hierfür bietet mir u.a. der starke Rückfall/ Ausfall der Fallzahlen der Variable des Ausbildungstyps (ts15219_v1) aus spVocTrain nach dem Mergen. Daher würde ich mich sehr über Ihre Hilfe freuen.

Ich bin wie folgt vorgegangen (verkürzte Stata-Syntax):
** 2. Datensätze bearbeiten:*
** spVocTrain*
use „SC5_spVocTrain_D_11-0-0“, clear
nepsmiss _all
keep if subspell==0 & tx20100==1
keep if wave==1
keep ID_t wave ts15219_v1
save „$wd\Arbeitsdaten\NTS_spVocTrain.dta“, replace
** spSchool*
use „SC5_spSchool_D_11-0-0“, clear
nepsmiss _all
keep if subspell==0
keep if wave==1
keep ID_t wave h_abiland
save „$wd\Arbeitsdaten\NTS_spSchool.dta“, replace
** 3. Datensätze mergen*
use „NTS_pTargetCATI_CAWI“, clear // Master-Datensatz
sort ID_t wave
** Masterdatensatz (CATI/CAWI) mit spVocTrain mergen*
merge 1:m ID_t wave using „NTS_spVocTrain“
drop _merge
** mit spSchool mergen*
merge 1:m ID_t wave using „NTS_spSchool“
drop _merge
save „$wd\Arbeitsdaten\NTS_gemergt.dta“, replace

Hiernach ist mir jedoch das Problem mit der Variable des Ausbildungstyps (ts15219_v1) aufgefallen, so dass ich nach dem Fehler gesucht habe.
Daher wollte ich meine Vorgehensweise des Mergens ändern und die Datensätze spVocTrain sowie spSchool vor dem Mergen so bearbeitet, dass ich ein wide-Format habe, um somit 1:1 über ID_t und wave mit CATI und CAWI mergen kann.
Das Problem hierbei ist allerdings, dass pro Person die Welle 1 mehrfach enthalten ist und zudem innerhalb dieser für sowohl der Variable ts15219_v1 (Ausbildungstyp) als auch h_abiland (Schulabschluss In-/Ausland) unterschiedliche Information enthält. So hat eine Person bei ts15219_v1 sowohl eine betriebliche Ausbildung als auch einen Meisterbrief. Hier bräuchte ich jedoch nur die jeweils letzte/ aktuellste Episode, welches ich mit Hilfe der Variable ts1512y (Enddatum Jahr) herausfinden kann.
An dieser Stelle weiß ich jedoch nicht, wie ich diese Denkweise, dass die jeweils letzte Episode einer Person behalten wird, mit einer Syntax umsetzen kann und ob meine Vorgehensweise überhaupt zielführend ist?

Ich hoffe meine Problematik ist nachvollziehbar.

Vielen Dank im Voraus für Ihre Hilfe und herzliche Grüße
Fenya

Hallo Fenya!

Generell ist das mergen von Ereignis-/Spelldaten mit Paneldaten (wiederholte Querschnittsbefragungsdaten) problematisch…

  1. ) da der Wellenindikator wave nur Aufschluss darüber gibt, wann diese Ereignisdaten das letzte Mal erhoben wurden, nicht unbedingt wann sie begannen oder endeten. Wurde ein Ereignis aus dem Jahr 1990 retrospektiv in Welle 1 erfragt, wird der Wellenindikator wave=1 lauten. Wenn eine Person in Welle 1 und Welle 5 teilgenommen hat , nicht jedoch in den Wellen 2-4 teilnahmen, erhalten Ereignisse, die zwischen den Wellen 2 und 4 abgeschlossen wurden, trotzdem den Wellenindikator wave==5

  2. ) da es mehr als ein Ereignis pro Welle pro Person geben kann - daraus resultiert dann in einer 1:m-Problematik beim mergen von p-Target- und Episodendaten

Also prinzipiell ist es möglich Spelldatensätze ins Wide-Format zu überführen, aber das ist nicht immer zielführend und empfehlenswert, da so die Variablenanzahl im Datensatz aus Variablenanzahl*Spellanzahl steigt. So kann man kaum einen Überblick über die Daten erlangen.

Da das Vereinen von Spell- und Targetdatensätzen meist problematisch ist, schlage ich ein sogenanntes Monatssplitting vor um das Problem 1.) zu entschärfen. Der Weg dorthin ist leider äußerst steinig. Die Stata-Syntax zeigt wie das geht. Zuerst muss man im CohortProfile alle Teilnehmenden behalten und dann ein monatsbasiertes Interviewdatum aus intm und inty generieren. Dann wird der Datensatz so expandiert, dass es für jeden Monat zwischen zwei Wellen eine Zeile mit eine fortlaufenden Monatindikator month gibt. Hierbei zähle ich den Zeitraum zwischen Welle Y und Welle X zu Welle X, sprich der Zeitraum zwischen Welle 1 und Welle 2 wird zu Welle 2 gerechnet. Man kann den Zeitraum auch zur Welle 1 zählen, dann muss die Syntax entsprechend angepasst werden.
Für die Spelldaten muss auch ein Monatsdatum für End- und Startdatum des Ereignisses generiert und in je einem Daten gespeichert werden. Dann werden diese Datensätze an das aufgeblähte CohortProfile anhand ID_t und month angespielt. Die gematchten Fälle werden behalten und tragen nun den wave-Indikator, der je nach Start- oder Enddatumssatz den Welle zum Start des Ereignisses oder die Welle zum Ende des Ereignisses angibt.
Dann werden diese Datensätze via ID_t und splink zusammengespielt und aus der Differenz von wave_start und wave_end der Datensatz expandiert und dann ein Laufindex gebildet mit dem man einen Welleindikator bilden kann.

Mit dem resultierenden Datensatz kann man Problem 2.) angegangen werden um auszusortieren, welche Zeile pro Welle behalten werden soll, z.B. ob der Spell mit der längsten Dauer oder der „neuste“ verwendet werden soll. Dabei helfen dann egen-Befehle, die man mit bysort kombinieren kann (help egen).

Ja, ich weiß, das ist ziemlich crazy, aber einfache Aufbereitungsschritte mit komplexen Daten sind nicht möglich. Und dass man zwar in der Uni lernt Daten zu analysieren, aber nicht wie man Daten verarbeitet, ist ein fundamentales Problem, das wir leider auch nicht so einfach lösen können.

Leider kann ich nicht abschätzen, wann wir die Zeit finden, die Datenstrukturen schon innerhalb der SUF-Aufbereitung weiter zu vereinfachen - oder zumindest ados bereitstellen können um die Einstiegshürden zu senken.

Ich würde vorschlagen, du versuchst erst einmal die Syntax auf dein Problem anzuwenden und dann sehen wir weiter.

Ich hoffe, ich konnte etwas helfen.
Viele Grüße
Dietmar

		/**** Monatssplitting: 
Fuer jeden Monat zwischen Welle_Y und Welle_X wird eine Datenzeile generiert  ***/
use ID_t intm inty wave tx80521 using "`sufpath'/SC5_CohortProfile_D_11-0-0", clear
keep if tx80521==1  // Nur Survey-Teilnehmer behalten
// Interviewdatum generieren und Datum in Welle 1 auf Semesteranfang WS10/11
gen ws1011=ym(2010,9)
generate intdate=ym(inty,intm)  // monatsbasiertes Interviewdatum generieren
replace intdate=ws1011 if wave==1 & intdate > ws1011 
keep if !missing(intdate)  // Wenn missing, dann löschen
format %tm intdate // Datumsformat lesbar machen
drop int? tx80521
sort ID_t intdate ws1011

// Anzahl der Datenzeilen um die Differenz der Monate zwischen 
// Interview aus WelleY und WelleX multiplizieren
bysort ID_t (intdate): gen monthdiff = (intdate - intdate[_n-1]) // Monatsdifferenz berechnen
expand monthdiff  // Datenzeilen multiplizieren
sort ID_t intdate // Datensatz nach ID_t und Interviewmonat sortieren
bysort ID_t intdate: gen monthnum=_n  // Laufindex pro Interviewdatum
gen month = (intdate - monthnum) + 1 // kontiuierliche Monatsvariable generieren
format %tm month 
assert month==intdate if monthnum==1
drop monthdiff monthnum intdate

isid ID_t month // testen, ob ID_t + month unique ID-Kombination ist
save "`wdpath'/cohort_monthsplitt.dta", replace

*********************************************************************************

// spVocTrain vorbereiten
use ID_t ts15219 ts15219_v1 spell subspell splink ts1511y_g1 ts1511m_g1 ts1512y_g1 ts1512m_g1 ts1512c_g1 tx20100 ///
	using "`sufpath'/SC5_spVocTrain_D_11-0-0", clear
keep if subspell==0 & tx20100==1
nepsmiss _all
clonevar ts15219_ha=ts15219 // harmon. Variable erstellen
replace ts15219_ha=ts15219_v1 if missing(ts15219_ha) & !missing(ts15219_v1)
drop ts15219_v1 ts15219
generate month_start=ym(ts1511y_g1,ts1511m_g1)  // monatsbasiertes Startdatum
generate month_end=ym(ts1512y_g1,ts1512m_g1)  // monatsbasiertes Startdatum
format %tm month_start month_end
drop if missing(month_start) | missing(month_end) // missings droppen
keep ID_t splink ts1512c_g1 ts15219_ha month_start month_end
save "`wdpath'/spVoc_startenddate.dta", replace



// monatsbasiertes Startdatum eines Ereignisses generieren
use "`wdpath'/spVoc_startenddate.dta", clear
clonevar month=month_start
merge m:1 ID_t month using "`wdpath'/cohort_monthsplitt.dta", keep(matched) nogenerate
rename wave wave_start
label variable wave_start "(Welle, Start)"
save "`wdpath'/spVoc_startdate.dta", replace

// (Vorläufiges) monatsbasiertes Enddatum eines Ereignisses generieren
use "`wdpath'/spVoc_startenddate.dta", clear
clonevar month=month_end
merge m:1 ID_t month using "`wdpath'/cohort_monthsplitt.dta", keep(matched) nogenerate
rename wave wave_end
label variable wave_end "(Welle, Ende)"
save "`wdpath'/spVoc_enddate.dta", replace


// Start- und Enddaten mergen
use "`wdpath'/spVoc_startdate.dta", clear
merge 1:1 ID_t splink using "`wdpath'/spVoc_enddate.dta", keep(master matched) nogenerate
drop month
generate duration=month_end - month_start + 1
label variable duration "Dauer Ereignis (Monate)"

// Wieder Datensatz aufblähen, sodass nun für jede Welle zwischen
//wave_start und wave_end eine Zeile generiert wird
generate waves_between=wave_end - wave_start
expand waves_between+1
bysort ID_t wave_start wave_end splink: gen wave_num=_n -1
generate wave=wave_start+wave_num
label values wave `: value label wave_start' // Value label der Variable wave_start auf Variable wave anwenden 

// Variable generieren, die den Status eines Spells darstellt
generate str event_state =""
replace event_state = "start" if wave_start==wave
replace event_state = "end" if wave_end==wave
replace event_state = "start/end" if wave_end==wave_start
replace event_state = "on-going" if ((wave > wave_start & wave < wave_end) | (wave== wave_end & ts1512c_g1== 1))

/* Es gibt Personen die mehr als ein Start-/Enddatum von Ereignissen pro Monat haben 
(gleichzeitige Beendigung von mehreren Ereignissen) */
bysort ID_t wave: gen num_spells=_N
label variable num_spells "Number of Voc-Spells per Wave"
keep ID_t splink wave event_state ts15219_ha duration num_spells
order ID_t splink wave event_state duration num_spells ts15219_ha
sort ID_t splink wave 
// Ausgangsdatensatz um weitere Entscheidungen zu treffen, welchen Spell man wählt
save "`wdpath'/spVoc_waves.dta", replace

Hallo Dietmar,

vielen Dank für die ausführliche Antwort!

Wenn ich es richtig verstanden habe, habe ich am Ende der Stata-Syntax die Information, in welcher Welle die jeweilige Information über den Ausbildungstyp erhoben wurde.
Für meine Forschung bräuchte ich jedoch diese Information nicht. Da ich mit dieser Variable beruflich Qualifizierte identifizieren will, muss ich wissen, wann deren bspw. betriebliche Ausbildung beendet wurde, um sichergehen zu können, dass sich dieser Zeitpunkt vor dem WS10/11 befindet. Zudem: Wenn eine Person während des Studiums eine Ausbildung macht, würde ich diese Information löschen, sprich alle Ausbildungstypen, die nach Start des WS10/11 beendet wurden fallen aus meiner Analyse. Mich interessiert wirklich nur der Zeitraum vor dem WS10/11.
Folglich gehe ich jetzt davon aus, dass mich deine ausführliche Stata-Syntax nicht (vollständig) voranbringt. Um meine beruflich Qualifizierten zu identifizieren reichen demnach doch die Variablen ts1511m ts1511y (Startmonat und -jahr) ts1512m ts1512y (Endmonat und -jahr). Ist meine Annahme richtig?

Viele Grüße
Fenya

Hallo Dietmar,

vielen Dank für die ausführliche Antwort!

Wenn ich es richtig verstanden habe, habe ich am Ende der Stata-Syntax die Information, in welcher Welle die jeweilige Information über den Ausbildungstyp erhoben wurde.
Für meine Forschung bräuchte ich jedoch diese Information nicht. Da ich mit dieser Variable beruflich Qualifizierte identifizieren will, muss ich wissen, wann deren bspw. betriebliche Ausbildung beendet wurde, um sichergehen zu können, dass sich dieser Zeitpunkt vor dem WS10/11 befindet. Zudem: Wenn eine Person während des Studiums eine Ausbildung macht, würde ich diese Information löschen, sprich alle Ausbildungstypen, die nach Start des WS10/11 beendet wurden fallen aus meiner Analyse. Mich interessiert wirklich nur der Zeitraum vor dem WS10/11.
Folglich gehe ich jetzt davon aus, dass mich deine ausführliche Stata-Syntax nicht (vollständig) voranbringt. Um meine beruflich Qualifizierten zu identifizieren reichen demnach doch die Variablen ts1511m ts1511y (Startmonat und -jahr) ts1512m ts1512y (Endmonat und -jahr). Ist meine Annahme richtig?

Viele Grüße
Fenya

Hallo Fenya!

Entschuldige, ich habe mich etwas missverständlich ausgedrückt. Der Wellenindikator im ursprünglichen spVocTrain gibt lediglich an, in welcher Welle die Daten erhoben wurden.
Meine Syntax gibt an, in welcher Welle die Ereignisse stattgefunden haben.
Ich habe dabei noch etwas korrigiert um deine die Ausbildungsepisoden vor Studienbeginn aufzufangen (siehe Anhang).
Forum_request_voctrain_prior_study.do (4.6 KB)

Aber in deinem Fall geht das auch einfacher, sorry für die Verwirrung:

use "`sufpath'/SC5_spVocTrain_D_11-0-0", clear
keep if subspell==0 & tx20100==1
nepsmiss _all
clonevar ts15219_ha=ts15219 // harmon. Variable erstellen
replace ts15219_ha=ts15219_v1 if missing(ts15219_ha) & !missing(ts15219_v1)
drop ts15219_v1 ts15219
generate month_start=ym(ts1511y_g1,ts1511m_g1)  // monatsbasiertes Startdatum
generate month_end=ym(ts1512y_g1,ts1512m_g1)  // monatsbasiertes Startdatum
format %tm month_start month_end
drop if missing(month_start) | missing(month_end) // missings droppen
drop if month_start > month_end
generate ws1011=ym(2010,9)
drop if month_end > ws1011
replace wave=1
keep if ts15219_ha==1

Hallo Dietmar,

danke für die schnelle Antwort. Diese hat mir sehr gut weitergeholfen!

Viele Grüße
Fenya