A regressão de Ridge resulta diferente no uso de lm.ridge e glmnet

11

Eu apliquei alguns dados para encontrar a melhor solução de variáveis ​​do modelo de regressão usando regressão de cumeeira em R. Eu usei lm.ridgee glmnet(quando alpha=0), mas os resultados são muito diferentes, especialmente quando lambda=0. Supõe-se que ambos os estimadores de parâmetros tenham os mesmos valores. Então, qual é o problema aqui? Cumprimentos

Zakaria Al-Jammal
fonte

Respostas:

14

O glmnet padroniza a variável y e usa os erros quadráticos médios em vez da soma dos erros quadráticos. Portanto, você precisa fazer os ajustes adequados para corresponder às saídas deles.

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

fonte
Olá. Qual pacote R você recomenda usar para a regressão de cume? glmnet, bigRR, Mass, outros? Algum deles é capaz de lidar com medidas repetidas (efeitos aleatórios)?
skan
Eu tenho alguma discrepância entre a saída glmnet e MASS lm.ridge que não pode ser explicada por problemas de redimensionamento. No entanto, lm.ridge me deu o resultado que coincide com o cálculo manual. Se eu tiver tempo no futuro, postarei o exemplo completo. Agora, eu irei com MASS. Além disso, o próprio glmnet adverte que os resultados dependem da maneira como você configura os parâmetros lambda; isso é mais um ataque ao glmnet.
PA6OTA 25/02