Hinweise zur Bearbeitung:

  1. Passen Sie die Angaben zu author an.
  2. Lösen Sie die Aufgaben. R Code wird in den farbig hinterlegten Zeilen geschrieben. Antworten und Anmerkungen können außerhalb der farbigen Zeilen geschrieben werden.
  3. Erstellen Sie ein HTML-Dokument in R Studio. Klicken Sie dazu auf: Menu | File | Knit Document. Achtung: das HTML-Dokument wird nur erstellt, wenn der R Code fehlerfrei ist. Überprüfen Sie mögliche Fehlerquellen, z.B. Syntax, Variablenbenennung, …
  4. Laden Sie die HTML-Datei auf Moodle hoch. Rmd-Dokumente werden bei der Hausaufgabenbewertung nicht berücksichtigt.
  5. Bei Fragen und Problemen nutzen Sie bitte das Moodle-Forum.

Beschreibung der Aufgabe:

Themenblock: Schätzen von Verteilungsparametern I

Datensatz: Lufttemperaturen

Problemstellung: Durch welchen Mittelwert und welche Standardabweichung werden die bodennahen Lufttemperaturen von Berliner Messstationen mittels einer Normalverteilung annäherungsweise beschrieben? Wie unterscheiden sich diese Parameter zwischen den Messstandorten?

Übungsziel: Berechnung der Schätzer von Mittelwert und Standardabweichung ‘per Hand’, d.h. durch Programmierung in R. Einführung in die R-Programmierung.

Aufgabenbeantwortung:

1. Laden Sie die Temperaturdaten der Station Schönefeld, Berlin-Dahlem und Berlin-Alexanderplatz für die Sommermonate (d.h. JJA) ein. Speichern Sie dabei jeden Datensatz auf einer eigenen Variable. (1P)

#setwd("/Users/julianmarschner/Downloads/Uni /Statistik/Session05_Datensaetze")
schoenefeld_data <- read.csv("/Users/julianmarschner/Downloads/Uni /Statistik/Session05_Datensaetze/t2m_Berlin-Schoenefeld_JJA.csv")
berlin_dahlem_data <- read.csv("/Users/julianmarschner/Downloads/Uni /Statistik/Session05_Datensaetze/t2m_Berlin-Dahlem(FU)_JJA.csv")
berlin_alexanderplatz_data <- read.csv("/Users/julianmarschner/Downloads/Uni /Statistik/Session05_Datensaetze/t2m_Berlin-Alexanderplatz_JJA.csv")
head(schoenefeld_data)
##         date mean  max  min           station season
## 1 1981-06-01 22.5 29.5 13.7 Berlin-Schönefeld    JJA
## 2 1981-06-02 23.9 30.6 16.3 Berlin-Schönefeld    JJA
## 3 1981-06-03 21.9 28.0 18.5 Berlin-Schönefeld    JJA
## 4 1981-06-04 17.5 23.9 16.4 Berlin-Schönefeld    JJA
## 5 1981-06-05 17.5 22.9 11.6 Berlin-Schönefeld    JJA
## 6 1981-06-06 18.8 24.6 12.1 Berlin-Schönefeld    JJA
head(berlin_dahlem_data)
##         date mean  max  min            station season
## 1 1981-06-01 22.6 28.9 14.8 Berlin-Dahlem (FU)    JJA
## 2 1981-06-02 24.0 30.1 17.9 Berlin-Dahlem (FU)    JJA
## 3 1981-06-03 21.1 25.5 18.8 Berlin-Dahlem (FU)    JJA
## 4 1981-06-04 16.5 20.8 15.4 Berlin-Dahlem (FU)    JJA
## 5 1981-06-05 17.9 22.5 12.9 Berlin-Dahlem (FU)    JJA
## 6 1981-06-06 19.0 23.6 11.8 Berlin-Dahlem (FU)    JJA
head(berlin_alexanderplatz_data)
##         date mean  max  min               station season
## 1 1981-06-01 23.6 29.3 17.1 Berlin-Alexanderplatz    JJA
## 2 1981-06-02 24.6 31.8 17.2 Berlin-Alexanderplatz    JJA
## 3 1981-06-03 22.4 28.8 20.4 Berlin-Alexanderplatz    JJA
## 4 1981-06-04 16.9 24.2 16.2 Berlin-Alexanderplatz    JJA
## 5 1981-06-05 18.2 22.4 14.3 Berlin-Alexanderplatz    JJA
## 6 1981-06-06 18.9 22.7 15.5 Berlin-Alexanderplatz    JJA
#### 2. Stellen Sie die `Minimumtemperatur` aller drei Stationen in jeweils einem Histogramm graphisch dar, und nutzen Sie dabei eine geeignete Bin-Zahl. Nutzen Sie dazu das Paket *ggplot* und plotten Sie alle drei Abbildungen nebeneinander. (2P)
library(ggplot2)
hist_schoenefeld <- ggplot(schoenefeld_data, aes(x = Minimumtemperatur)) +
  geom_histogram(bins = 30, fill = "lightblue", color = "black") +
  ggtitle("Histogramm Schönefeld") +
  theme_minimal()
hist_berlin_dahlem <- ggplot(berlin_dahlem_data, aes(x = Minimumtemperatur)) +
  geom_histogram(bins = 30, fill = "lightgreen", color = "black") +
  ggtitle("Histogramm Berlin-Dahlem") +
  theme_minimal()
hist_berlin_alexanderplatz <- ggplot(berlin_alexanderplatz_data, aes(x = Minimumtemperatur)) +
  geom_histogram(bins = 30, fill = "lightcoral", color = "black") +
  ggtitle("Histogramm Berlin-Alexanderplatz") +
  theme_minimal()

3. Berechnen Sie die Schätzer von Mittelwert und Standardabweichung der Normalverteilung für die Minimumtemperatur der drei Stationen. Erstellen Sie zunächst einen neuen data.frame, in dem die drei einzelnen Datensätze untereinander zusammengeführt werden - recherchieren Sie dazu, wie Sie die Funktion rbind() nutzen können. Benutzen Sie anschließend die Ihnen bereits bekannten Funktionen aus dem Paket tidyverse um die beiden Schätzer für jede Station zu berechnen (Tipp: eine der Stationen enthält NA-Werte - was müssen Sie hierzu bei der Berechnung in R beachten?). (2P)

schoenefeld_data$Station <- "Schoenefeld"
berlin_dahlem_data$Station <- "Berlin-Dahlem"
berlin_alexanderplatz_data$Station <- "Berlin-Alexanderplatz"
alle_stationen <- rbind(schoenefeld_data, berlin_dahlem_data, berlin_alexanderplatz_data)
head(alle_stationen)
##         date mean  max  min           station season     Station
## 1 1981-06-01 22.5 29.5 13.7 Berlin-Schönefeld    JJA Schoenefeld
## 2 1981-06-02 23.9 30.6 16.3 Berlin-Schönefeld    JJA Schoenefeld
## 3 1981-06-03 21.9 28.0 18.5 Berlin-Schönefeld    JJA Schoenefeld
## 4 1981-06-04 17.5 23.9 16.4 Berlin-Schönefeld    JJA Schoenefeld
## 5 1981-06-05 17.5 22.9 11.6 Berlin-Schönefeld    JJA Schoenefeld
## 6 1981-06-06 18.8 24.6 12.1 Berlin-Schönefeld    JJA Schoenefeld
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.5
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ lubridate 1.9.3     ✔ tibble    3.2.1
## ✔ purrr     1.0.2     ✔ tidyr     1.3.1
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
schätzer <- alle_stationen %>%
  group_by(Station) %>%
  summarise(
    Mittelwert = mean("Temperature", na.rm = TRUE),  
    Stdabweichung = sd("Temperature", na.rm = TRUE))
## Warning: There were 6 warnings in `summarise()`.
## The first warning was:
## ℹ In argument: `Mittelwert = mean("Temperature", na.rm = TRUE)`.
## ℹ In group 1: `Station = "Berlin-Alexanderplatz"`.
## Caused by warning in `mean.default()`:
## ! argument is not numeric or logical: returning NA
## ℹ Run `dplyr::last_dplyr_warnings()` to see the 5 remaining warnings.
print(schätzer)
## # A tibble: 3 × 3
##   Station               Mittelwert Stdabweichung
##   <chr>                      <dbl>         <dbl>
## 1 Berlin-Alexanderplatz         NA            NA
## 2 Berlin-Dahlem                 NA            NA
## 3 Schoenefeld                   NA            NA

4. Simulieren Sie eine Normalverteilung mit den in Aufgabe 3 gefundenen Parametern für alle drei Stationen. Extrahieren Sie dazu mittels korrekter Indizierung die Schätzer aus der Tabelle Aufgabe 3 und fügen diese als Funktionsargumente in die Funktion dnorm() ein (Vorsicht: Um einzelne Werte aus einem tibble zu extrahieren, müssen Sie hinter die beiden Indizes das Argument , drop=TRUE setzen). Plotten Sie anschließend wiederum die drei Histogramme, dieses Mal allerdings mit der simulierten Normalverteilung darüber (wie in der Übungsaufgabe). Zuletzt, erstellen Sie bitte für jede Station einen QQ-Plot für die Minimumtempraturen. Fügen Sie alle 6 Plots (3 Histogramme + 3 QQ-Plots) zusammen (mittels grid.arrange) (3P).

library(tidyverse)
library(gridExtra)
## 
## Attaching package: 'gridExtra'
## The following object is masked from 'package:dplyr':
## 
##     combine
n <- 1000
stationen <- unique(schätzer$Station)
plots <- list()

for (station in stationen) {
  params <- schätzer %>%
    filter(Station == station) %>%
    select(Mittelwert, Stdabweichung) %>%
    unlist(use.names = FALSE) 
  simulated_data <- rnorm(n, mean = params[1], sd = params[2])
  simulated_data <- simulated_data[!is.na(simulated_data) & !is.nan(simulated_data)]
  hist_plot <- ggplot(data.frame(x = simulated_data), aes(x)) +
    geom_histogram(aes(y = after_stat(density)), bins = 30, fill = "lightblue", color = "black") +
    stat_function(fun = function(x) dnorm(x, mean = params[1], sd = params[2]), 
                  color = "red", size = 1) +
    ggtitle(paste("Histogramm der Station", station)) +
    theme_minimal()
  qq_plot <- ggplot(data.frame(x = simulated_data), aes(sample = x)) +
    geom_qq() +
    geom_qq_line() +
    ggtitle(paste("QQ-Plot der Station", station)) +
    theme_minimal()
  plots[[paste("hist_", station, sep = "")]] <- hist_plot
  plots[[paste("qq_", station, sep = "")]] <- qq_plot}
## Warning in rnorm(n, mean = params[1], sd = params[2]): NAs produced
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
## Warning in rnorm(n, mean = params[1], sd = params[2]): NAs produced
## Warning in rnorm(n, mean = params[1], sd = params[2]): NAs produced

5. Vergleichen Sie die Ergebnisse der drei Stationen (2P).

summary_stats <- schätzer %>%
  group_by(Station) %>%
  summarise(
    Mittelwert = mean(Mittelwert, na.rm = TRUE),
    Stdabweichung = mean(Stdabweichung, na.rm = TRUE))
print(summary_stats)
## # A tibble: 3 × 3
##   Station               Mittelwert Stdabweichung
##   <chr>                      <dbl>         <dbl>
## 1 Berlin-Alexanderplatz        NaN           NaN
## 2 Berlin-Dahlem                NaN           NaN
## 3 Schoenefeld                  NaN           NaN