Les résultats de la régression de crête diffèrent en utilisant lm.ridge et glmnet


11

J'ai appliqué quelques données pour trouver la meilleure solution de variables du modèle de régression en utilisant la régression de crête dans R. J'ai utilisé lm.ridgeet glmnet(quand alpha=0), mais les résultats sont très différents, surtout quand lambda=0. Il suppose que les deux estimateurs de paramètres ont les mêmes valeurs. Alors, quel est le problème ici? meilleures salutations

Réponses:


14

glmnet standardise la variable y et utilise les erreurs quadratiques moyennes au lieu de la somme des erreurs quadratiques. Vous devez donc effectuer les ajustements appropriés pour correspondre à leurs sorties.

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')

Bonjour. Quel package R conseillez-vous d'utiliser pour Ridge Regression? glmnet, bigRR, Mass, autre? L'un d'eux est-il capable de gérer des mesures répétées (effets aléatoires)?
skan

J'ai des différences entre glmnet et la sortie lm.ridge de MASS qui ne peuvent pas être expliquées par des problèmes de redimensionnement. Cependant, lm.ridge m'a donné le résultat qui coïncide avec le calcul manuel. Si j'ai du temps à l'avenir, je posterai l'exemple complet. En ce moment, j'irai avec MASS. De plus, glmnet lui-même avertit que les résultats dépendent de la façon dont vous configurez les paramètres lambda, c'est une attaque de plus contre glmnet.
PA6OTA
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.