Aggregieren von Microm-Daten

Liebes NEPS-Forum,

ich arbeite unter anderem mit den Microm-Daten. Hier interessieren mich vor allem die Variablen mgm_k_dom (dominantes Milieu), mgs_k_dom (dominantes Submilieu), alq_p_quote und alq_k_quote (Arbeitslosenquoten).

Mein Problem ist nun, dass es ebendiese Variablen nur auf PLZ-8-Ebene gibt, nicht aber auf PLZ-, oder Gemeindeebene. Ich brauche eine repräsentative Stichprobe pro ID_regio (mit anderen Worten: es sollten mindestens 5-10 Personen in der gleichen Einheit wohnen). Leider gibt es auf PLZ-8-Ebene oft aber nur eine oder zwei Personen pro ID_regio.

Ich habe mir deswegen überlegt, die PLZ-8-Infos auf PLZ- oder Gemeinde-Ebene zu aggregieren (sodass alle PLZ-8_IDs ihrer PLZ zugeordnet werden) und von diesen Aggregaten dann einen ungewichteten Durchschnitt zu berechnen. Das dominante Milieu, das am häufigsten PLZ-8 Ebene vorkommt, soll dann das dominante Milieu auf PLZ- oder Gemeinde- Ebene sein.

Wenn man sich die ID_regios auf PLZ-8 und PLZ-Ebene (oder Gemeinde) anschaut, kann man auch ungefähr erkennen, welche PLZ-8-Nummern in einer PLZ (oder einer Gemeinde) enthalten sind. Nur bin ich mir unschlüssig, wie ich vorgehen muss.

Ich hoffe, ich habe mich einigermaßen verständlich ausgedrückt. Herzlichen Dank schon einmal für Eure Vorschläge.

VG,

Leonie

Liebe Leonie,

dir muss dabei klar sein, dass die PLZ-Ebene nicht deckungsgleich mit der Gemeindeebene ist, d.h., es gibt Gemeinden, die mehrere Postleitzahlen haben, und umgekehrt erstrecken sich Postleitzahlgebiete manchmal über mehrere Gemeinden. Mit einer 1:1 Aggregation kommst du hier nicht hin.

Da es sich ja aber um Kontextinformation handelt, ist es natürlich möglich, aus den vorliegenden Werten auf PLZ(8)-Ebene einen aggregierten Wert für alle Personen aus einer Gemeinde zu bilden. Ob das Sinn macht, musst du letztlich inhaltlich entscheiden und begründen. Eine Möglichkeit, dass zu tun, wäre z.B. (mit einigen Implikationen):

use ID_t wave regio ID_regio mgm_k_dom using "SC6_pTargetMicrom_O_10-0-1", clear

* Nur Welle 6 behalten und nur die PLZ-8 und Gemeindeebene
keep if wave==6  & regio>=4

* Die Werte aus der PLZ-8-Ebene in die Gemeindeebene kopieren
bysort ID_t (regio): replace mgm_k_dom=mgm_k_dom[_n-1] if missing(mgm_k_dom)

* nur noch Gemeindeebene behalten
keep if regio==5

* Daten innerhalb einer Gemeinde-ID aggregieren
bysort ID_regio: egen mgm_k_dom_median=median(mgm_k_dom)

Falls du mehrere Wellen betrachten willst, wird die Syntax natürlich komplexer. Auch handelt es sich bei mgm_k_dom eigentlich um eine nominalskalierte Variable, wie du diese aggregieren möchtest, müsstest du inhaltlich begründen (der Median oben ist nur ein Beispiel).

Gutes Gelingen weiterhin,
Tobias

Lieber Tobias,

herzlichen Dank für diesen Vorschlag, so hat es geklappt.

Ich habe beim Aggregieren auf Gemeindeebene allerdings den Modus der Variable mgm_k_dom genommen, sodass das Milieu stehenbleibt, das in einer Gemeinde am häufigsten vorkommt. Problem ist hier natürlich, dass es viele Gemeinden gibt, wo der Modus nicht eindeutig zugeordnet werden kann, weil es mehrere gibt.

Deswegen hatte ich die Idee, den Modus von dem Milieu zu behalten, das in der Gesamtheit relativ gesehen überwiegt.
Fiktives Beispiel:

problem

In diesem Beispiel gibt es keinen eindeutigen Modus. Die Variable N pro Milieu gibt an, wie viele Personen insgesamt (aus dem ganzen sample) einem Milieu beiwohnen. Ich möchte nun „hed“ als neuen Modus behalten, weil N hier größer ist als für „bum“. Ich habe verschiedene Dinge ausprobiert, es aber irgendwie nicht ganz hinbekommen.

Für einen Tip wäre ich sehr dankbar! :slight_smile:

Viele Grüße,

Leonie

Liebe Leonie,

um den Modus anstatt des Medians zu berechnen musst du den Befehl oben nur leicht anpassen:

bysort ID_regio: egen mgm_k_dom_mode=mode(mgm_k_dom)

Der Modus-Befehl in Stata bringt außerdem einige Optionen mit, so z.B. maxmode und minmode. Dann wird bei Gleichstand der größte bzw. kleinste Wert genommen. Groß/klein wird allerdings definiert durch den (numerischen) Wert, den die Variable hat. Unter Umständen ist die Variable schon zumindest ordinalskaliert, dann macht das vielleicht Sinn. Wenn du eine eigene Logik in die Wertereihenfolge bringen möchtest (so wie du oben schreibst z.B. nach der Gesamthäufigkeit in der Population), wäre eine Möglichkeit z.B. an die obige Syntax anzuschließen mit:

preserve
* behalte nur die Variable mgm_k_dom
keep mgm_k_dom
** Missings rauswerfen
keep if !missing(mgm_k_dom) & mgm_k_dom>0
** Gesamtanzahl in der Population errechnen
bysort mgm_k_dom: gen n = _N
** Liste auf die tatsächlichen 10 Einträge reduzieren
duplicates drop
** nach der Häufigkeit sortieren
sort n
** neue Variable erstellen, bei der 1=Wert mit der geringsten Häufigkeit
gen mgm_k_dom_n = _n
** Label von der ursprünglichen Variable übernehmen
decode mgm_k_dom, gen(label)
labmask mgm_k_dom_n, values(label)

** Liste zwischenspeichern und an den Ausgangsdatensatz anspielen
keep mgm*
tempfile mgm
save `mgm'
restore
merge m:1 mgm_k_dom using `mgm', keep(master match) nogen

** Modus aus der neu sortierten Variablen mit der Option maxmode errechnen
bysort ID_regio: egen mgm_k_dom_maxmode=mode(mgm_k_dom_n), maxmode

Viele Grüße,
Tobias