Hallo Fenya!
Generell ist das mergen von Ereignis-/Spelldaten mit Paneldaten (wiederholte Querschnittsbefragungsdaten) problematisch…
-
) 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
-
) 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