Verdichten spEmp

Hallo,

ich möchte gerne die spell-Variable ts23221 (Stellenumfang am Ende/heute: Teilzeit/ Vollzeit) so verdichten, dass pro ID_t nur noch der aktuellste spell übrig bleibt. Hier eine abgespeckte Version meines do-files:

*load relevant variables from spEmp
use ${datapath}/SC6_spEmp_D_${version}.dta, clear
keep ID_t wave splink spell subspell ts23221

*only keep harmonized spells
keep if subspell==0

*keep wave 1-6:
keep if wave <=6

*merge using-file: Biography data
merge m:1 ID_t splink using ${datapath}/SC6_Biography_D_${version}.dta

Das Mergen funktioniert soweit. Es werden je ID_t mehrere Spells und die dazu gehörende Episodenperiode (startm, starty, endm, endy) angezeigt. Wenn zum beispiel eine Person 4 spells hat, dann ist der 4. der aktuellste, richtig?

Daher habe ich folgende Regel aufgestellt, um die spells zu verdichten, damit die aktuellste Erwerbsperiode erhalten bleibt:

*define rule how to compress spells
by ID_t : egen sp_recent = max(splink)
drop if splink != sp_recent

Es bleiben tatsächlich nur noch die Zeilen mit dem höchsten spell. Allerdings entspricht dieser spell nicht immer der aktuellsten Periode. Zum Beispiel:

spell: 10
Periode: Sept. 2000-Oktober 2002

spell: 11
Periode: Juni 1999-September 1999

Wende ich meine Regel jedoch an, bleibt der spell 11 enthalten und nicht 10, obwohl letzterer ja aktueller ist.

Habe ich einen Fehler beim Mergen gemacht?

Ich habe es auch schon so ausprobiert, wie es im DataManual vorgeschlagen wird, nämlich:

*load relevant variables from spEmp
use ${datapath}/SC6_spEmp_D_${version}.dta, clear
keep ID_t wave splink spell subspell ts23221

*rename variable
rename ts23221 sp_ftpt

*only keep harmonized spell
keep if subspell==0

*save file temporarily
tempfile tmp
save `tmp’

*open Biography data file
use ${datapath}/SC6_Biography_D_${version}.dta, clear

*merge previously created temporary datafile
merge 1:1 ID_t splink using `tmp’ , keep(master match)

hier kommt folgende Fehlermeldung: „invalid file specification“

Was könnte der Fehler sein?

Über eure Hilfe wäre ich sehr dankbar.

Viele Grüße,

Leonie

Liebe Leonie,

leider ist das Thema so komplex, dass ich dir hier keine direkte Lösung liefern kann. Ich habe aber ein paar Anregungen, vielleicht kommst du damit schon weiter:

  • die Fehlermeldung resultiert mutmaßlich daher, dass in der Syntax ein temporärer Datensatz verwendet wird (tempfile). Damit das funktioniert, musst du die Syntax in einem Stück durchlaufen lassen.
  • wenn du den Biography-Datensatz verwenden möchtest (was manchmal Sinn macht, manchmal nicht), würde ich empfehlen, mit diesem zu starten und dann Information aus dem Spellmodul anzuspielen (z.B. spEmp). In deinem Beispiel machst du es genau andersrum, das macht nicht soviel Sinn, da ja alle Information, die in Biography über Erwerbsepisoden gespeichert sind, auch im spEmp-Datensatz vorliegen
  • die Wellenvariable „wave“ ist innerhalb der Spellmodule etwas irreführend, da sie nur angibt, in welcher Erhebung die jeweilige Zeile erfasst wurde. Sie sagt nichts darüber aus, ob die Episode in dieser Welle gültig war oder nicht (Stichwort retrospektiv). Ich würde dir daher raten, die Wellenvariable so nicht zu verwenden (es sei denn, du bist darauf angwiesen, wirklich nur Episoden auszuwerten, die in einer bestimmten Erhebung erfasst wurden, z.B. weil du einen Bruch in der Erhebungslogik vermutest).
  • Die Episode/der Spell mit der höchsten Nummer ist nicht zwangsläufig der (chronologisch) letzte. Es ist die Episode, die als letztes erfasst wurde. Ich würde mich nicht zwingend darauf verlassen, sondern lieber die Variablen zum Episodenstart/Episodenende (ts2311/ts2312). Wenn du wissen willst, welche Episode in welcher Welle gültig ist, könntest du z.B. so vorgehen:
*  hole das Interviewdatum (sozusagen "der Zeitpunkt der Welle") 
* aus dem Kohortenprofil
use "SC6_CohortProfile_D_10-0-1.dta", clear
gen idate=ym(inty,intm)
format %tm idate

* wandle den Datensatz um, so dass du nur noch eine Zeile pro Person hast
* mit X-Variablen für X-Wellen (derzeit 10)
keep ID_t wave idate
reshape wide idate, i(ID_t) j(wave)

* abspeichern 
 tempfile cp
 save `cp'
 
* spiele diese Variablen an den Episodendatensatz
 use "Z:\SUF\Download\SC6\SC6_D_10-0-1\Stata14\SC6_spEmp_D_10-0-1.dta", clear
 keep if subspell==0 // immer eine gute Idee
 merge m:1 ID_t using `cp', nogen keep(master match)

* bilde Datumsvariablen für Start/Ende der Episode 
 gen estart=ym(ts2311y_g1,ts2311m_g1)
 gen eend=ym(ts2312y_g1,ts2312m_g1)
 format %tm estart eend

* prüfe, ob das angespielte Wellendatum innerhalb der Episode liegt. 
* Erzeugt eine neue Variable pro Welle, mit 
* 1==Welle liegt innerhalb der Episode, 0==Welle liegt außerhalb der Episode
 forvalues i=1/10 {
	gen inwave`i' = inrange(idate`i',estart,eend)
 }

Ab hier wird es schwierig, weil du ohne weitere inhaltliche Auseinandersetzung nicht mehr weiterkommst. Du kannst jetzt z.B. eine neue Wellenvariable bilden, die dir dann tatsächlich sagt, ob die Episode zum Wellenzeitpunkt gültig ist. Allerdings kann es natürlich sein, dass pro Welle mehrere Episoden gültig sind (z.B. mehrere Teilzeitjobs), ebenso pro Episode mehrere Wellen (z.B. Langzeitbeschäftigung).

 drop wave
 reshape long inwave, i(ID_t spell) j(wave)
 keep if inwave==1
 drop inwave

Versuch doch mal damit weiterzukommen!

Gutes Gelingen,
Tobias

Liebe Leonie,

wenn ich dich richtig verstehe, ist dein primäres Problem herauszufinden, welches die aktuellste Erwerbstätigkeit der befragten Personen ist und zu der möchtest du dir anschauen, ob der Stellenumfang Voll- oder Teilzeit ist? Ich würde in diesem Fall die korrekten Erwerbsspells auf Basis der Variablen des Biography-file auswählen. Der Anfang sähe dann praktisch wie in deiner Syntax aus:

use ${datapath}/SC6_spEmp_D_${version}.dta, clear
keep ID_t wave splink spell subspell ts23221
keep if subspell==0
merge 1:1 ID_t splink using ${datapath}/SC6_Biography_D_${version}.dta

* nur Erwerbstätigkeiten beibehalten.
keep if _merge == 3

* die Erwerbstätigkeiten ohne gültiges Enddatum droppen.
drop if endy  < 0 | endm < 0

* Umwandlung des Enddatums des Biography-files.
gen end = ym(endy, endm)

* Das aktuellste Datum an den Anfang jedes Falles sortieren.
gsort ID_t -end

* Den ersten spell jedes Falles mit einer 1 in der Variablen mark markieren.
gen mark = 0
replace mark = 1 if ID_t != ID_t[_n-1]

* nachfolgende spells markieren, falls gleiches Enddatum wie aktueller spell.
replace mark = 1 if ID_t == ID_t[_n-1] & mark[_n-1] == 1 & end == end[_n-1]

* aktuelle spells auswählen und Anzahl aktueller spells pro Fall auszählen.
drop if mark == 0
bysort ID_t: gen nspell = _n
fre nspell

Du wirst einige Fälle vorfinden (siehe Auszählung der Variablen nspell), die mehr als einen spell aufweisen, weil manche Personen mehrere Jobs gleichzeitig haben. In den Fällen, in denen es mehrere aktuelle Jobs gibt, müsstest du dir entweder Priorisierungsregeln überlegen (z.B. die Auswahl des Jobs, der den höchsten Umfang an Arbeitsstunden aufweist) oder Informationen über die vorhanden aktuellen Jobs eines Falles hinweg aggregieren (z.B. die Arbeitsstunden von allen aktuellen Jobs aufaddieren und anhand der Summe entscheiden, ob die Person insgesamt gesehen Voll- oder Teilzeit arbeitet).

Viele Grüße, Ralf.