R Spickzettel: Bivariate deskriptive Statistik

Bedingte Kennwerte

Ausgabe von Kennwerten für Subgruppen von Stichproben

library(dslabs)
library(ggplot2)
library(gmodels)
library(lm.beta)
library(psych)
library(tibble)
df <- heights
as_tibble(df)
# A tibble: 1,050 x 2
   sex    height
   <fct>   <dbl>
 1 Male       75
 2 Male       70
 3 Male       68
 4 Male       74
 5 Male       61
 6 Female     65
 7 Female     66
 8 Female     62
 9 Female     66
10 Male       67
# ... with 1,040 more rows
describeBy(df$height, df$sex)
> describeBy(df$height, df$sex)

 Descriptive statistics by group 
group: Female
   vars   n  mean   sd median trimmed  mad min max range skew kurtosis   se
X1    1 238 64.94 3.76  64.98   64.92 2.97  51  79    28 0.05     2.96 0.24
----------------------------------------------------------- 
group: Male
   vars   n  mean   sd median trimmed  mad min   max range  skew kurtosis   se
X1    1 812 69.31 3.61     69   69.39 2.97  50 82.68 32.68 -0.54     2.89 0.13
by(df$height, df$sex, mean, na.rm=TRUE)
> by(df$height, df$sex, mean, na.rm=TRUE)
df$sex: Female
[1] 64.93942
----------------------------------------- 
df$sex: Male
[1] 69.31475

Grafische Darstellung von Kennwerten für Subgruppen von Stichproben

Mittelwertdiagramm

library(ggplot2)
means_height <- ggplot(df, aes(x=sex, y=height)) 
means_height + stat_summary(fun.y=mean, geom="bar")
means_height <- ggplot(df, aes(x=sex, y=height)) + stat_summary(fun.y=mean, geom="bar")
means_height <- means_height + labs(x="Geschlecht", y="Mittelwert der Größe") 
means_height + scale_y_continuous(breaks=seq(0,70,10))
means_height <- ggplot(df, aes(x=sex, y=height)) + scale_y_continuous(breaks=seq(0,70,10)) 
means_height <- means_height + labs(x="Geschlecht", y="Mittelwert der Größe") 
means_height + stat_summary(fill="purple", fun.y=mean, geom="bar")

Gruppierte Boxplots

boxplot_height <- ggplot(df, aes(x=sex, y=height)) 
boxplot_height + geom_boxplot()
boxplot_height <- ggplot(df, aes(x=sex, y=height)) 
boxplot_height + stat_boxplot(geom="errorbar", width=.5) + geom_boxplot()
boxplot_height <- ggplot(df, aes(x=sex, y=height)) + stat_boxplot(geom="errorbar", width=.5) + geom_boxplot()
boxplot_height + labs(x="Geschlecht", y="Körpergröße") 

Zusammenhänge zwischen zwei intervallskalierten Variablen

Streudiagramme

library(yarrr)
as_tibble(pirates)
# A tibble: 1,000 x 17
      id sex     age height weight headband college tattoos tchests parrots favorite.pirate sword.type eyepatch
   <int> <chr> <dbl>  <dbl>  <dbl> <chr>    <chr>     <dbl>   <dbl>   <dbl> <chr>           <chr>         <dbl>
 1     1 male     28   173.   70.5 yes      JSSFP         9       0       0 Jack Sparrow    cutlass           1
 2     2 male     31   209.  106.  yes      JSSFP         9      11       0 Jack Sparrow    cutlass           0
 3     3 male     26   170.   77.1 yes      CCCC         10      10       1 Jack Sparrow    cutlass           1
 4     4 fema~    31   144.   58.5 no       JSSFP         2       0       2 Jack Sparrow    scimitar          1
 5     5 fema~    41   158.   58.4 yes      JSSFP         9       6       4 Hook            cutlass           1
 6     6 male     26   190.   85.4 yes      CCCC          7      19       0 Jack Sparrow    cutlass           1
 7     7 fema~    31   158.   59.6 yes      JSSFP         9       1       7 Blackbeard      cutlass           0
 8     8 fema~    31   173.   74.5 yes      JSSFP         5      13       7 Hook            cutlass           1
 9     9 fema~    28   165.   68.7 yes      JSSFP        12      37       2 Anicetus        cutlass           0
10    10 male     30   184.   84.7 yes      JSSFP        12      69       4 Jack Sparrow    cutlass           1
# ... with 990 more rows, and 4 more variables: sword.time <dbl>, beard.length <dbl>, fav.pixar <chr>,
#   grogg <dbl>
tattoos_parrots <- ggplot(pirates, aes(x=tattoos, y=parrots))
tattoos_parrots + geom_point()
tattoos_parrots + geom_point() + 
   labs(x="Anzahl der Tattoos", y="Anzahl der Papageien")
tattoos_parrots + geom_point(position="jitter") + 
   labs(x="Anzahl der Tattoos", y="Anzahl der Papageien")

Arten von Zusammenhängen

Die Produkt-Moment-Korrelation

cor(pirates$tattoos, pirates$parrots, use="pairwise.complete.obs")
[1] -0.04029009
cor(pirates[c("tattoos","parrots","tchests")], use="pairwise.complete.obs")
            tattoos     parrots    tchests
tattoos  1.00000000 -0.04029009 0.04021435
parrots -0.04029009  1.00000000 0.09077387
tchests  0.04021435  0.09077387 1.00000000
Argumente für Parameter useErläuterung
“everything”Für alle Variablenpaare die unvollständig sind, wird ein NA ausgegeben.
“all.obs”Es müssen alle Beobachtungen vollständig sein, andernfalls wird ein Fehler ausgegeben.
“complete.obs”Beobachtungen mit NAs werden komplett ausgeschlossen. Wenn keine einzige gültige Beobachtung dabei ist, wird ein Fehler ausgegeben.
“na.or.complete”Prüfung analog “complete.obs”, mit dem Unterschied das im Fehlerfall lediglich NAs ausgegeben werden.
“pairwise.complete.obs”Berechnung der Korrelation für alle Paare von Variablen in dem Datensatz. Beobachtungen mit Missings zu dem Paar werden ausgeschlossen. Existiert zu einem Paar keine einzige gültige Beobachtung, wird in der Tabelle ein NA ausgegeben.

Lineare Regression

Schätzung der Regressionsgeraden

Beziehung zwischen Korrelation und Regressionskoeffizient

Darstellung der Regressionsgeraden

lm(pirates$parrots ~ pirates$tattoos)
lm(parrots ~ tattoos, pirates)
Call:
lm(formula = pirates$parrots ~ pirates$tattoos)

Coefficients:
    (Intercept)  pirates$tattoos  
        3.18128         -0.03842  
library(lm.beta)
lm.beta(lm(pirates$parrots ~ pirates$tattoos))
Call:
lm(formula = pirates$parrots ~ pirates$tattoos)

Standardized Coefficients::
    (Intercept) pirates$tattoos 
     0.00000000     -0.04029009
tattoos_parrots <- ggplot(pirates, aes(x=tattoos, y=parrots)) +
  geom_point(position="jitter") + 
  labs(x="Anzahl der Tattoos", y="Anzahl der Papageien")
tattoos_parrots + geom_smooth(method="lm", se=FALSE)

Güte der Vorhersage

cor(pirates$tattoos, pirates$parrots, use="pairwise.complete.obs")^2
[1] 0.001623291

Ausreißerwerte bei Zusammenhängen zweier intervallskalierter Variablen

pirates2 <- pirates[pirates$sword.type=="banana" & pirates$sex=="female", ]
nrow(pirates2)
[1] 21
ggplot(pirates2, aes(x=age, y=tchests)) + geom_point()
summary(pirates2$tchests)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   1.00    5.00   14.00   30.38   37.00  139.00 
quantile(pirates2$tchests, c(.75, .80, .85, .90, .95, 1))
 75%  80%  85%  90%  95% 100% 
  37   54   68   74  101  139
pirates2b <- pirates2[pirates2$tchests < 74,]
nrow(pirates2b)
[1] 18
cor(pirates2$tchests, pirates2$age)
[1] -0.1865981
cor(pirates2b$tchests, pirates2b$age)
[1] 0.002343929
lm(pirates2$tchests ~ pirates2$age)
Call:
lm(formula = pirates2$tchests ~ pirates2$age)

Coefficients:
 (Intercept)  pirates2$age  
      72.475        -1.352 
lm(pirates2b$tchests ~ pirates2b$age)
Call:
lm(formula = pirates2b$tchests ~ pirates2b$age)

Coefficients:
  (Intercept)  pirates2b$age  
    17.721497       0.008779  

Zusammenhänge zwischen zwei dichotomen Merkmalen

Kreuztabellen / Kontingenztafeln

table(pirates$college, pirates$headband)
         no yes
  CCCC   70 588
  JSSFP  43 299
prop.table(table(pirates$college, pirates$headband))
           no   yes
  CCCC  0.070 0.588
  JSSFP 0.043 0.299
CrossTable(pirates$college, pirates$headband, prop.chisq=F)
   Cell Contents
|-------------------------|
|                       N |
|           N / Row Total |
|           N / Col Total |
|         N / Table Total |
|-------------------------|

 
Total Observations in Table:  1000 

 
                | pirates$headband 
pirates$college |        no |       yes | Row Total | 
----------------|-----------|-----------|-----------|
           CCCC |        70 |       588 |       658 | 
                |     0.106 |     0.894 |     0.658 | 
                |     0.619 |     0.663 |           | 
                |     0.070 |     0.588 |           | 
----------------|-----------|-----------|-----------|
          JSSFP |        43 |       299 |       342 | 
                |     0.126 |     0.874 |     0.342 | 
                |     0.381 |     0.337 |           | 
                |     0.043 |     0.299 |           | 
----------------|-----------|-----------|-----------|
   Column Total |       113 |       887 |      1000 | 
                |     0.113 |     0.887 |           | 
----------------|-----------|-----------|-----------|

Der Phi-Koeffizient

phi(table(pirates$college, pirates$headband))
[1] -0.03
phi(c(70,588,43,299))
[1] -0.03

Zusammenhänge zwischen ordinalskalierten Variablen

Kendalls Tau

as_tibble(examscores)
# A tibble: 100 x 4
       a     b     c     d
   <dbl> <dbl> <dbl> <dbl>
 1    43    31    68    34
 2    61    27    56    39
 3    37    41    74    46
 4    54    36    62    41
 5    56    34    82    40
 6    73    29    79    35
 7    62    30    69    43
 8    48    19    73    34
 9    68    28    72    45
10    46    38    68    38
# ... with 90 more rows
cor(examscores$a, examscores$b, method="kendall", use="pairwise.complete.obs")
[1] 0.03475601

Spearmans Rho

cor(examscores$a, examscores$b, method="spearman", use="pairwise.complete.obs")
[1] 0.04480055

Verwendete Pakete und Funktionen

base

FunktionBeschreibung
by(
Variable,
Gruppierungsvariable,
Funktion,
na.rm=T)
Einen bestimmten Kennwert für Subgruppen abfragen.
nrow(Datensatz)Anzahl Zeilen abfragen.
summary(Numerische Variable)Quartile und ggf. Anzahl Missings ausgeben.
summary(Character Variable)Länge, Klasse und Modus ausgeben.
table(Variable1, Variable2)Absolute Häufigkeiten bestimmen.
prop.table(table(Variable1, Variable2))Relative Häufigkeiten bestimmen.

ggplot2

FunktionBeschreibung
ggplot(
Datensatz,
aes(x=Gruppierungsvariable, y=Variable))
+ stat_summary(
fun.y=mean,
geom=”bar”,
fill=”Farbe”)
+ labs(x=”Text”, y=”Text”)
+ scale_y_continuous(
breaks=seq(von,bis,um))
Mittelwertdiagramm erstellen.
– Auf der y-Achse wird der Mittelwert abgetragen.
– Säulenfarbe ändern.
– Achsen beschriften.
– Achsenmarkierungen für y-Achse anpassen.
ggplot(
Datensatz,
aes(x=Gruppierungsvariable, y=Variable))
+ stat_boxplot(
geom=”errorbar”,
width=Zahl)
+ geom_boxplot()
+ labs(x=”Text”, y=”Text”)
Gruppierte Boxplots erstellen:
– Whiskers hinzufügen.
– Achsen beschriften.
ggplot(
Datensatz,
aes(x=Variable1, y=Variable2))
+ geom_point(position=”jitter”)
+ labs(x=”Text”, y=”Text”)
+ geom_smooth(method=”lm”, se=FALSE)
Streudiagramm erstellen:
– Punktewolke verwackeln.
– Achsen beschriften.
– Regressionsgerade hinzufügen; Konfidenzintervall unterdrücken.

gmodels

FunktionBeschreibung
CrossTable(
Variable1,
Variable2,
prop.chisq=F)
Erweiterte Kreuztabelle ausgeben.

lm.beta

FunktionBeschreibung
lm.beta(lm(Kriterium ~ Prädiktor))Standardisierten Koeffizient für einfache lineare Regression ermitteln.

psych

FunktionBeschreibung
describeBy(
Variable,
Gruppierungsvariable)
Übersicht deskriptiver Kennwerte für Subgruppen erstellen.
phi(table(Variable1, Variable2))Phi-Koeffizient berechnen.
phi(c(Absolute Häufigkeiten))Alternativ können auch direkt die Häufigkeiten übergeben werden.

stats

FunktionBeschreibung
cor(
Variable1,
Variable2,
method=”pearson”,
use=”pairwise.complete.obs”)
Produkt-Moment-Korrelationskoeffizient ermitteln.
– Auf paarweise gültige Fälle anwenden.
– 👉 Die Methode “pearson” ist bereits die Voreinstellung und damit optional.
cor(
Datensatz[c(“Var1″,”Var2″,”Var3”)],
use=”pairwise.complete.obs”)
Mehrere Korrelationen gleichzeitig berechnen.
cor(…)^2Determinationskoeffizeint R² bestimmen.
cor(
Variable1,
Variable2,
method=”kendall”, use=”pairwise.complete.obs”)
Kenndalls Tau bestimmen.
cor(
Variable1,
Variable2,
method=”spearman”, use=”pairwise.complete.obs”)
Spearmans Rho berechnen.
lm(Datensatz$Kriterium ~ Datensatz$Prädiktor)Einfache lineare Regression durchführen.
lm(Kriterium ~ Prädiktor, Datensatz)Alternative Schreibweise für die Regression.
quantile(Variable, Quantil(e))Quantile ausgeben.

tibble

FunktionBeschreibung
as_tibble()Eine Datensatz, wie bspw. einen Data Frame, eine List oder Matrix in ein sogenanntes Tibble umwandeln. Ein Tibble ist ein Data Frame der Klasse tbl_df.

Schreibe einen Kommentar