Ridge-Regression in R
Arndt Regorz, Dipl. Kfm. & MSc. Psychologie, 06.12.2023
Dieses ist eine Begleitseite zum Video-Tutorial über Ridge-Regression in R.
(Hinweis: Mit Anklicken des Videos wird ein Angebot des Anbieters YouTube genutzt.)
Code aus dem Video-Tutorial:
Hier ist der Code für den Teil des Videos zur Ridge-Regression:
# install.packages("glmnet")
# install.packages("dplyr")
# install.packages("jtools")
library(glmnet) # für Ridge-Regression
library(dplyr) # für Datenaufbereitung
library(jtools) # für VIF bei normaler Regression
head(daten_ridge)
# Z-Standardisieren der Variablen
# daten_ridge <- transmute(daten_ridge, UV1 = scale(UV1), UV2 = scale(UV2),
# UV3 = scale(UV3), UV4 = scale(UV4), UV5 = scale(UV5),
# UV6 = scale(UV6), AV = scale(AV))
# Trennung in Trainingsdaten und Testdaten
set.seed(1234)
n_train <- sample(380, 266)
head(n_train)
# 1 . Gewöhnliche Regression
#===========================
reg_fit <- lm(AV ~ UV1 + UV2 + UV3 + UV4 + UV5 + UV6, data = daten_ridge[n_train,])
summ(reg_fit) # summ-Funktion aus dem jtools Modul
summ(reg_fit, vifs = TRUE)
# Vorhersage für Testdatensatz
vorhersage_kq <- predict(reg_fit, daten_ridge[-n_train,])
head(vorhersage_kq)
# Mittlerer Quadratischer Fehler für die Testdaten
mse_kq <- mean((vorhersage_kq - daten_ridge$AV[-n_train])^2)
mse_kq
# 2 . Ridge-Regression
#===========================
x <- as.matrix(select(daten_ridge, UV1, UV2, UV3, UV4, UV5, UV6))
# select-Funktion aus dem dplyr Modul
head(x)
y <- as.matrix(select(daten_ridge, AV))
head(y)
# Modellschätzung mit Trainingsdaten, 10fache Crossvalidierung
ridge_train_fit <- cv.glmnet(x[n_train,], y[n_train], alpha = 0, nfolds = 10)
# Lambda-Werte, mit denen die Ridge-Regression durchgeführt worden ist
ridge_train_fit$lambda
# Ermittlung des optimalen Wertes für Lambda
best_lambda <- ridge_train_fit$lambda.min
best_lambda
# Vorgabe eines benutzerdefinieren Lambda-Bereichs
lambda_ben <- c(.0001, .0005, .001, .005, .01, .02, .03, .04, .045)
ridge_train_fit <- cv.glmnet(x[n_train,], y[n_train], alpha = 0, nfolds = 10,
lambda = lambda_ben)
best_lambda <- ridge_train_fit$lambda.min
best_lambda
# Vorhersagewerte für die Testdaten
vorhersage_ridge <- predict(ridge_train_fit, s=best_lambda, newx = x[-n_train,])
head(vorhersage_ridge)
# Mittlerere quadratischer Fehler für die Testdaten
mse_ridge <- mean((vorhersage_ridge - y[-n_train])^2)
mse_ridge
# 3. Vergleich der beiden Verfahren
#=================================
#Normale Regression MSE:
mse_kq
#Ridge Regression MSE:
mse_ridge
vergleich <- data.frame(daten_ridge$AV[-n_train], vorhersage_kq, vorhersage_ridge)
head(vergleich, 10)
# Koeffizienten in der Population:
c(4.1, 0.3, 0.2, 0.1, 0.6, -0.8, 0.2)
# Normale Regression Koeffizienten:
coef(reg_fit)
# Ridge Regression Koeffizienten:
coef(ridge_train_fit)
# Anhang: Schätzung für ein konkretes Lambda
#============================================
ridge_einzel_fit <- glmnet(x, y, alpha = 0, lambda = 1.5)
coef(ridge_einzel_fit)