glmnet
包使用从最大LASSO
缩放的一系列lambda
调整参数lambda_max
,其中没有选择预测变量。我想知道glmnet
如何计算这个lambda_max
值。例如,在一个简单的数据集中:
set.seed(1)
library("glmnet")
x <- matrix(rnorm(100*20),100,20)
y <- rnorm(100)
fitGLM <- glmnet(x,y)
max(fitGLM$lambda)
# 0.1975946
包装插图(http://www.jstatsoft.org/v33/i01/paper)在2.5节中描述它计算此值如下:
sx <- as.matrix(scale(x))
sy <- as.vector(scale(y))
max(abs(colSums(sx*sy)))/100
# 0.1865232
这显然是接近但不是相同的价值。那么,是什么导致了这种差异?在一个相关的问题中,我如何计算lambda_max
进行逻辑回归?
要获得相同的结果,您需要使用n
而不是n-1
分母的标准偏差来标准化变量。
mysd <- function(y) sqrt(sum((y-mean(y))^2)/length(y))
sx <- scale(x,scale=apply(x, 2, mysd))
sx <- as.matrix(sx, ncol=20, nrow=100)
sy <- as.vector(scale(y, scale=mysd(y)))
max(abs(colSums(sx*sy)))/100
## [1] 0.1758808
fitGLM <- glmnet(sx,sy)
max(fitGLM$lambda)
## [1] 0.1758808
似乎lambda_max
的逻辑回归类似地计算,权重基于类比例:
set.seed(1)
library("glmnet")
x <- matrix(rnorm(100*20),100,20)
y <- rnorm(100)
mysd <- function(y) sqrt(sum((y-mean(y))^2)/length(y))
sx <- scale(x, scale=apply(x, 2, mysd))
sx <- as.matrix(sx, ncol=20, nrow=100)
y_bin <- factor(ifelse(y<0, -1, 1))
prop.table(table(y_bin))
# y_bin
# -1 1
# 0.62 0.38
fitGLM_log <- glmnet(sx, y_bin, family = "binomial")
max(fitGLM_log$lambda)
# [1] 0.1214006
max(abs(colSums(sx*ifelse(y<0, -.38, .62))))/100
# [1] 0.1214006
关于你的第二个问题,请看弗里德曼等人的论文"Regularization paths for generalized linear models via coordinate descent"。特别地,参见等式(10),其在平衡时是相等的。只需检查所有参数的分子$ S(\ cdot,\ cdot)$在什么条件下为零。
根据help("glmnet")
,最大lambda值是“所有系数为零的最小值”:
sum(fitGLM$beta[, which.max(fitGLM$lambda)])
#[1] 0
sum(glmnet(x,y, lambda=max(fitGLM$lambda)*0.999)$beta)
#[1] -0.0001809804
快速浏览一下,该值似乎是由elnet
调用的Fortran代码计算出来的。