... und hier ist das Übungsscript mit den entsprechenden Lösungen eingefügt:
library(MASS)
df = Boston
?Boston
summary(df)
# Aufgabe: Fitte eine lineare Regression in der die Kriminalitätsrate
# (crim) vom Anteil der schwarzen Bevölkerung (black) abhängt!
fit = lm(crim~black, data=df)
summary(fit)
# Gibt es einen Zusammenhang?
# Wie stark ist der Zusammenhang und ist er signifikant?
# Erstelle einen Scatterplot und füge eine Regressionsgrade hinzu!
plot(df$black, df$crim)
abline(fit)
# Wie interpretierst du den Plot?
# Multi-Linear-Regression
# Fitte ein Modell für crim mit allen möglichen Predictoren!
fit2 = lm(crim~., data=df)
summary(fit2)
# Erstelle Diagnoseplots und interpretiere sie!
par(mfrow=c(2,2))
plot(fit2)
# Lade die Leaps-Bibliothek, führe die folgenden Befehle aus und
# identifiziere das beste Modell nach dem Cp-Wert!
# requires "leaps"
library(leaps)
X = df[,-1]
y = df[,1]
out = summary(regsubsets(X, y, nbest=2, nvmax=ncol(X)))
tab = cbind(out$which, out$rsq, out$adjr2, out$cp)
tab
# Erstelle einen Vector sel, der die Namen der Spalten (in "")
# enthält, die du auf Basis von regsubsets als Predictoren
# nimmst!
sel=c("zn","nox","dis", "rad", "ptratio", "black", "medv")
# Der folgende Befehl erstellt eine Tabelle, die nur noch
# die Ausgewählten Predictoren und die Response enthält.
df.sel=subset(df, select= c("crim", sel))
# Fitte eine lineare Regression mit den ausgewählten Predictoren
# und analysiere das Summary und die Diagnose Plots.
fit3 = lm(crim~., data=df.sel)
summary(fit3)
plot(fit3)
# Crossvalidierung
set.seed(1)
# Unterteile die Daten in ein Trainings- und Testset!
# Dafür ziehst du ein Zufallssample mit der Größe 2/3 der
# Zeilenzahl aus der Menge der Zahlen 1 bis Zeilenzahl. Dieses
# Sample weist du dem Objekt train zu.
train = sample(dim(df.sel)[1], round(dim(df.sel)[1]/3*2))
# Die Berechnung des Modells erfolgt nun auf den Trainingsdaten
# mit folgendem Befehl:
fit4 = lm(crim~., data=df.sel[train,])
# Benutze nun die übrigen (Test-)Daten, um mit dem Modell fit4
# die Werte für crim vorherzusagen! Dazu nimmt man die predict()-
# Funktion. Speicher die Ergebnisse in einem Objekt pred!
pred = predict(fit4, newdata=df.sel[-train,])
# Folgender Befehl erstellt eine neue Function, um den
# Root Mean Square Error zu berechnen:
RMS <- function(num) sqrt(sum(num^2)/length(num))
real.values = df.sel$crim[-train]
RMS(real.values-pred)
# Wie hoch ist der RMSE für das Modell auf den gesamten Daten?
pred = predict(fit3, newdata=df.sel[-train,])
RMS(real.values-pred)
# Wiederhole die Kreuzvalidierung 5 mal, ohne set.seed und bilde
# den Mittelwert der RMSE! Die Werte können in folgenden Vector
# gespeichert werden:
RMSEs = rep(0,5)
for(i in 1:5){
train = sample(dim(df.sel)[1], round(dim(df.sel)[1]/3*2))
fitx = lm(crim~., data=df.sel[train,])
pred = predict(fitx, newdata=df.sel[-train,])
real.values = df.sel$crim[-train]
RMSEs[i] = RMS(real.values-pred)
}
mean(RMSEs)
Kommentare
Kommentar veröffentlichen