Kết quả hồi quy sườn khác nhau khi sử dụng lm.ridge và glmnet


11

Tôi đã áp dụng một số dữ liệu để tìm giải pháp biến tốt nhất của mô hình hồi quy bằng hồi quy sườn trong R. Tôi đã sử dụng lm.ridgeglmnet(khi alpha=0), nhưng kết quả rất khác nhau, đặc biệt là khi lambda=0. Nó giả sử rằng cả hai công cụ ước tính tham số có cùng giá trị. Vì vậy, vấn đề ở đây là gì? trân trọng

Câu trả lời:


14

glmnet chuẩn hóa biến y và sử dụng các lỗi bình phương trung bình thay vì tổng các lỗi bình phương. Vì vậy, bạn cần phải thực hiện các điều chỉnh thích hợp để phù hợp với đầu ra của họ.

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

Xin chào. Bạn khuyên dùng gói R nào cho Ridge Regression? glmnet, bigRR, Mass, khác? Bất kỳ trong số họ có thể đối phó với các biện pháp lặp đi lặp lại (hiệu ứng ngẫu nhiên)?
skan

Tôi đã có một số khác biệt giữa đầu ra glmnet và MASS lm.ridge không thể giải thích được bằng cách thay đổi kích thước các vấn đề. Tuy nhiên, lm.ridge đã cho tôi kết quả trùng khớp với tính toán tay. Nếu tôi có thời gian trong tương lai, tôi sẽ đăng ví dụ hoàn chỉnh. Ngay bây giờ, tôi sẽ đi với MASS. Ngoài ra, chính glmnet cảnh báo rằng kết quả phụ thuộc vào cách bạn thiết lập các tham số lambda, đó là một lần tấn công chống lại glmnet.
PA6OTA
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.