リッジ回帰の結果が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')

こんにちは。リッジ回帰にどのRパッケージを使用することを勧めますか?glmnet、bigRR、Mass、その他?繰り返し測定(ランダム効果)に対応できる人はいますか?
skan

glmnetとMASS lm.ridgeの出力には、再スケーリングの問題では説明できない不一致があります。しかし、lm.ridgeは、手計算と一致する結果を私に与えました。私に将来の時間があれば、完全な例を投稿します。今はMASSで行きます。また、glmnet自体は、ラムダパラメーターの設定方法によって結果が異なることを警告します。これは、glmnetに対するもう1つの警告です。
PA6OTA 2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.