invisible header

link zum pdf

In dieser zweiten Wiederholungssitzung widmen wir uns dem Management von Daten nach dem Einlesen. Mit R können Variablen rekodiert, neu erstellt, gelöscht oder umbenannt werden - Prozeduren, die zur Vorbereitung der Datenanalyse wichtig sind.

Wir arbeiten wiederum mit dem Datensatz European Social Surveys (ESS8e02_1.dta).

# Statistik 2: R Tutorat
# Übungsskript zum Thema Datenmanagement
# Datum: XX.XX.XXXX
# AutorIn: XXX

 

Vorbereitung: Einlesen der Daten und Aktivieren der nötigen Packages

# Working directory setzen
setwd("C:/mein_laufwerk/mein_datenverzeichnis")
# oder bei Mac usern: 
setwd("~/daten") 
# Daten einlesen
library(haven)
ess8 <- read_dta("ESS8e02_2.dta")
# install.packages("tidyverse")
library(tidyverse)

 

1. Aufräumen und Überblick

Zu Beginn räumen wir das Environment auf und löschen Objekte, die wir nicht mehr brauchen. Mit rm(list=ls()) löschen wir alle Objekte, mit remove() können wir einzelne auswählen.

rm(list=ls())
remove(Irrelevantes Objekt)

Alternativ kann im Environment auch das Besen-Symbol zum Löschen sämtlicher Objekte angeklickt werden.

Das Entfernen von Objekten, die im Arbeitsprozess nicht mehr benötigt werden, dient der Übersichtlichkeit. Wenn ein Objekt entfernt wurde, kann es über erneutes Einlesen des Datensatzes bzw. erneuter Ausführung des Skriptes wieder eingefügt/erstellt werden.

library(labelled)
varlist <- look_for(ess8)
View(varlist)

Gerade bei grösseren Datensätzen wie dem ESS kann es sinnvoll sein, initial vor jeder Session ein Codebook anzulegen, um dann bei Bedarf schnell nach Merkmalen oder deren Attributen zu suchen.

 

2. Bereinigen: Rekodieren

Eine Variable rekodieren heisst, ihre Ausprägungen mit neuen Werten zu überschreiben bzw. umzuwandeln. Manchmal ist es z.B. sinnvoll, mehrere Ausprägungen einer metrischen Variable in Klassen zusammenzufassen. Dies ist etwa der Fall, wenn ihr euch für Generationen statt einzelne Altersstufen interessiert. Ihr würdet dann in der Altersvariable die Ausprägungen 25 bis 40 mit dem Wert ‘Millenial’ überschreiben wollen.

Hier wollen wir zu Übungszwecken die Variable rlgblg mit neuen Werten belegen. Konkret: Wir wollen sie in eine sog. “Dummy-Variable” mit den Kategorien “0” (für “Merkmal liegt nicht vor”) und “1” (“Merkmal liegt vor”) transformieren. Als erstes können wir über den Befehl attributes() die Ausprägungen und Labels der Ausgangsvariable ermitteln:

attributes(ess8$rlgblg)
## $label
## [1] "Belonging to particular religion or denomination"
## 
## $format.stata
## [1] "%12.0g"
## 
## $class
## [1] "haven_labelled" "vctrs_vctr"     "double"        
## 
## $labels
##        Yes         No    Refusal Don't know  No answer 
##          1          2         NA         NA         NA

Alternativ hätten wir zur Variableninspektion auch das oben per look_for angelegte Codebook konsultieren können.

Erster Schritt der Rekodierung ist (meist) die Generierung einer neuen Variable:

# Generiere neue Variable für Rekodierung
ess8$rlgblg_neu <- NA

Hier wurde eine neue Variable rlgblg_neu angelegt und vollständig mit “NA” belegt. Hintergrund: Es gibt verschiedene Strategien zur Modifikation bzw. Rekodierung einer Variable, die jeweils mit bestimmten Vor- und Nachteilen verbunden sind. Wir haben uns hier zur Dokumentation derjenigen Variante entschieden, die in den meisten von uns durchprobierten Szenarien gut funktioniert. So beugt die Anlage einer neuen, typneutralen Variable späteren Typkonflikten vor, und die Belegung mit “NA” (statt mit leeren Werten) sorgt dafür, dass viele potentielle Rekodierungsfehler später schneller auffallen.

Den schon bekannten Pfeil (<-) nutzen wir auch als Rekodierungsanweisung:

# Rekodiere "rlgblg" als Dummy-Variable
ess8$rlgblg_neu[ess8$rlgblg == 2] <- 0
ess8$rlgblg_neu[ess8$rlgblg == 1] <- 1

Der Clou ist nun, dass zusätzlich zur Rekodierungsanweisung <-0 eine Bedingung in den Befehl eingebunden wird, damit jeweils nur bestimmte Ausgangswerte der Variable mit einem bestimmten neuen Wert kodiert werden. Solche Bedingungen werden in R über eckige Klammern ([…]) gesetzt. Die Befehlsstruktur zum Rekodieren lautet dementsprechend:

# Kontrolle mit table 
table(ess8$rlgblg)
## 
##     1     2 
## 26314 17772
table(ess8$rlgblg_neu)
## 
##     0     1 
## 17772 26314
attributes(ess8$rlgblg_neu)
## NULL

Die ausgewiesenen Fallzahlen von alter und neuer, recodierter Variable zeigen:

Achtung: Die Wertelabel der Ausgangsvariable wurden bei der Rekodierung nicht mit übertragen - siehe “attributes” oben. Diese können bei Bedarf (z.B. auf Basis des Packages “labelled”) neu angelegt werden:

ess8$rlgblg_neu <- labelled::labelled(ess8$rlgblg_neu, c(no = 0, yes = 1))
attributes(ess8$rlgblg_neu)
## $labels
##  no yes 
##   0   1 
## 
## $class
## [1] "haven_labelled" "vctrs_vctr"     "double"

ps: Das “labelled”-Package muss für diese Funktionalität aktiviert sein, sonst greift R an dieser Stelle auf einen “falschen”, gleichlautenden Befehl aus dem “haven”-package zu.

Die Notwendigkeit, Rekodierungen vorzunehmen, begegnet uns in der Datenpraxis oft. Einige weitere typische Anwendungen:

 

2.1 Variablenwerte Rekodieren: Missings

ess8$eisced[ess8$eisced == 55] <- NA

In R müssen fehlende Werte als NA kodiert sein, damit sie auch als solche erkannt werden. Entsprechende Rekodierungen sind oft notwendig, da fehlende Werte in den bereitgestellten Daten häufig durch numerische Angaben kodiert sind. Dies ist ein Problem, weil dann Statistiken verfälscht werden. Bei einfachen Rekodierungen kann, wie hier, die Umbildung oft auch direkt in der Ausgangsvariable erfolgen. Das heisst: Ausgangs- und Zielvariable des Rekodierungsbefehls sind dann identisch. Aber Achtung: das funktioniert nicht immer!

 

2.2 Variablenwerte Rekodieren: Umpolung

Auch wenn es meist nicht zwingend ist, kann es gelegentlich sinnvoll sein, Variablen umzupolen.

# Inspiziere "polintr"
attributes(ess8$aesfdrk)
## $label
## [1] "Feeling of safety of walking alone in local area after dark"
## 
## $format.stata
## [1] "%12.0g"
## 
## $class
## [1] "haven_labelled" "vctrs_vctr"     "double"        
## 
## $labels
##   Very safe        Safe      Unsafe Very unsafe     Refusal  Don't know 
##           1           2           3           4          NA          NA 
##   No answer 
##          NA
table (ess8$aesfdrk)
## 
##     1     2     3     4 
## 12995 22393  7082  1522

Bei einer Variable wie aesfdrk, die den Grad an Sicherheitsempfingen abfragt, erschiene beispielsweise eine Belegung nach dem Leitbild “je höher der Wert, desto höher das Sicherheitsempfingen” naheliegender und intuitiver:

# Umpolung
ess8$aesfdrk_new<-NA
ess8$aesfdrk_new[ess8$aesfdrk == 1] <- 4
ess8$aesfdrk_new[ess8$aesfdrk == 2] <- 3
ess8$aesfdrk_new[ess8$aesfdrk == 3] <- 2
ess8$aesfdrk_new[ess8$aesfdrk == 4] <- 1


# Inspiziere die umgepolte Variable
table (ess8$aesfdrk_new)
## 
##     1     2     3     4 
##  1522  7082 22393 12995
class (ess8$aesfdrk_new)
## [1] "numeric"
attributes (ess8$aesfdrk_new)
## NULL

Achtung: Auch hier wurden Label (Hauptlabel und Wertelabel) bei Anlage der neuen Variable und der bedingten Belegung nicht übernommen. Sie müssen ggf. auf Basis eines einschlägigen Packages bzw. Kommandos (siehe oben) neu angelegt werden.

2.3 Variablenwerte Rekodieren: Klassifizieren

Variablen werden auch dann rekodiert, wenn wir Kategorien gleicher Tendenz zusammenfassen bzw. die Variable “klassifizieren”. Im folgenden Beispiel werden z.B. generelle Tendenzen in der politischen Positionierung zusammengefasst:

# Inspiziere "lrscale"
table (ess8$lrscale)
## 
##     0     1     2     3     4     5     6     7     8     9    10 
##  1463   846  2121  3754  3780 12389  4105  4269  3265   999  1592
class (ess8$lrscale)
## [1] "haven_labelled" "vctrs_vctr"     "double"
# Klassifiziere "lrscale" zu Basistendenzen
ess8$lrscale_kat<-NA
ess8$lrscale_kat[ess8$lrscale <= 3] <- "links" 
ess8$lrscale_kat[ess8$lrscale >= 4 & ess8$lrscale <= 6] <- "mitte"
ess8$lrscale_kat[ess8$lrscale >= 7] <- "rechts"

Hier wurde eine neue (kategoriale) Variable mit dem Namen lrscale_kat erstellt. Allen Werten von 0 bis einschliesslich 3 wurde der Wert ‘links’ zugewiesen, Werten von 4 bis einschliesslich 6 der Wert ‘mitte’ und ab 7 der Wert ‘rechts’. Interessant: Durch die Belegung der neuen Variable mit Schriftzeichen statt Zahlen wird ihr automatisch die Klasse “character” zugewiesen.

Auf Basis von Häufigkeitsauszählungen und insb. einer einfachen Kreuztabellierung könnt Ihr nun noch prüfen, ob (a) sich die Fallzahlen in der neuen Variable korrekt aufaddieren und (b) alle Zuordnungen dem Verkodungsschlüssel entsprechen:

# Inspiziere die klassierte Variable
table (ess8$lrscale_kat)
## 
##  links  mitte rechts 
##   8184  20274  10125
table (ess8$lrscale)
## 
##     0     1     2     3     4     5     6     7     8     9    10 
##  1463   846  2121  3754  3780 12389  4105  4269  3265   999  1592
table(ess8$lrscale_kat, ess8$lrscale, useNA = "always")
##         
##              0     1     2     3     4     5     6     7     8     9    10
##   links   1463   846  2121  3754     0     0     0     0     0     0     0
##   mitte      0     0     0     0  3780 12389  4105     0     0     0     0
##   rechts     0     0     0     0     0     0     0  4269  3265   999  1592
##   <NA>       0     0     0     0     0     0     0     0     0     0     0
##         
##           <NA>
##   links      0
##   mitte      0
##   rechts     0
##   <NA>    5804

Klassifizierungen können sinnvoll sein für Gruppenvergleiche (siehe das Beispiel zu den Alterskohorten oben) oder wenn es entscheidende Grenzen der Variable gibt (z.B. arm vs. nicht arm bei der Einkommensvariable). Zu beachten ist aber, dass mit Klassifizierungen immer ein Informationsverlust einhergeht - deswegen wägt vorher immer gut ab, ob dieser auch gerechtfertigt ist.

 

2.4 Variablenwerte Rekodieren: Reskalierungen

Wir können - wie in der vorigen Sitzung bereits angedeutet - auch Rechenoperationen an Variablen durchführen um diese umzuformen.

In diesem Fall rekodieren wir die Einheiten der Variable netustm von «Minuten pro Tag» in «Stunden pro Tag»:

ess8$netusth <- ess8$netustm/60

 

3. Bereinigen: Variablen Umbenennen

library(dplyr)
ess8 <- rename(ess8, "citizen" = "ctzcntr")

Mittels rename() Befehl aus dplyr lassen sich die Namen der Variablen verändern. Dies kann hilfreich sein, wenn die Namen inhaltlich nicht interpretierbar oder zu lang sind. Die allgemeine Befehlsstruktur lautet:

rename(daten, neuer Name = alter Name)

 

4. Datenauswahl: Variablen Selektieren

Eine typische analysevorbereitende Operation ist die Reduktion des Datensatzes auf die für die Analyse wichtigen Variablen:

ess8_ss <- select(ess8, idno, cntry, citizen, eduyrs)  

Hier wurde mithilfe des select()-Befehls ein Teildatensatz “ess8_ss” mit den Variablen citizen und eduyrs erstellt. Einer Konvention folgend schliessen wir auch die Identifier (hier idno und cntry) mit ein.

Mit select() kann man also den Datensatz auf die akut relevanten Variablen begrenzen und so mehr Übersichtlichkeit gewinnen.

 

5. Datenauswahl: Merkmalsträger Filtern

Ebenfalls eine wichtige Operation: den Datensatz auf bestimmte Merkmalsträger beschränken bzw. ausprägungsabhängige Teilgruppen des Datensatzes bilden:

citizen <- filter(ess8_ss, citizen == 1)

Gemäss Codebook wurde Personen mit Staatsbürgerschaft im Befragungsland der Wert (1) zugewiesen und Personen ohne Staatsbürgerschaft im Befragungsland der Wert (2). Mit dem filter() Befehl haben wir nun also Personen mit der Ausprägung (1) herausgefiltert und damit eine neue Teilstichprobe namens “citizen” erstellt, die ausschliesslich Personen mit Staatsbürgerschaft enthält.

Die “Gegenteilstichprobe” aller Personen ohne Staatsbürgerschaft ergibt sich entsprechend durch:

non_citizen <- filter(ess8_ss, citizen == 2)

Übrigens: Anstatt mit == (gleich), könnten wir auch mit != (ungleich) alle Merkmalsträger, die nicht die entsprechende Ausprägung haben, herausfiltern.

5.1 Filtern: Teilgruppenvergleich

Gruppierungen mit filter() werden häufig vorgenommen, um Mittelwerte verschiedener Teilgruppen miteinander zu vergleichen. Zum Beispiel um die Frage zu beantworten, ob Personen mit oder ohne Staatsbürgerschaft eine längere Schullaufbahn vorweisen können.

mean(citizen$eduyrs, na.rm = TRUE)
## [1] 13.02351
mean(non_citizen$eduyrs, na.rm = TRUE)
## [1] 13.27332

Die Variable Lebenszufriedenheit ist von (0) bis (54) kodiert, wobei (54) den Maximalwert in der Stichprobe darstellt (54 Jahre formelle Bildung). Somit haben Personen ohne Staatsbürgerschaft im Durchschnitt eine längere Schullaufbahn von 13.27 Jahre im Vergleich zu Personen mit Staatsbürgerschaft, wobei letztere eine durchschnittliche Schullaufbahn von 13.02 Jahren aufweisen.

 

Hier gehts weiter zur Übung II

 

logo.knit

Conforti, E., Siefart, F., De Min, N., Dürr, R., Hofer, L., Rauh, S., Senn, S., Strassmann Rocha, D., Giesselmann, M. (2023): “Regressionsanalysen mit R”