SC4 - spVocTrain mit spSchool mergen

Liebes NEPS Forum,

ich hätte eine Frage bezüglich dem mergen von verschiedenen Spelldaten:
In meiner Syntax verwende ich bereits spVocTrain und habe diesen mit der Biography zusammengefügt. Sowie anschließend mit dem Cohortprofil gemergt. Dabei habe ich auch die Episoden und den Interviewzeitpunkt beachtet.
Da ich für meine Auswertung nun auch noch den Datensatz spSchool benötige, dachte ich mir, es wäre am leichtesten diesen mit SpVocTrain zu mergen, da beide dasselbe Datenformat aufweisen. Anschließend wäre ich wieder mit dem mergen an die Biography usw. vorgegangen.

/ Preparing spVocTrain-Dataset:
// load necessary variable of spVocTrain:
use „C:\Users\Theresa\Documents\4. Mastersemester\SC4_D_12-0-0unpacked\Stata\SC4_spVocTrain_D_12-0-0.dta“, clear
keep ID_t splink subspell spell wave ts1511y ts1512y ts15105 ts15300 ts15201 ts15218 ts15219 ts15201 ts15205 ts15401_R ts15207_g1 ts1511m ts1511y ts1512m ts1512c ts15227
keep if subspell==0 //only keep harmonized spells for the sake of simplicity
drop wave
save „spVocTrain_shrinked.dta“, replace

//Preparing spSchool
use „C:\Users\Theresa\Documents\4. Mastersemester\SC4_D_12-0-0unpacked\Stata14\SC4_spSchool_D_12-0-0.dta“, clear
keep ID_t wave splink subspell spell ts11209
keep if subspell==0
save „spSchool.dta“, replace

//merge
use „spVocTrain_shrinked.dta“, clear
merge 1:1 ID_t spell subspell using „spSchool.dta“
drop _merge
save „spVocTrain_spSchool.dta“, replace

Das funktioniert soweit auch ganz gut. Das einzige Problem tritt auf, wenn ich kurz vor meiner Regression die Daten vom long-Format wieder ins wide-Format bringen möchte und mir die Fehlermeldung angezeigt wird, dass meine Variable ts11209 „not constant within ID_t“ ist.
Ich denke, dass dies etwas mit dem mergen der Spelldaten zu tun hat, weil ohne diese Variable der reshape einwandfrei funktioniert.

Können Sie mir diesbezüglich weiterhelfen?
Vielen Dank schon mal!!
Viele Grüße
Theresa

Hallo Theresa!

warum willst spSchool und spVocTrain mergen? Eigentlich sollten sich die Zeiträume nicht überlappen, da formale Schulbildung und Ausbildungsepisoden nicht gleichzeitig stattfinden - in den allermeisten Fällen.

Allgemeines:
Die verwendeten Analysemethoden entscheiden darüber wie du weiter vorgehen musst. Wenn du eine Ereignisdatenanaylse/Sequenzmusteranalyse machen willst, wirst du wahrscheinlich nur einzelne Variablen aus den pTarget-Datensätzen an die Ereignisdaten anspielen wollen.
Wenn du Panelregressionsmodelle verwendest, wird du wohl Daten aus den Ereignisdaten so zuspielen wollen, dass die Variablen auch in den richtigen Wellen landen.
Wenn du nur Daten aus Ereignisdaten brauchst, aber keine Daten aus den pTarget-Datensätzen, kannst du auf den Wellenindikator verzichten. Der wave-Indikator in den sp-/Ereignisdatensätzen gibt lediglich an, in welcher Welle die letzte Information einer Episode erhoben wurde und NICHT wann diese stattfand.

Nun zu deiner Syntax:
spSchool und spVocTrain kann man nicht über ID_t+spell+subspell mergen - spell und subspell beziehen sich immer nur auf die Episoden innerhalb eines Datensatzes. Es macht aber eigentlich keinen Sinn anzunehmen, dass sich Schul- und Ausbildungsepisoden in großem Maß überschneiden.

Ich habe mal deine Syntax durchlaufen lassen:
Du kannst du Daten nicht ins Wide-Format überführen, weil es in Ereignisdatensätzen mehr als eine Zeile pro Person und Welle geben kann. Der Befehl distinct, den man sich mit dem Befehl ssc install distinct installieren kann, zeigt an, ob die Variablen geeignet sind um Zeilen eindeutig zu identifizieren:

distinct ID_t wave, joint

Observations
total   distinct
35457      16824`

Hier sieht man, dass es pro Welle für jede Person im Schnitt mehr als zwei Zeilen gibt. Du müsstest also zweimal hintereinander reshapen - was aber keinen Sinn macht

Wenn du eine Strukur anstrebst in der ID_t+wave im long-format die Zeilen identifizieren und es dir egal ist, dass wave lediglich angibt, dass die Daten in dieser Welle erhoben, aber nicht zwingend zu diesem Zeitpunkt passierten, kannst du auch so vorgehen:

use "C:\Data\SC4_D_12-0-0\Stata14\SC4_spVocTrain_D_12-0-0.dta", clear
keep ID_t splink subspell spell wave ts1511y ts1512y ts15105 ts15300 ts15201 ts15218 ts15219 ts15201 ts15205 ts15401_R ts15207_g1 ts1511m ts1511y ts1512m ts1512c ts15227 spms
keep if subspell==0 //only keep harmonized spells for the sake of simplicity
generate start = ym(ts1511y,ts1511m) // Datumsvariable für Spellbeginn
generate end = ym(ts1512y,ts1512m) // Datumsvariable für Spellende
drop if missing(start,end) // Fälle wegwerfen, wenn missing in Datum
keep if inlist(spms,1,2) // nur behalten wenn kein Missing in Variable
duplicates report ID_t wave start end spms // Checken ob es noch missings gibt (Alternative zu isid oder distinct)
bysort ID_t wave start end spms (spell): keep if _n == 1 // einfach und ohne inhaltliche Berücksichtigung sortiere ich die Daten nach ID_t wave Start- und Ende des Spells, Haupt-/Nebentätigkeit und zusätzlich als Laufindex der spell. Jetzt werfe ich alle Spells weg, die nach dieser Sotierung nicht an erster Stelle stehen.
bysort ID_t wave (start end spms): generate line = _n // nach ID_t und wave sortieren und line als Laufindex nach der zusätztlichen Sortierung nach start end und spms
drop start end subspell // weg damit, obsolet
foreach var in splink spell ts15207_g1 ts15105 ts15300 ts15201 ts15205 ts15401_R ts1511m ts1511y ts1512m ts1512y ts1512c ts15227 ts15218 ts15219 spms {
    rename `var' `var'_w  // umbenennen, macht die Variablen nach dem reshape lesbarer
}
reshape wide *_w, i(ID_t wave) j(line)
save "C:\working_data\spVocTrain_shrinked.dta", replace


//Preparing spSchool  >> wie oben nochmal
use "C:\Data\SC4_D_12-0-0\Stata14\SC4_spSchool_D_12-0-0.dta", clear
keep ID_t splink subspell spell spms ts11209 ts1111? ts1112? wave
keep if subspell==0

generate start = ym(ts1111y,ts1111m)
generate end = ym(ts1112y,ts1112m)
drop if missing(start,end)
keep if inlist(spms,1,2)
duplicates report ID_t wave start end spms
bysort ID_t wave start end spms (spell): keep if _n == 1
bysort ID_t wave (start end spms): generate line = _n
drop start end subspell
foreach var in splink spell ts1111m ts1111y ts1112m ts1112y spms ts11209 {
    rename `var' `var'_w
}
reshape wide *_w, i(ID_t wave) j(line)
save "C:\working_data\spSchool.dta", replace

//merge 
use "C:\working_data\spVocTrain_shrinked.dta", clear
merge 1:1 ID_t wave using "C:\working_data\spSchool.dta"

    Result                           # of obs.
    -----------------------------------------
    not matched                        26,516
        from master                    14,468  (_merge==1)
        from using                     12,048  (_merge==2)

    matched                             1,818  (_merge==3)
    -----------------------------------------

A. Wenn Daten aus einen der pTarget-Datensätzen anspielen willst und das zeitlich mit der „richtigen“ Welle übereinstimmen soll, könntest du …
1.) ein Monatssplitting an spSchool durchführen, den wave-Indikator wegwerfen und dann via ID_t + Interviewdatum m:1 mit CohortProfile mergen, speichern
2.) das ganze Prozedere auch für spVocTrain durchführen
3.) Zeitlich parallel laufende Spells aus 1.) und 2.) so reduzieren oder den Datensatz reshapen, dass ID_t+wave wieder eindeutig eine Zeile identifizieren
4.) pTarget- und/oder pTargetCATI/CAWI-Daten via 1:1 ID_t+wave mergen
Das sind aber sehr viele Zeilen Syntax und so etwas ist schon etwas für weit fortgeschrittene User…

B. Wenn du keine Variablen aus den pTarget-Datensätzen brauchst, aber aus irgendwelchen Gründen doch eine solche Struktur anstrebst, dann kannst du wie bei A. vorgehen, aber kannst natürlich 4.) weglassen. Wenn du dann das Ganze nochmal reshapest, hast du nur eine Zeile pro Person, aber vermutlich sehr sehr sehr viele Variablen…

C. Wenn du „nur“ eine Ereignisdatenanalyse anstrebst, würde ich dir vorschlagen, die beiden Datensätze zuerst auf subspell 0 zu beschränken und dann diese beiden Datensätze appenden.
Anschließend spielst du diese Daten dann via ID_t+splink an Biography und behälst nur die gematchten Fälle. Hier eine Beispielsyntax

use "C:/SC4_D_12-0-0/SC4_spSchool_D_12-0-0.dta", clear
keep if subspell == 0
save "C:/working_data/spSchool.dta", replace

use "C:/SC4_D_12-0-0/SC4_spVocTrain_D_12-0-0.dta", clear
keep if subspell == 0
save "C:/working_data/spVocTrain.dta", replace

append using "C:/working_data/spSchool.dta"
merge 1:1 ID_t splink using "C:/SC4_D_12-0-0/SC4_Biography_D_12-0-0.dta", keep(matched) nogenerate

Anschließend muss du noch checken, ob es Überlappungen bei den Episoden gibt und diese dann auflösen.

Wenn ich noch studieren würde, dann würde ich es möglichst vermeiden mit Spelldaten zu arbeiten, das sage ich immer in Nutzerschulungen…

Ich hoffe du kannst damit was anfangen.

VG
Dietmar