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_1.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

2.1 Variablenwerte 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

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

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

  • Allen Einheiten, die in der Ausgangsvariable rlgblg die Ausprägung “2” tragen, wurde nun in der neu angelegten Variable rlgblg_neu der Wert “0” zugewiesen.
  • Weil die Kategorie “1” der Ausgangsvariable identisch auch in der rekodierten Variable abgebildet sein soll, wurde allen Einheiten, die in der Ausgangsvariable rlgblg die Ausprägung “1” tragen, in der neu angelegten Variable rlgblg_neu der Wert “1” zugewiesen.

Die eckige Klammer spezifiziert also die Bedingung, unter der die Ersetzung mit dem Wert nach dem Pfeil vorgenommen werden soll. Die Befehlsstruktur zum Rekodieren lautet dementsprechend:

  • daten$neueVariable[daten$Ausgangsvariable == Alter Wert] <- Neuer Wert

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.2 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.3 Variablenwerte Rekodieren: Klassifizieren

Variablen werden auch dann rekodiert, wenn wir Kategorien gleicher Tendenz zusammenfassen bzw. die Variable “klassifizieren”. Dies ist beispielsweise der Fall, wenn wir alle Personen mit tendenziellem “Interesse” an Politik in einer Variablenkategorie vereinigen wollen - gleich, ob dieses Interesse stark oder nur mittelmässig ausgebildet ist:

# Inspiziere "polintr"
attributes(ess8$polintr)
## $label
## [1] "How interested in politics"
## 
## $format.stata
## [1] "%21.0g"
## 
## $class
## [1] "haven_labelled" "vctrs_vctr"     "double"        
## 
## $labels
##       Very interested      Quite interested     Hardly interested 
##                     1                     2                     3 
## Not at all interested               Refusal            Don't know 
##                     4                    NA                    NA 
##             No answer 
##                    NA
table (ess8$polintr)
## 
##     1     2     3     4 
##  5415 15539 15248  8088

Die Ausgangsvariable polintr ist als numeric klassifiziert und misst vier verschiedene Abstufung des Interesses an Politk, wobei die meisten Personen sich in einer beiden mittleren Kategorien positionieren.

# Klassifiziere "polintr" in zwei Basiskategorien
ess8$polintr_kat<-NA
ess8$polintr_kat[ess8$polintr <= 2] <- "interesse"
ess8$polintr_kat[ess8$polintr >= 3] <- "kein interesse"

# Inspiziere die klassierte Variable
table (ess8$polintr_kat)
## 
##      interesse kein interesse 
##          20954          23336
class(ess8$polintr_kat)
## [1] "character"

Hier wurde eine nun eine neue (kategoriale) Variable mit dem Namen polintr_kat erstellt. Allen Werten bis einschliesslich “2” wurde das Label ‘interesse’, zugewiesen, Werten ab “3” ‘kein interesse’. Übersetzt in die Alltagssprache lautet der Befehl wiederum: “Wenn bei einem Merkmalsträger in der Variable polintr der Wert 2 oder kleiner vorliegt, dann weise in der Variable polintr_kat den Wert ‘interesse’ zu”, usw.

Ein weiteres Beispiel für eine Klassifizierung, hier um generelle Tendenzen in der politischen Positionierung zusammenzufassen:

# 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"

# Inspiziere die klassierte Variable
table (ess8$lrscale_kat)
## 
##  links  mitte rechts 
##   8184  20274  10125
class (ess8$lrscale_kat)
## [1] "character"

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.

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”