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

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

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.