Dichtekurven und Normalverteilung

Übersicht Dataframes für diese Folien



Name Inhalt
d_ns_m Monatswerte für Niederschläge in Bochum



Quellen: https://www.dwd.de

Normalverteilung

Exkurs: Funktionen erzeugen

Eigene Funktionen

f1 <- function(x) x^2
f1(2)
[1] 4
  • Funktion f1 berechnet x^2
  • Dabei ist function(x) x^2 die Funktion mit dem Namen f1

Normalverteilung mit \(\mu = 1\) und \(\sigma = 2\)

f2 <- function(x) dnorm(x, mean = 1, sd = 2)
f2(0)
[1] 0.1760327
  • Funktion f2 berechnet mit dnorm(x, mean = mu, sd = sigma) Normalverteilung
  • an der Stelle x
  • mit Mittelwert mu und Standardabweichung sigma

Funktion plotten mit geom_function()

Beispiel 1

f1 <- function(x) x^2
ggplot() +
  geom_function(fun = f1)

  • geom_function() plottet Kurve ohne Mapping

Beispiel 2

f2 <- function(x) dnorm(x, mean = 1, sd = 2)
ggplot() +
  geom_function(fun = f2)

  • Funktion angeben mit fun = <Funktion>

Plotbereich festlegen

Die beiden Beispielfunktionen sehen nicht so charakteristisch aus wie wir es gewohnt sind. Dafür müssen wir den Bereich festlegen, der uns angezeigt wird.

Erste Möglichkeit

ggplot(data = tibble(A = c(-1, 1), B = c(1, 1))) +
  geom_function(fun = f1) + geom_point(mapping = aes(x = A, y = B))

  • Plotbereich aus zweitem Geom (zum Beispiel Punkte)

Zweite Möglichkeit

ggplot() +
  geom_function(fun = f2, xlim = c(-8, 10))

  • Mit xlim explizit angeben
  • xlim wie limits = Grenzen für die x-Werte

Funktion plotten mit geom_ribbon()

ggplot() +
  geom_ribbon(
    mapping = aes(x = after_stat(x), ymin = 0, ymax = after_stat(y)),
    stat='function', fun=f2, xlim = c(-8, 10), color='black', fill='linen', alpha=0.8
  )

  • Mapping mit x und y aus stat = 'function' mit after_stat(x) und after_stat(y)

Histogramm mit Normalverteilung Niederschläge

Mittelwert und Standardabweichung der Stichprobe berechnen

mu <- mean(d_ns_m$Niederschlag)
sigma <- sd(d_ns_m$Niederschlag)

Funktion f für Normalverteilung x mit mu und sigma

f <- function(x) dnorm(x, mean=mu, sd=sigma)

Plot in Variable p speichern (für nächste Folie)

p <- ggplot(data = d_ns_m) +
  geom_histogram(mapping = aes(x = Niederschlag, y = stat(density)), binwidth = 5, boundary = 0) +
  geom_line(stat = 'function', fun = f, color = 'red', linewidth = 1)

Histogramm mit Normalverteilung

p
Warning: `stat(density)` was deprecated in ggplot2 3.4.0.
ℹ Please use `after_stat(density)` instead.

Kontrolle: Normal-Quantil-Plot

ggplot(data = d_ns_m) +
  geom_qq(mapping = aes(sample = Niederschlag)) + 
  geom_qq_line(mapping = aes(sample = Niederschlag))

  • Normal-Quantil-Plot mit geom_qq() sowie geom_qq_line()
  • geom_qq_line ist die Linie, geom_qq sind die Punkte
  • Ergebnis: Normalverteilung nicht gut geeignet, Verteilung der Daten ist rechtsschief

Kontrolle: Normal-Quantil-Plot

ggplot(data = d_ns_m, mapping = aes(sample = Niederschlag)) +
  geom_qq() + 
  geom_qq_line()

  • Mapping für alle Geoms gleich?
  • Dann als Argument in ggplot()

2. Approximierte Dichtefunktionen

Dichtefunktion Niederschläge

ggplot(data = d_ns_m) +
  geom_histogram(mapping = aes(x = Niederschlag, y = stat(density)), binwidth = 10, boundary = 0) +
  geom_density(mapping = aes(x = Niederschlag), color = 'red', linewidth = 1) +
  lims(x = c(-50, 250))

  • geom_density() erzeugt approximierte Dichtefunktion
  • Größerer Plotbereich mit lims(x = c(xmin, xmax)) (Details später)

Dichtefunktion Niederschläge

ggplot(data = d_ns_m) +
  geom_histogram(mapping = aes(x = Niederschlag, y = stat(density)), binwidth = 10, boundary = 0) +
  geom_density(mapping = aes(x = Niederschlag), color = 'red', linewidth = 1, fill = 'linen', alpha = 0.8) +
  lims(x = c(-50, 250))

  • Fläche füllen mit fill = <Farbe>
  • Transparenz mit alpha = <Wert>

Dichtefunktion Niederschläge

ggplot(data = d_ns_m) +
  geom_histogram(mapping = aes(x = Niederschlag, y = stat(density)), binwidth = 10, boundary = 0) +
  geom_density(mapping = aes(x = Niederschlag), bw = 2, linewidth = 1, color = 'orange') +
  geom_density(mapping = aes(x = Niederschlag), bw = 4, linewidth = 1, color = 'blue') +
  geom_density(mapping = aes(x = Niederschlag), bw = 8, linewidth = 1, color = 'red') + 
  lims(x = c(-50,250))

  • Argument bw = <Wert> legt die Breite des Kerns fest (bw = bandwidth)
  • Je größer bw umso glatter die Kurve

Dichtefunktion in Monaten

ggplot(data = d_ns_m) +
  geom_density(mapping = aes(x = Niederschlag, fill = Monat), alpha = 1/4)

  • Füllfarbe nach Monat
  • Transparenz mit alpha = <Wert>

Dichtefunktionen untereinander

ggplot(data = d_ns_m) +
  geom_density_ridges(mapping = aes(x = Niederschlag, y = Monat), bandwidth = 10)

  • Geom geom_density_ridges() wie geom_density() aber untereinander
  • Kernbreite mit bandwidth = <Wert> angeben
  • Paket ggridges installieren

Violinenplot

ggplot(data = d_ns_m) +
  geom_violin(mapping = aes(x = 0, y = Niederschlag))

  • Ähnlich Boxplot, aber mit Kurven

Violinenplot

ggplot(data = d_ns_m) +
  geom_violin(mapping = aes(x = Monat, y = Niederschlag))

  • Monate besitzen unterschiedliche Charakteristiken

Zusammenfassung

Funktionen definieren

Normale Funktion

f <- function(x) sin(x^2)

Normalverteilung

mu <- mean(<Vektor>)
sigma <- sd(<Vektor>)
f <- function(x) dnorm(x, mu, sigma)

Funktionen plotten

Mit geom_function()

ggplot() +
  geom_function(stat = 'function', fun = <Funktion>, xlim = c(<from>, <to>), Argumente)
  • Funktion vorab definieren
  • Plotbereich mit xlim festlegen
  • Argumente für geom_line(Verweis zu Basics, “Was sind Argumente?”)

Mit geom_ribbon()

ggplot() +
  geom_ribbon(
    mapping = aes(x = after_stat(x), ymin = 0, ymax = after_stat(y)),
    stat = 'function', fun = <Funktion>, xlim = c(<from>, <to>), Argumente
  )
  • Mapping mit Werten, die das Stat berechnet (hier: x und y)
  • Sonst wie geom_function()

Dichtefunktion mit geom_density()

ggplot(data = <DATAFRAME>) +
  geom_density(mapping = aes(x = <M>, ...), Argumente)
AES Beschreibung Optional
x Merkmal für Dichte Nein

AES/Argumente Beschreibung Optional
color Farbe der Linie Ja
fill Füllfarbe Ja
alpha Transparenz der Füllfarbe Ja

Aesthetics und Argumente synonym verwendet, sinnvoll?

Argumente Beschreibung Optional
kernel Art des Kerns (‘gaussian’, ‘epanechnikov’, ‘cosine’, …) Ja
bw Glättungsbreite h Ja

→ Nicht genau dieselben Kerne, wie in der Vorlesung

Normal-Quantil-Plot

ggplot(data = <Dataframe>) +
  geom_qq(mapping = aes(sample = <M>), Argumente) + 
  geom_qq_line(mapping = aes(sample = <M>), Argumente)

AES Beschreibung Optional
sample Merkmal mit Daten Nein

Argumente Beschreibung Optional
color Farbe Ja

Dichtefunktionen untereinander

ggplot(data = <Dataframe>) +
  geom_density_ridges(mapping = aes(x = <M>, y = <M>, ...), bandwidth = bw)
AES Beschreibung Optional
x Merkmal für Dichte Nein
y Merkmal einzelne Plots Nein

AES/Argumente Beschreibung Optional
color Farbe der Linie Ja
fill Füllfarbe Ja
alpha Transparenz der Füllfarbe Ja

Argumente Beschreibung Optional
bandwidth Glättungsbreite h Ja

Violinenplot

→ Wie Boxplot