Hasil regresi Ridge berbeda dalam menggunakan lm.ridge dan glmnet

11

Saya menerapkan beberapa data untuk menemukan solusi variabel terbaik dari model regresi menggunakan regresi ridge di R. Saya telah menggunakan lm.ridgedan glmnet(kapan alpha=0), tetapi hasilnya sangat berbeda terutama ketika lambda=0. Itu mengira bahwa kedua penduga parameter memiliki nilai yang sama. Jadi, apa masalahnya di sini? salam Hormat

Zakaria Al-Jammal
sumber

Jawaban:

14

glmnet membakukan variabel y dan menggunakan rata-rata kesalahan kuadrat alih-alih jumlah kesalahan kuadrat. Jadi, Anda perlu melakukan penyesuaian yang sesuai untuk mencocokkan output mereka.

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

sumber
Halo. Paket R apa yang Anda sarankan untuk digunakan untuk Regresi Ridge? glmnet, bigRR, Mass, lainnya? Adakah di antara mereka yang mampu menangani tindakan berulang (efek acak)?
skan
Saya punya beberapa perbedaan antara glmnet dan MASS lm.ridge output yang tidak bisa dijelaskan dengan men-rescaling masalah. Namun, lm.ridge memberi saya hasil yang bertepatan dengan perhitungan tangan. Jika saya punya waktu di masa depan, saya akan memposting contoh lengkap. Saat ini, saya akan pergi dengan MASS. Juga, glmnet sendiri memperingatkan bahwa hasilnya tergantung pada cara Anda mengatur parameter lambda, itu satu lagi serangan terhadap glmnet.
PA6OTA