Kapitel 7 Zusammenfassen von ordinal- und intervallskalierten Daten in R

Das wichtigste beim Rechnen mit R sind zwei Bildschirme. Und viel Kaffee (um wach zu bleiben) und Kamillentee (zum Beruhigen).

7.1 Mittelwert in R berechnen

In R können wir den Mittelwert einer Zahlenreihe (in R Vektor genannt) oder einer Variable (in R Objekt genannt) berechnen. Eine Zahlenreihe wird in R mit einem c (c für concatenate, verketten) zusammengefügt. Wir können die Verteilung dieser Zahlenreihe auch anschauen, zum Beispiel mit einem Histogramm. Schauen wir uns das einmal im Code an.

# Mittelwert einer Zahlenreihe (d.h. eines Vektors)
hist(c(3,4,5,2,3,4,5,6,5,10,2,3,4,33,21,34,53,23,31,55,33,43,53), cex.main=0.8) # cex.main = 0.8 ist nur um den Text im Titel kleiner zu schreiben

mean(c(3,4,5,2,3,4,5,6,5,10,2,3,4,33,21,34,53,23,31,55,33,43,53))
## [1] 18.91304

Damit wir die Zahlenreihe nicht immer wiederholen müssen, können wir sie in eine Variable (Objekt) speichern. In R benutzen wir ein <- anstatt eines =.

variable_A<-(c(3,4,5,2,3,4,5,6,5,10,2,3,4,33,21,34,53,23,31,55,33,43,53))
hist(variable_A)

mean(variable_A)
## [1] 18.91304

Falls wir fehlende Werte haben (in R NA), so wird R den Mittelwert nicht berechnen. Wir müssen R sagen, dass es die NA, d.h. die fehlenden Werte, nicht mitberücksichtigt. Dies tun wir mit der Option na.rm=TRUE

variable_B<-(c(3,4,5,2,3,4,5,6,5,10,2,3,4,33,21,34,53,23,31,55,33,43,53, NA)) # Hier haben wir einen fehlenden Wert mit NA eingefügt. 
hist(variable_B)

mean(variable_B)
## [1] NA
# nun korrekt: 
mean(variable_B, na.rm=TRUE)
## [1] 18.91304

7.2 Die glorreichen Sieben: Die Kennzahlen Minimum, 25.Perzentile, Median, Mean, 75. Perzentile und Maximum und Standardabweichung

  • Bei mindestens intervallskalierten Daten, die einigermassen “normalverteilt” sind, geben wir meistens folgende Statistiken an: Mittelwert(Mean), Standardabweichung (SD), kleinster und grösster Wert (Min / Max)
  • Bei ordinalskalierten Daten oder intervallskalierten Daten, die nicht annähernd normalverteilt sind, geben wir folgendes an: Median Interquartilbereich (d.h. 25. Perzentile und 75. Perzentile), Min, Max. Wir können auch den summary Befehl benutzen, um einen Überblick über die beschreibenden Statistiken zu erhalten. Die Standardabweichung wird damit jedoch nicht ausgegeben.
summary(variable_B)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
##    2.00    4.00    6.00   18.91   33.00   55.00       1

Meistens haben wir einen Datensatz, in R ein Data Frame genannt. Wir erstellen hier einen Datensatz mit den Variablen ID (für jede Person eine Nummer), Alter (Alter in Jahren), Körpergewicht (in Kg). Wir erstellen dies indem wir als Beipsiel für das Alter mit dem Befehl rnorm (r für random, norm für Normalverteilung) 100 zufällige Zahlen aus einer Grundgesamtheit (Population) mit einem Mittelwert von 55 und einer Standardabweichung von 7 ziehen. Da dieses “sampling” (Stichprobenziehen) zufällig ist, wird der Mittelwert der Strichprobe nicht genau dem Mittelwert der Population entsprechen.

id = 1:100
alter = rnorm(100, 55, 7)
kg=rnorm(100, 60, 10)
geschlecht=sample(c("Mann", "Frau"), replace=TRUE, size=200)

Jetzt fügen wir die drei Variablen in einen Datensatz zusammen

data<-data.frame(id, alter, kg, geschlecht)

Nun können wir den Mittelwert auch so berechnen:

mean(data$alter)
## [1] 54.01065

Oder wir können auch wieder den summary Befehl anwenden, entweder für das gesamte Data Frame oder für einzelne Variablen. Beim ersten Beispiel, wo wir summary über den ganzen Datensatz anwenden, wird R auch den Mittelwert für die Variable ID ausrechnen, obschon dies natürlich keinen Sinn. macht. Die id Variable ist eine nominale Variable, wir sollten nicht mit ihr rechnen. Aber R tut halt was wir ihm sagen.

summary(data)
##        id             alter             kg         geschlecht       
##  Min.   :  1.00   Min.   :39.98   Min.   :34.11   Length:200        
##  1st Qu.: 25.75   1st Qu.:49.95   1st Qu.:52.72   Class :character  
##  Median : 50.50   Median :53.73   Median :61.95   Mode  :character  
##  Mean   : 50.50   Mean   :54.01   Mean   :60.36                     
##  3rd Qu.: 75.25   3rd Qu.:58.82   3rd Qu.:67.60                     
##  Max.   :100.00   Max.   :71.37   Max.   :83.02
summary(data$alter)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   39.98   49.95   53.73   54.01   58.82   71.37

Der summary Befehl hat uns jetzt auch den kleinsten Wert (Min), das 1. Quartil (25. Perzentile), den Median, den Mittelwert (Mean), das 3. Quartil (75. Perzentile) und den grössten Wert (Max) berechnent. Möchten wir die Standardabweichung separat berechnen, können wir dies mit dem Befehl sd tun.

sd(variable_B) # das wird nicht funktionieren, da wir einen fehlenden Wert (NA haben)
## [1] NA
sd(variable_B, na.rm=TRUE)
## [1] 18.85811
sd(data$alter)
## [1] 6.2103

Es gibt weitere Funktionen in R, die selbsterklärend sind:

min(data$alter)
## [1] 39.97621
max(data$alter)
## [1] 71.36981
var(data$alter)
## [1] 38.56783
length(data$alter)
## [1] 200
median(data$alter)
## [1] 53.72839
quantile(data$alter, 0.5)
##      50% 
## 53.72839
quantile(data$alter, 0.25)
##      25% 
## 49.95212
quantile(data$alter, 0.75)
##      75% 
## 58.81676
summary(data$alter) # nur zum Vergleich der 25% Quantile etc. 
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   39.98   49.95   53.73   54.01   58.82   71.37

Wir können in R auch runden.

round(mean(data$alter), 3)
## [1] 54.011
round(mean(data$alter), 0)
## [1] 54
round(mean(data$alter), 1)
## [1] 54

Wir haben zuvor den summary Befehl benutzt, um schnell einen Überblick über wichtige beschreibende Statistiken zu erhalten. summary ist ein sogenannter base R Befehl, das heisst, Sie müssen keine Pakete installieren, um ihn zu nutzen. Es gibt jedoch alternative Befehle in Paketen. Wir schauen uns hier drei Beispiele an:

  • describe aus dem psych Packet
  • describe aus dem Hmisc Packet
  • skim aus dem skimr Packet

Fall Sie diese Pakete noch nicht installiert haben, müssen Sie dies mit den Befehlen:

  • install.packages(“psych”)
  • install.packages(“Hmisc)
  • install.packages(“skimr”)

Wenn Sie R starten, müssen sie diese Pakete noch aus dem Schrank holen: library(psych), library(Hmisc), library(skimr).

Da der Befehl describe in zwei Paketen vorkommt, stellen wir am Besten den Paketenamen vor den Befehl, damit R unmissverstaändlich weiss, welchen er nehmen muss (sonst nimmt der den Befehl des Paketes, dass zuletzt mit library() geladen wurde). Beispiel: psych::describe

# install.packages("psych")
# install.packages("Hmisc")
# install.packages("skimr")

library(psych)
library(Hmisc)
## Loading required package: lattice
## 
## Attaching package: 'lattice'
## The following object is masked from 'package:epiDisplay':
## 
##     dotplot
## Loading required package: Formula
## 
## Attaching package: 'Hmisc'
## The following object is masked from 'package:psych':
## 
##     describe
## The following objects are masked from 'package:dplyr':
## 
##     src, summarize
## The following objects are masked from 'package:xtable':
## 
##     label, label<-
## The following objects are masked from 'package:base':
## 
##     format.pval, units
library(skimr)

describe aus dem psych Packet:

psych::describe(data)
##             vars   n  mean    sd median trimmed   mad   min    max range  skew
## id             1 200 50.50 28.94  50.50   50.50 37.06  1.00 100.00 99.00  0.00
## alter          2 200 54.01  6.21  53.73   54.10  7.11 39.98  71.37 31.39  0.02
## kg             3 200 60.36 11.20  61.95   60.86  9.88 34.11  83.02 48.91 -0.40
## geschlecht*    4 200  1.53  0.50   2.00    1.54  0.00  1.00   2.00  1.00 -0.14
##             kurtosis   se
## id             -1.22 2.05
## alter          -0.05 0.44
## kg             -0.32 0.79
## geschlecht*    -1.99 0.04

describe aus dem Hmisc Packet:

Hmisc::describe(data)
## data 
## 
##  4  Variables      200  Observations
## --------------------------------------------------------------------------------
## id 
##        n  missing distinct     Info     Mean      Gmd      .05      .10 
##      200        0      100        1     50.5     33.5     5.95    10.90 
##      .25      .50      .75      .90      .95 
##    25.75    50.50    75.25    90.10    95.05 
## 
## lowest :   1   2   3   4   5, highest:  96  97  98  99 100
## --------------------------------------------------------------------------------
## alter 
##        n  missing distinct     Info     Mean      Gmd      .05      .10 
##      200        0      100        1    54.01    7.006    43.90    46.53 
##      .25      .50      .75      .90      .95 
##    49.95    53.73    58.82    61.00    62.25 
## 
## lowest : 39.97621 39.99841 40.09868 42.44892 42.94933
## highest: 62.70637 63.88604 67.19156 69.68128 71.36981
## --------------------------------------------------------------------------------
## kg 
##        n  missing distinct     Info     Mean      Gmd      .05      .10 
##      200        0      100        1    60.36     12.6    38.82    45.01 
##      .25      .50      .75      .90      .95 
##    52.72    61.95    67.60    72.79    76.15 
## 
## lowest : 34.11375 35.13612 35.32897 37.51307 38.80486
## highest: 79.04941 79.56956 81.80574 82.20800 83.02218
## --------------------------------------------------------------------------------
## geschlecht 
##        n  missing distinct 
##      200        0        2 
##                       
## Value       Frau  Mann
## Frequency     93   107
## Proportion 0.465 0.535
## --------------------------------------------------------------------------------

skim aus dem skimr Packet:

skimr::skim(data)
Table 7.1: Data summary
Name data
Number of rows 200
Number of columns 4
_______________________
Column type frequency:
character 1
numeric 3
________________________
Group variables None

Variable type: character

skim_variable n_missing complete_rate min max empty n_unique whitespace
geschlecht 0 1 4 4 0 2 0

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
id 0 1 50.50 28.94 1.00 25.75 50.50 75.25 100.00 ▇▇▇▇▇
alter 0 1 54.01 6.21 39.98 49.95 53.73 58.82 71.37 ▂▇▇▅▁
kg 0 1 60.36 11.20 34.11 52.72 61.95 67.60 83.02 ▂▃▇▇▂

In R gibt es auch verschiedene Pakete, die einem helfen, schnell und relativ unkompliziert Tabellen zu erstellen. Wir schauen uns drei Pakete an:

Wer mehr Varianten anschauen möchte, findet hier weitere Alternativen

Falls Sie diese Pakete noch nicht installiert haben, können Sie den untenstehenden Code kopieren und einfach die # löschen und ihn ausführen (CTRL-Enter)

# intsall.packages("gtsummary)
# install.packages("arsenal")
# install.packages("qwraps2")

7.2.1 tbl_summary Befehl aus dem gtsummary Packet

gtsummary::tbl_summary(data)
Characteristic N = 2001
id 50 (26, 75)
alter 53.7 (50.0, 58.8)
kg 62 (53, 68)
geschlecht
    Frau 93 (46%)
    Mann 107 (54%)
1 Median (IQR); n (%)

7.2.2 tableby, arsenal Packet

Hier ein ganz einfaches Beispiel mit dem Befehl tableby aus dem arsenal Packet. Dieses Packet bietet viele Möglichkeiten, wie man die Tabelle schöner machen kann, und man kann die Tabelle auch in Word oder Excel exportieren. Doch die Details schauen wir uns in einem späteren Kapitel an.

library(arsenal)
## 
## Attaching package: 'arsenal'
## The following object is masked from 'package:Hmisc':
## 
##     %nin%
summary(tableby(geschlecht ~ alter+kg, data = data), test=FALSE)
Frau (N=93) Mann (N=107) Total (N=200)
alter
   Mean (SD) 54.311 (5.987) 53.749 (6.415) 54.011 (6.210)
   Range 40.099 - 71.370 39.976 - 69.681 39.976 - 71.370
kg
   Mean (SD) 61.005 (11.194) 59.805 (11.229) 60.363 (11.200)
   Range 35.136 - 82.208 34.114 - 83.022 34.114 - 83.022

7.2.3 qwraps2 Packet

library(qwraps2)
## 
## Attaching package: 'qwraps2'
## The following objects are masked from 'package:arsenal':
## 
##     gmean, gsd
## The following object is masked from 'package:psych':
## 
##     logit
options(qwraps2_markup = "markdown")

our_summary1 <-
  list("Alter in Jahren" =
       list("min"       = ~ round(min(alter),1),
            "max"       = ~ round(max(alter),1),
            "mean (sd)" = ~ qwraps2::mean_sd(alter)),
       "Körpergröse in cm" =
       list("min"       = ~ round(min(kg),1),
            "median"    = ~ round(median(kg),1),
            "max"       = ~ round(max(kg),1),
            "mean (sd)" = ~ qwraps2::mean_sd(kg)),
        "Geschlecht" =
       list("Frauen" = ~ qwraps2::n_perc(geschlecht == "Frau"),
            "Männer"  = ~ qwraps2::n_perc(geschlecht == "Mann"))
       )
Tabelle_1 <- summary_table(data, our_summary1)
Tabelle_1
data (N = 200)
Alter in Jahren   
   min 40
   max 71.4
   mean (sd) 54.01 ± 6.21
Körpergröse in cm   
   min 34.1
   median 62
   max 83
   mean (sd) 60.36 ± 11.20
Geschlecht   
   Frauen 93 (46.50%)
   Männer 107 (53.50%)

Ende des Kapitels