--- format: pdf: fontsize: 11pt number-sections: false include-in-header: 12_Header.tex lang: de --- # (12) Freie Arbeit Im Folgenden finden Sie die Lösungen der Programmieraufgaben. Die Zwischenüberschriften geben an, auf die Inhalte welcher Einheit des Vorkurses sich die Lösungen beziehen. ### (2) R und VS Code 1. Über die Kurswebseite wird die Datei `Salaries.csv` bereitgestellt. Laden Sie diese Datei herunter und speichern Sie sie auf Ihrem PC. 2. Platzieren Sie die Datei in einem Ordner auf Ihrem PC und legen Sie das R-Skript `Programmieraufgabe.r` an. Öffnen Sie es in VS Code. \small ```{r, echo = T, eval = T} # Salaries.csv # Programmieraufgabe.r ``` \normalsize ### (6) Datenmanagement 3. Laden Sie den Inhalt der CSV-Datei mit `read.csv` in einem Dataframe `D1`. Speichern Sie die Anzahl der Zeilen von `D1` in die Variable `n`. \small ```{r, echo = T, eval = T} # Daten einlesen filename = 'Salaries.csv' # Dateiname D1 = read.csv(filename) # Dataframe n = nrow(D1) # Anzahl Datenpunkte ``` \normalsize ### (5) Listen und Dataframes 4. Erzeugen Sie einen neuen Dataframe `D2`, indem Sie aus `D1` die Spalten `salary`, `yrs.since.phd` und `yrs.service` extrahieren. Geben Sie die ersten 10 Zeilen von `D2` aus. \small ```{r, echo = T, eval = T} # Daten reduzieren D2 = D1[,c("salary","yrs.since.phd", # Variablen extrahieren "yrs.service")] # D2 = data.frame(D1$salary, D1$yrs.since.phd, # alternative Lösung # D1$yrs.service) # D2 = D1[,c(6,3,4)] # alternative Lösung # Daten ausgeben print(D2[1:10,]) # erste 10 Zeilen # head(D2, n=10) # alternative Lösung ``` \normalsize ### (8) Berechnung von Deskriptivstatistiken 5. Ermitteln Sie Stichprobenmittel, Stichprobenvarianz und Stichprobenstandardabweichung aller Variablen in `D2` und speichern Sie diese in einen neuen Dataframe `D2_var`. \small ```{r, echo = T, eval = T, message = F} # Statistiken berechnen library(dplyr) # R-Paket laden D2_var = rbind( # Kombination von Zeilen summarise(D2, across(everything(), mean)), # Stichprobenmittel summarise(D2, across(everything(), var)), # Stichprobenvarianz summarise(D2, across(everything(), sd))) %>% # Stichprobenstandardabweichung as.data.frame() # Konvertierung in Dataframe # Statistiken ausgeben rownames(D2_var) = c("Mean", "Var", "SD") # Zeilen benennen print(D2_var) # Ergebnisausgabe ``` \normalsize \pagebreak ### (9) Häufigkeitsverteilungen und Verteilungsfunktionen 6. Erstellen Sie ein Histogramm der Variable `salary` mit Klassen zwischen 50.000 \$ und 250.000 \$ und einer Klassenbreite von 10.000 \$. Speichern Sie die Abbildung als `Histogramm_1.pdf`. \small ```{r, echo = T, eval = T} # Variable "salary" y = D1$salary # Dataframe-Variable breaks = seq(50000, 250000, 10000) # Klassengrenzen # Histogramm erzeugen hist(y, # Histogramm breaks = breaks, # Klassengrenzen xlim = c(min(breaks), max(breaks)), # x-Achsengrenzen ylim = c(0, 80), # y-Achsengrenzen xlab = "Jahresgehalt [$]", # x-Achsenbezeichnung ylab = "Häufigkeit", # y-Achsenbezeichnung main = sprintf("Jahresgehalt, k = %d", # Abbildungstitel length(breaks))) # Histogramm abspeichern dev.copy2pdf( # PDF-Speicherung file = "Histogramm_1.pdf", # Dateiname width = 7, # Breite height = 4) # Höhe ``` \normalsize 7. Erstellen Sie ein Histogramm der Variable `yrs.since.phd` mit Klassenzentren von 0 bis 60 Jahren in Schritten von 5 Jahren. Speichern Sie die Abbildung als `Histogramm_2.pdf`. \small ```{r, echo = T, eval = T} # Variable "Visits" y = D1$yrs.since.phd # Dataframe-Variable breaks = seq(0, 65, 5) - 2.5 # Klassengrenzen -2.5,+2.5,...,57.5,62.5 # = Klassenzentren 0,5,...,55,60 # Histogramm erzeugen hist(y, # Histogramm breaks = breaks, # Klassengrenzen xlim = c(min(breaks), max(breaks)), # x-Achsengrenzen ylim = c(0, 60), # y-Achsengrenzen xlab = "Jahre seit PhD", # x-Achsenbezeichnung ylab = "Häufigkeit", # y-Achsenbezeichnung main = sprintf("Jahre seit PhD, k = %d", # Abbildungstitel length(breaks))) # Histogramm abspeichern dev.copy2pdf( # PDF-Speicherung file = "Histogramm_2.pdf", # Dateiname width = 7, # Breite height = 4) # Höhe ``` \normalsize ### (10) Maße der zentralen Tendenz und der Datenvariabilität 8. Ermitteln Sie Stichprobenmittel, Stichprobenmedian und Stichprobenmodalwert aller Variablen in `D2` und speichern Sie diese in einen neuen Dataframe `D2_mean`. \small ```{r, echo = T, eval = T, message = F} # Statistiken berechnen library(dplyr) # R-Paket laden D2_mean = rbind( # Kombination von Zeilen summarise(D2, across(everything(), mean)), # Stichprobenmittel summarise(D2, across(everything(), median)), # Stichprobenmedian summarise(D2, across(everything(), ~ NA))) %>% # Platzhalter as.data.frame() # Konvertierung in Dataframe for (i in 1:ncol(D2)) { # Schleife über Zeilen H = as.data.frame(table(D2[,i])) # absolute Häufigkeiten names(H) = c("a", "h") # Spalten umbenennen D2_mean[3,i] = as.numeric(as.character( # Stichprobenmodalwert H$a[H$h == max(H$h)])) } # Statistiken ausgeben rownames(D2_mean) = c("Mean", "Median", "Mode") # Zeilen benennen print(D2_mean) # Ergebnisausgabe ``` \normalsize ### (7) Strukturiertes Programmieren, (3) Arithmetik und Variablen 9. Erzeugen Sie einen `n`-dimensionalen Vektor `z`, bei dem alle Einträge zunächst mit `NA` befüllt werden. 10. Benutzen Sie eine `for`-Schleife und `if-else`-Klauseln, um das $i$-te Element von `z` auf 1 zu setzen, wenn der $i$-te Eintrag von `D1$sex` gleich `"Female"` ist, und auf 0, wenn dieser gleich `"Male"` ist. \small ```{r, echo = T, eval = T} # Vektor erzeugen z = matrix(rep(NA,n), nrow=n) # Vektor z # Vektor befüllen for (i in 1:n) { # Schleife über Einträge if (D1$sex[i] == "Female") { z[i] = 1 } # 1, falls Female else { z[i] = 0 } # 0, falls nicht } ``` \normalsize ### (4) Vektoren und Matrizen, (3) Arithmetik und Variablen 11. Extrahieren Sie die Variablen `yrs.since.phd` und `salary` in die `n`-dimensionalen Vektoren `x` und `y`. Erzeugen Sie eine $n \times 3$ Matrix `X`, deren erste Spalte ein Einsvektor ist, deren zweite Spalte mit `z` befüllt wird und deren dritte Spalte der Variable `x` entspricht. 12. Berechnen Sie für ein lineares Regressionsmodell mit dem Datenvektor `y` und der Designmatrix `X` den Betaparameterschätzer mithilfe der Formel $\hat{\beta} = (X^\mathrm{T} X)^{-1} X^\mathrm{T} y$. Sie sollten folgendes Ergebnis erhalten: \small ```{r, echo = T, eval = T} # Variablen extrahieren x = as.matrix(D1$yrs.since.phd) # Variable x y = as.matrix(D1$salary) # Variable y # Designmatrix erstellen X = matrix(c(rep(1,n), z, x), nrow = n) # Matrix X # Parameterschätzer berechnen beta_hat = solve(t(X) %*% X) %*% t(X) %*% y # Betaparamerschätzer cat("Betaparameterschätzer : ", round(beta_hat, digits = 3)) ``` \normalsize