Hallo Thomas,
und willkommen im NEPSforum! Leider ist es, durch den Jahreswechsel bedingt, zu ein wenig Verzögerung gekommen, bis wir uns im Detail deines Problems annehmen konnten, wir bitten, das zu entschuldigen.
Soweit ich das sehe, ist das Kernproblem deiner Datenaufbereitungssyntax, wie du sie uns hier zeigst, dass sie unterschiedliche Datenarten (nämlich Episoden- und Paneldaten) ein einen Topf wirft. Das sorgt zwangsweise dafür, dass an der ein- oder anderen Stelle lückenhafte Daten entstehen; ich denke, es ist sinnvoller, zunächst beide Datentypen getrennt zu halten, und erst für die Analyse zu verbinden. Dabei ist es notwendig, im Hinterkopf zu haben, welches Datenformat die geplante Analyse eigentlich benötigt – handelt es sich um eine Ereignisdatenanalyse, es müssen also Episodendaten vorliegen, oder eine "herkömmliche" Paneldatenanalyse, die (wiederholte) Querschnittsinformationen verlangt.
Ich gehe, weil du nichts detaillierteres dazu geschrieben hast, vom letzteren Fall aus. Der sinnvollste Weg dahin ist:
- Episodendaten vorbereiten
- Querschnitts- bzw. Paneldaten vorbereiten
- Zusammenspielen der beiden Informationstypen auf Basis des Interviewdatums
Es ist das letzte Detail an dieser Prozedur, das in deiner Syntax anders gelaufen ist. Du spielst pTarget und Biography über die Variable splink zusammen. Das ist mit ziemlicher Sicherheit nicht das, was du möchtest – die Variable splink in pTarget bezieht sich nicht auf die jeweils zum Interviewzeitpunkt andauernde Episode, sondern auf die Ewerbsepisode, zu der im Querschnittsfragebogen in den Wellen 4 und 8 gesonderte Fragen gestellt wurden. Für die übrigen Wellen ist die Variable nicht gefüllt, und deshalb produziert dein merge viele fehlende Werte.
Ich habe den meines Erachtens korrekten Weg zum Zusammenspieleln in der folgenden Syntax skizziert; dabei habe ich ein paar Feinheiten eingebaut, die vielleicht auch zukünftig hilfreich sein könnten:
- Die Syntax verwendet nepsuse aus dem Stata-Paket nepstools (das du bereits kennst, du verwendest ja auch nepsmiss aus dem gleichen Paket), um das Laden der Datensätze etwas komfortabler zu gestalten.
- Für temporäre Dateien verwendet die Syntax Statas eingebauten Mechanismus für temporäre Dateien, tempfile. So kümmert sich Stata selbst darum, die temporären Dateien wieder zu entfernen.
// "simplified" loading of NEPS files with -nepsuse-: pre-save path, cohort, version and level
global NEPSuse_directory "/usr/local/share/NEPS_SUFs/\`cohort'_\`level'_\`dashedversion'/Stata14"
global NEPSuse_level "D"
global NEPSuse_cohort "SC6"
global NEPSuse_version "8.0.0"
// annouce temporary datasets to Stata
tempfile emp episodes
// prepare interesting variables from spEmp
nepsuse ID_t wave splink subspell ts23204_ha ts23510_g1 ts23243_v1 ts23219_g1 ///
ts23229 ts23230 ts23231 ts23232 ts2311m ts2311y ts2312m ts2312y ts23310 ///
using "spEmp" , clear
keep if subspell==0
drop subspell
save `"`emp'"'
// load Biography, merge relevant variables from spEmp
nepsuse "Biography", clear
* only keep employment episodes
keep if sptype == 26
* merge with prepared spEmp data subset
merge 1:1 ID_t splink using `"`emp'"', nogenerate assert(match using) keep(match)
* nepsmiss
nepsmiss _all
* blow up data to monthly discrete episode
generate enddate=ym(endy,endm)
generate startdate=ym(starty,startm)
generate duration=enddate-startdate+1
expand duration
bysort ID_t splink : generate intdate=startdate+_n-1
format enddate startdate intdate %tm
// save episode data
save `"`episodes'"', replace
// prepare interesting variables from pTarget
nepsuse ID_t wave t700001 t70000m t70000y tx20001 tx20002 tx20003 t405000_ha ///
t731301_ha t731303_ha t731351_ha t731353_ha t271800 t271801 ///
t271802 t271804 intm inty ///
using "pTarget", clear
* nepsmiss
nepsmiss _all
* generate interview date to merge episode data with
generate intdate=ym(inty,intm)
format %tm intdate
* there are two observations with invalid interview dates for wave 7 (december 2015); they are dropped here
drop if wave==7 & intm==12 & inty==2015
* merge with episode data: only information that is valid at the interview date
merge 1:m ID_t intdate using `"`episodes'"' , keep(master match) nogenerate
* inspect duplicates: all the tagged observations reported more than one employment episode at the interview date
* they have to be reduced for an analyses; it is, however, a decision influencing possible results
* which in way the reduction has to be performed (dropping duplicates, generating means, etc)
duplicates report ID_t wave
quietly : duplicates tag ID_t wave , generate(dups)
tabulate dups
Aber Achtung: Auch jetzt ist der Datensatz noch nicht fertig zum Analysieren; denn es gibt Personen, die (plausiblerweise oder auch nicht) mehrere zu einem Interviewzeitpunkt andauernde Erwerbsepisoden berichten. Für eine vernünftigte Analyse müssen diese Mehrfachnennungen noch bereinigt werden. Wie genau ist aber abhängig von der Fragestellung der Analyse.
Ich hoffe, das hilft ein wenig weiter. Rückfragen kannst du selbstverständlich gerne hier anbringen.
Beste Grüße
Bela