ผลลัพธ์การถดถอยของสันเขาแตกต่างกันในการใช้ lm.ridge และ glmnet


11

ฉันใช้ข้อมูลบางอย่างที่จะหาทางออกที่ดีที่สุดของตัวแปรแบบการถดถอยโดยใช้การถดถอยสันในอาร์ฉันได้ใช้lm.ridgeและglmnet(เมื่อalpha=0) lambda=0แต่ผลที่แตกต่างกันมากโดยเฉพาะอย่างยิ่งเมื่อ มันสมมติว่าตัวประมาณค่าพารามิเตอร์ทั้งสองมีค่าเหมือนกัน แล้วปัญหาอะไรที่นี่? ขอแสดงความนับถืออย่างสูง

คำตอบ:


14

glmnet สร้างมาตรฐานให้กับตัวแปร y และใช้ค่าเฉลี่ยข้อผิดพลาดกำลังสองแทนผลรวมของข้อผิดพลาดกำลังสอง ดังนั้นคุณต้องทำการปรับที่เหมาะสมเพื่อให้ตรงกับผลลัพธ์

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

สวัสดี. คุณแนะนำให้ใช้แพคเกจ R สำหรับการถดถอยแนว glmnet, bigRR, Mass, อื่น ๆ ? มีผู้ใดบ้างที่สามารถจัดการกับมาตรการซ้ำ ๆ (เอฟเฟกต์แบบสุ่ม) ได้
skan

ฉันมีความแตกต่างระหว่างเอาต์พุต glmnet และ MASS lm.ridge ที่ไม่สามารถอธิบายได้ด้วยการลดปัญหา อย่างไรก็ตาม lm.ridge ให้ผลลัพธ์ที่ตรงกับการคำนวณด้วยมือ หากฉันมีเวลาในอนาคตฉันจะโพสต์ตัวอย่างที่สมบูรณ์ ตอนนี้ฉันจะไปกับ MASS นอกจากนี้ glmnet เองก็เตือนว่าผลลัพธ์ขึ้นอยู่กับวิธีที่คุณตั้งค่าพารามิเตอร์แลมบ์ดานั่นคืออีกหนึ่งการโจมตีกับ glmnet
PA6OTA
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.