Kapitel 7 Zusammenfassen von ordinal- und intervallskalierten Daten in R
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 =.
<-(c(3,4,5,2,3,4,5,6,5,10,2,3,4,33,21,34,53,23,31,55,33,43,53))
variable_Ahist(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
<-(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.
variable_Bhist(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.
= 1:100
id = rnorm(100, 55, 7)
alter =rnorm(100, 60, 10)
kg=sample(c("Mann", "Frau"), replace=TRUE, size=200) geschlecht
Jetzt fügen wir die drei Variablen in einen Datensatz zusammen
<-data.frame(id, alter, kg, geschlecht) data
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:
::describe(data) psych
## 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:
::describe(data) Hmisc
## 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:
::skim(data) skimr
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:
- gtsummary: Für einfache Tabellen Link zu Beispielen
- table_by (arsenal package): Falls wir Daten separat nach einer dritten Variable auflisten möchten Link zu Beispielen
- qwraps2: Falls wir etwas mehr Flexibilität möchten. Link zu Beispielen
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
::tbl_summary(data) gtsummary
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"))
)
<- summary_table(data, our_summary1)
Tabelle_1 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%) |