Die Ridge-Regression führt bei der Verwendung von lm.ridge und glmnet zu unterschiedlichen Ergebnissen

11

Ich habe einige Daten angewendet, um die beste Variablenlösung des Regressionsmodells unter Verwendung der Gratregression in R zu finden. Ich habe lm.ridgeund glmnet(wann alpha=0) verwendet, aber die Ergebnisse sind sehr unterschiedlich, insbesondere wenn lambda=0. Es wird angenommen, dass beide Parameterschätzer die gleichen Werte haben. Also, was ist das Problem hier? freundliche Grüße

Zakaria Al-Jammal
quelle

Antworten:

14

glmnet standardisiert die Variable y und verwendet die mittleren quadratischen Fehler anstelle der Summe der quadratischen Fehler. Sie müssen also die entsprechenden Anpassungen vornehmen, um sie an ihre Ausgänge anzupassen.

library(ElemStatLearn)
library(glmnet)
library(MASS)

dof2lambda <- function(d, dof) {
    obj <- function(lam, dof) (dof - sum(d ^ 2 / (d ^ 2 + lam))) ^ 2
    sapply(dof, function(x) optimize(obj, c(0, 1e4), x)$minimum)
}

lambda2dof <- function(d, lam) {
    obj <- function(dof, lam) (dof - sum(d ^ 2 / (d ^ 2 + lam))) ^ 2
    sapply(lam, function(x) optimize(obj, c(0, length(d)), x)$minimum)
}

dat   <- prostate
train <- subset(dat,  train, select = -train)
test  <- subset(dat, !train, select = -train)

train.x <- as.matrix(scale(subset(train, select = -lpsa)))
train.y <- as.matrix(scale(train$lpsa))

d   <- svd(train.x)$d
dof <- seq(1, 8, 0.1)
lam <- dof2lambda(d, dof)

ridge1 <- lm.ridge(train.y ~ train.x, lambda = lam)
ridge2 <- glmnet(train.x, train.y, alpha = 0, lambda = lam / nrow(train.x))

matplot(dof, t(ridge1$coef), type = 'l')
matplot(lambda2dof(d, ridge2$lambda * nrow(train.x)), t(ridge2$beta), type = 'l')

quelle
Hallo. Welches R-Paket empfehlen Sie für die Ridge-Regression? glmnet, bigRR, Mass, andere? Kann einer von ihnen mit wiederholten Maßnahmen umgehen (zufällige Effekte)?
Skan
Ich habe eine Diskrepanz zwischen der Ausgabe von glmnet und MASS lm.ridge, die nicht durch Probleme bei der Neuskalierung erklärt werden kann. Lm.ridge gab mir jedoch das Ergebnis, das mit der Handberechnung übereinstimmt. Wenn ich in Zukunft Zeit habe, werde ich das vollständige Beispiel veröffentlichen. Im Moment werde ich mit MASS gehen. Außerdem warnt glmnet selbst, dass die Ergebnisse von der Art und Weise abhängen, wie Sie Lambda-Parameter einrichten. Dies ist ein weiterer Schlag gegen glmnet.
PA6OTA