lm.ridge 및 glmnet 사용시 릿지 회귀 결과가 다름


11

나는 최고의 변수 사용했다 R. I에서 능선 회귀를 사용하여 회귀 모델의 솔루션을 찾기 위해 일부 데이터를 적용 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')

안녕하세요. Ridge Regression에 어떤 R 패키지를 사용하도록 권장합니까? glmnet, bigRR, Mass, 기타? 그들 중 반복되는 조치 (무작위 효과)를 처리 할 수있는 사람이 있습니까?
skan

glmnet과 MASS lm.ridge 출력간에 약간의 불일치가있어 크기 조정 문제로 설명 할 수 없습니다. 그러나 lm.ridge는 손 계산과 일치하는 결과를 주었다. 미래에 시간이 있다면 완전한 예제를 게시 할 것입니다. 지금은 MASS와 함께 갈 것입니다. 또한 glmnet 자체는 결과가 람다 매개 변수를 설정하는 방식에 따라 다르다는 것을 경고합니다.
PA6OTA
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.