【发布时间】:2018-10-04 03:17:12
【问题描述】:
我正在使用 glmnet R 包运行 Ridge 回归。我注意到我从glmnet::glmnet 函数获得的系数与我通过定义计算系数获得的系数不同(使用相同的 lambda 值)。谁能解释一下为什么?
数据(包括:响应Y 和设计矩阵X)被缩放。
library(MASS)
library(glmnet)
# Data dimensions
p.tmp <- 100
n.tmp <- 100
# Data objects
set.seed(1)
X <- scale(mvrnorm(n.tmp, mu = rep(0, p.tmp), Sigma = diag(p.tmp)))
beta <- rep(0, p.tmp)
beta[sample(1:p.tmp, 10, replace = FALSE)] <- 10
Y.true <- X %*% beta
Y <- scale(Y.true + matrix(rnorm(n.tmp))) # Y.true + Gaussian noise
# Run glmnet
ridge.fit.cv <- cv.glmnet(X, Y, alpha = 0)
ridge.fit.lambda <- ridge.fit.cv$lambda.1se
# Extract coefficient values for lambda.1se (without intercept)
ridge.coef <- (coef(ridge.fit.cv, s = ridge.fit.lambda))[2:(p.tmp+1)]
# Get coefficients "by definition"
ridge.coef.DEF <- solve(t(X) %*% X + ridge.fit.lambda * diag(p.tmp)) %*% t(X) %*% Y
# Plot estimates
plot(ridge.coef, type = "l", ylim = range(c(ridge.coef, ridge.coef.DEF)),
main = "black: Ridge `glmnet`\nred: Ridge by definition")
lines(ridge.coef.DEF, col = "red")
【问题讨论】:
-
这确实是对统计辅导的请求,因此更适合 CrossValidated.com。 (我认为答案是岭回归是一种惩罚方法,但你可能会从 CV 人群中得到更权威的答案。)
-
@42- 看起来这实际上是一个编码问题。如果我理解正确,OP 会问为什么
glmnet返回的给定 lambda 值(惩罚项)的系数与他通过直接使用相同的 lambda 值求解回归系数得到的系数不同作为glmnet. -
有趣的是,OP 使用
100*ridge.fit.lambda的“手动”计算结果(几乎)与从solve(t(X) %*% X + 100*ridge.fit.lambda * diag(p.tmp)) %*% t(X) %*% Y获得的系数与从glmnet和ridge.fit.lambda获得的系数完全相同。
标签: r machine-learning regression linear-regression glmnet