Mergen mit pCourseClass

Liebes FDZ-Team,

für einen Artikel möchte ich eine Mehrebenenanalyse mit den Daten der SC2 durchführen. Hierfür benötige ich unter anderem den Datensatz pCourseClass. Beim mergen des Datensatzes an den CohortProfile-Datensatz geht bei mir aber etwas schief und ich finde den Fehler einfach nicht (vielleicht habe ich auch etwas einfach nicht mitbedacht). Das mergen der anderen Datensätze (selbst der Microm-Daten) funktioniert hingegen reibungslos.

Folgendes ist das Problem: Ich möchte pCourse an den CohortProfile mergen. Hierzu nehme ich ID_cc und wave. Beim pCourse kümmere ich mich mit ex20100 zuerst um die Duplikate. Ich merge m:1. Also das, was auch in der Merging Matrix angegeben ist. So sieht mein Do-File an der Stelle aus:

Ergebnis: Fehlermeldung, weil ID_cc und wave die Beobachtungen nicht eindeutig zuordnen können. (Gleiche Fehlermeldung kommt auch, wenn ich davor nur bei Cohort den „isid ID_cc wave“ Befehl eingebe.)

Ich habe vieles versucht, bspw. 1:m statt m:1, pCourse vorab auf die Welle einschränken, pCourse vorab auf genau die 5 Variablen und eine Welle (plus ID_cc ) einschränken, die ich mindestens benötige, pCourse vorab mit einem anderen Datensatz mergen, um das dann an CohortProfile anzufügen, den gesamten Arbeitsdatensatz zu erstennen und dann erst pCourse zu mergen…alles zwecklos.

Im Kern denke, dass es daran liegt, dass ID_cc und wave die Beobachtungen nicht einwandfrei zuordnen können. Vielleicht gibt es auch einen ganz simplen Trick oder etwas, was ich nicht kenne, bedenke, irgendwas.

Eine Kollegin riet mir, mal mit m:m zu mergen → Tada, das geht! Aber eigentlich sollte man das ja nicht machen, daher an euch die Frage: Könnt ihr mir bitte helfen?

Herzliche Grüße,
Eva

Liebe Eva,

danke für deinen Beitrag, der sicherlich für viele andere Nutzer hilfreich ist.
Mit pCourseClass in der SC2 hast du dir einen Datensatz ausgesucht, der tatsächlich ein paar Fallstricke bereithält und nicht ohne weiteres an andere Datensätze angespielt werden kann.
Im zugehörigen Datenmanual auf Seite 74f findest du hierzu schonmal ein paar Hinweise.

Zunächst gilt es, den Datensatz pCourseClass um Duplikate zu bereinigen. Dummerweise kam es im Feldverlauf dazu, dass teilweise manche Lehrer doppelte Fragebögen ausgefüllt haben oder mehrere Lehrer Fragebögen für dieselbe Klasse augefüllt haben.

use [Datenpfad]/pCourseClass.dta, clear
keep if ex20100 ==1
duplicates tag ID_cc wave, gen(dups)          // doppelte Fälle markieren
bysort ID_cc dups: drop if dups ==1 & _n!=1   // so behält man nur jeweils die erste Angabe
tempfile class
save `class'     // temporär abspeichern

Um diese Daten nun an CohortProfile mergen zu können, muss man zunächst sicherstellen, dass die beötigten merge-Variablen ID_cc und wave im Datensatz eindeutig die Beobachtungen identifizieren können. Da in CohortProfile allerdings auch Beobachtungen enthalten sind, in denen keine Klasseninfo erhoben wurde und die betreffende ID-Variable daher mit einem Missing für all diese Fälle befüllt ist, kann man nicht ohne Weiteres an CohortProfile anmergen.
Wir müssen daher alle Beobachtungen, die einen fehlenden Wert in ID_cc aufweisen, entfernen. Ob wir diese Fälle später wieder hinzufügen, hängt dann einfach von der geplanten Analyse ab. In der folgenden Syntax habe ich mal beide Optionen integriert:

use [Datenpfad]/CohortProfile.dta, clear
count if inlist(ID_cc,.,-55)    // wie viele missings gibt es?
assert !inlist(ID_cc,.,-55) if tx80525 ==1     // wenn die Klasseninfo vorliegt, gibt es nur gültige Werte

// Option (1): Fälle ohne Klasseninfo sollen nach dem Merge wieder hinzugefügt werden können:
frame put _all if tx80525 ==0, into(fr_noclass)      // in extra frame schieben

// ODER
// Option (2): alle Fälle ohne Klasseninfo direkt löschen
drop if tx80525 == 0
assert !inlist(ID_cc,.,-55)     // sicherstellen, dass nur noch gültige Werte vorhanden sind

// da in CohortProfile mehrere Kinder derselben Klasse angehören und im Klassendatensatz
// nur je 1 Info pro Klasse vorliegt, benötigen wir einen m:1 merge!
merge m:1 ID_cc wave using `class'    // vorher gespeicherten Datensatz anmergen

// optional: vorher gelöschte Fälle wieder hinzufügen:
frameappend fr_noclass
frame drop frnoclass

Alternativ könnte man auch einfach eine zusätzliche künstliche merge-Variable in pCourseClass anlegen, um direkt mit CohortProfile mergen zu können:

use [Datenpfad]/pCourseClass.dta, clear
keep if ex20100 ==1
duplicates tag ID_cc wave, gen(dups)          // doppelte Fälle markieren
bysort ID_cc dups: drop if dups ==1 & _n!=1   // so behält man nur jeweils die erste Angabe
tempfile class
gen tx80525 = 1  // künstliche Identifikatorvariable erzeugen
save `class'     // temporär abspeichern
use [Datenpfad]/CohortProfile.dta, clear
merge m:1 ID_cc wave tx80525 using  `class'

Der Trick ist hier, dass man so tut als hätte man eine tx80525 Variable in beiden Datensätzen, weil man ja weiß, dass man nur an diejenigen Beobachtungen in CohortProfile mergen will, die tx80525 ==1 sind. Das ist vermutlich auch der kürzere und einfachere Weg. Sorry, dass mir der erst während des Schreibens eingefallen ist :wink: Jetzt kannst du entscheiden, wie dus machen möchtest. Viele Wege führen zum Ziel!

Damit solltest du problemlos die Informationen des Klasslehrers mit analysieren können!
Viel Erfolg und beste Grüße,
Benno

1 Like

Noch ein Nachtrag:
Gut, dass du nicht auf deine Kollegin gehört hast, die dir einen m:m merge vorgeschlagen hat!!! In KEINEM - ich wiederhole ABSOLUT GAR KEINEM - Fall ist ein m:m merge eine gute Idee, da hierdurch nur Datenmüll produziert wird.
Vielleicht kannst du deine Kollegin bei Gelegenheit mal vorsichtig drauf hinweisen :wink:

Lieber Benno,

vielen herzlichen Dank! Ich habe die letzte von dir genannte Möglichkeit gewählt und zusätzlich die Option, in der ich die Fällr nach dem Mergen wieder hinzufüge. On-site mit den Raumdaten kann ich es erst kommende Woche durchlaufen lassen, aber alles was ich Remote jetzt ausprobieren konnte, hat super geklappt!

Danke auch nochmal für den Verweis auf das Datenmanual. Das verliert man schnell aus dem Blick, wenn man einfach mal fix mit Rechnen loslegen möchte. Ich freu mich auf meine Zeit in Bamberg.

Viele Grüße,
Eva