naniar & UpSetR

Mit dem Paket naniar sind die oben dargestellten Schritte viel schneller und leichter darzustellen. Das Paket schafft dabei auch immer einen ggplot, so dass die oben gelernten Anpassungen auch hier möglich sind. Zuerst nutzen wir Funktionen, um uns Tabellen mithilfe von naniar ausgeben zu lassen. Die Erste ist die Funktion miss_var_summary(), die uns die absolute und relative Häufigkeit von missings in den Variablen ausgibt.

pss %>%
  miss_var_summary()
## # A tibble: 14 × 3
##    variable n_miss pct_miss
##    <chr>     <int>    <num>
##  1 edu         352     7.04
##  2 agea        157     3.14
##  3 stfdem       95     1.9 
##  4 trstprl      35     0.7 
##  5 trstprt      17     0.34
##  6 trstlgl      12     0.24
##  7 trstplt      11     0.22
##  8 lrscale       7     0.14
##  9 stfeco        6     0.12
## 10 idno          0     0   
## 11 district      0     0   
## 12 gndr          0     0   
## 13 wkhtot        0     0   
## 14 income        0     0

Dies können wir auch gruppieren:

pss %>% 
  group_by(district) %>% 
  miss_var_summary()
## # A tibble: 65 × 4
## # Groups:   district [5]
##    district   variable n_miss pct_miss
##    <fct>      <chr>     <int>    <num>
##  1 Distrikt 1 edu          30      3  
##  2 Distrikt 1 stfdem       16      1.6
##  3 Distrikt 1 trstprl       8      0.8
##  4 Distrikt 1 trstprt       4      0.4
##  5 Distrikt 1 lrscale       2      0.2
##  6 Distrikt 1 trstlgl       1      0.1
##  7 Distrikt 1 idno          0      0  
##  8 Distrikt 1 gndr          0      0  
##  9 Distrikt 1 agea          0      0  
## 10 Distrikt 1 wkhtot        0      0  
## # ℹ 55 more rows

Zuerst können wir uns eine Verteilung der missings im Datensatz ausgeben lassen. Die Funktion gg_miss_var_cumsum() gibt uns die kumulierte Summe der missings pro Variable aus. Hieran kann man also ablesen, wie sich die missings auf die Variablen verteilen.

gg_miss_var_cumsum(pss)

Die Funktion vis_miss() visualisiert die missings eines gesamten Datensatzes (außer wir grenzen ein).

vis_miss(pss)

Eine weitere ansprechende Alternative ist die Funktion gg_miss_upset() aus dem Paket naniar. Hierbei werden auch die Häufigkeiten der Kombination der missings zwischen den Variablen angezeigt. Aber auch dies wird bei allzu großen Datensätzen schnell unübersichtlich. Für Teilbereich kann das aber aufschlussreich sein (z.B. wenn man prüfen möchte, ob Personen nur Teile einer Itembatterie oder die Itembatterie komplett nicht beantwortet haben).

gg_miss_upset(pss)

In der Grafik sieht man, dass die vier Variablen trstprt, trtprl, stfdem und agea edu haben. Insgesamt gibt es folgende Kombinationen:

  • 311 Fälle, die in edu NA haben,
  • 148 Fälle, die in agea NA haben,
  • 82 Fälle, die in stfdem NA haben,
  • 30 Fälle, die in trstprl NA haben,
  • 13 Fälle, die in trstprt haben,
  • 9 Fälle, die in stfdem und edu NA haben,
  • 5 Fälle, die in agea und edy NA haben,
  • 4 Fälle, die in trstprl und edu NA haben,
  • 3 Fälle, die in stfdem und agea NA haben,
  • 3 Fälle, die in trstprt und edu NA haben,
  • 1 Fälle, die in trstprl und stfdem NA haben,
  • 1 Fälle, die in trstprt und agea NA haben,

Insgesamt gilt, dass die maximale Anzahl an Kombinationen wie folgt berechnet wird: \(2^{Anzahl Variable} - 1\). In diesem Fall wären es 31 mögliche Kombinationen, angezeigt werden aber nur 12. Warum?

Daneben können missings zweier Variablen auch über die Funktion geom_miss_point() ganz leicht in einem ggplot dargestellt werden:

ggplot(
  pss,
  aes(
    x = district,
    y = agea
  )
) +
  geom_miss_point() 

So kann man ganz leicht sehen, ob die missings sich eventuell bei einer bestimmten Kombination häufen.

Alternativ kann man auch noch die Funktionen gg_miss_var() und gg_miss_fct() nutzen.

Mit der Funktion gg_miss_var() wird die Anzahl der missings dargestellt. Mit dem Argument facet kann man dies auch auf einzelne Ausprägungen runterbrechen. So kann man sehen, ob evtl. eine Gruppe deutlich mehr missings aufweist, als eine andere Gruppe.

gg_miss_var(
  pss,
  facet = district
)

Mit der Funktion gg_miss_fct() können missings visuell sehr schön aufbereitet werden.

gg_miss_fct(
  x = pss, 
  fct = district
)

Auch das kann man sich wieder nach Ausprägungen auf einer weiteren Variable ausgeben lassen, um zu sehen, ob es starke Gruppenunterschiede gibt:

gg_miss_fct(
  x = pss, 
  fct = district
) + 
  labs(title = "NA in PSS nach Distrikt")

Das war’s zu missing values!