Los resultados de la regresión de crestas son diferentes al usar lm.ridge y glmnet

11

Apliqué algunos datos para encontrar la mejor solución de variables del modelo de regresión usando la regresión de cresta en R. He usado lm.ridgey glmnet(cuándo alpha=0), pero los resultados son muy diferentes, especialmente cuando lambda=0. Supongamos que ambos estimadores de parámetros tienen los mismos valores. ¿Entonces, cuál es el problema aquí? atentamente

Zakaria Al-Jammal
fuente

Respuestas:

14

glmnet estandariza la variable y y usa los errores cuadrados medios en lugar de la suma de los errores cuadrados. Por lo tanto, debe realizar los ajustes adecuados para que coincidan con sus resultados.

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

fuente
Hola. ¿Qué paquete de R recomienda usar para la regresión de Ridge? glmnet, bigRR, Mass, otro? ¿Alguno de ellos puede manejar medidas repetidas (efectos aleatorios)?
skan
Tengo cierta discrepancia entre glmnet y la salida MASS lm.ridge que no puede explicarse por problemas de reescalado. Sin embargo, lm.ridge me dio el resultado que coincide con el cálculo manual. Si tengo tiempo en el futuro, publicaré el ejemplo completo. En este momento, iré con MASS. Además, glmnet advierte que los resultados dependen de la forma en que configure los parámetros lambda, ese es un ataque más contra glmnet.
PA6OTA