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)