Ridge回归结果与使用lm.ridge和glmnet不同


11

我申请了一些数据,以寻找使用岭回归在R.我回归模型的最佳解决方案的变量已经使用lm.ridgeglmnet(当alpha=0),但结果有很大的不同尤其是当lambda=0。假定两个参数估计量都具有相同的值。那么,这是什么问题呢?最好的祝福

Answers:


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软件包进行Ridge回归?glmnet,bigRR,Mass等?他们中有谁能够应对重复措施(随机效应)?
skan 2016年

我在glmnet和MASS lm.ridge输出之间存在一些差异,无法通过重新缩放问题来解释。但是,lm.ridge给我的结果与手工计算相吻合。如果将来有时间,我将发布完整的示例。现在,我将使用MASS。另外,glmnet本身会警告说,结果取决于您设置lambda参数的方式,这是对glmnet的另一警告。
PA6OTA
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.