R:如何将cv.glmnet()函数中的lasso lambda值转换为selectiveInference包



我使用{selectiveInference}包使用套索("l1范数"(执行选择后推理。这个包假设lambda是固定的——也就是说,我们事先确定它。但是,我需要使用交叉验证。

Taylor&Tibshirani(2018(使用模拟表明,使用交叉验证来确定lambda会使用selectiveInference::fixedLassoInf()方法产生有效的推断统计。(另一篇论文提出了一种处理通过交叉验证确定的lambda的方法,但它似乎还没有出现在软件包中,2018年论文中的模拟对我来说足够好。(

我在文档中看到,{glmnet}使用1/n套索参数化,而{selectiveInference}使用公共参数化。该文档展示了如何从公共lambda转换为{glmnet}可以使用的内容。

我需要做相反的事情:从cv.glmnet()给我的东西开始,把它变成fixedLassoInf()想要的公共尺度上的lambda

具体而言,{glmnet}文档中写道:

还要注意,对于";"高斯";,glmnet在计算其lambda序列之前将y标准化为具有单位方差(使用1/n而不是1/(n-1(公式((然后对所得系数进行非标准化(;如果你想复制/比较结果与其他软件,最好提供一个标准的y

{selectiveInference}说:

估计的套索系数(例如,来自glmnet(。它的长度为p(因此截距不包括在第一个分量中(。小心!此函数使用";标准";套索目标。。。相反,glmnet将第一项乘以1/n的因子。因此,在运行glmnet之后,要提取与值lambda对应的beta,需要使用beta=ccove(obj,s=lambda/n([-1]。。。

有关可复制的示例,请参阅下面的代码。

我的问题特别涉及如何调整这一行:si_lambda <- glmnet_lambda。也就是说,我该做什么转换从lambdacv.glmnet()给我(我将其分配给glmnet_lambda(到{selectiveInference}将使用的lambda(我称之为si_lambda(?

我最初的想法是,由于文档中说要除以n,我的想法是将cv.glmnet()给我的值乘以我的样本量。它运行时没有发出警告或错误,但它给了我188.5121的lambda,这感觉不对。如果答案是这样的话,我很抱歉,我只是太密集了——但我想确保我以适当的方式从一个软件转到另一个软件。

library(glmnet)
library(selectiveInference)
library(tidyverse)
set.seed(1839)
n <- 1000       # sample size
B <- c(0, 1, 0) # intercept 0, beta1 = 1, beta2 = 0
eps_sd <- 1     # sd of the error
# make data
X <- cbind(1, replicate(length(B) - 1, rnorm(n, 0, 1)))
y <- X %*% B + rnorm(n, 0, eps_sd)
dat <- as.data.frame(X[, -1])
dat <- as_tibble(cbind(dat, y))
# get lambda by way of cross-validation
glmnet_lambda <- cv.glmnet(
x = as.matrix(select(dat, -y)),
y = dat$y
) %>% 
getElement("lambda.1se")
# run glmnet with that lambda
m1 <- glmnet(
x = as.matrix(select(dat, -y)),
y = dat$y,
lambda = glmnet_lambda
)
# get coefs from that model, dropping intercept, per the docs
m1_coefs <- coef(m1)[-1]
# what reparameterization do I do here?
si_lambda <- glmnet_lambda
# do post-selection inference with m1
# runs with warning, so I assume parameterized incorrectly -- how to fix?
m2 <- fixedLassoInf(
x = as.matrix(select(dat, -y)),
y = dat$y,
beta = m1_coefs,
lambda = si_lambda
)

和会话信息:

> sessionInfo()
R version 4.1.0 (2021-05-18)
Platform: x86_64-apple-darwin17.0 (64-bit)
Running under: macOS Big Sur 11.4
Matrix products: default
LAPACK: /Library/Frameworks/R.framework/Versions/4.1/Resources/lib/libRlapack.dylib
locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
attached base packages:
[1] parallel  stats     graphics  grDevices utils     datasets  methods   base     
other attached packages:
[1] forcats_0.5.1            stringr_1.4.0            dplyr_1.0.6             
[4] purrr_0.3.4              readr_1.4.0              tidyr_1.1.3             
[7] tibble_3.1.2             ggplot2_3.3.3            tidyverse_1.3.1         
[10] selectiveInference_1.2.5 MASS_7.3-54              adaptMCMC_1.4           
[13] coda_0.19-4              survival_3.2-11          intervals_0.15.2        
[16] glmnet_4.1-1             Matrix_1.3-3            

需要在fixedAssociateInf的文档中翻转示例;根据您的示例进行调整可以获得以下代码:

library(glmnet)
library(selectiveInference)
# Make dataset
set.seed(1839)
n <- 1000       # sample size
B <- c(0, 1, 0) # intercept 0, beta1 = 1, beta2 = 0
eps_sd <- 1     # sd of the error
X <- cbind(1, replicate(length(B) - 1, rnorm(n, 0, 1)))
y <- X %*% B + rnorm(n, 0, eps_sd)
# Cross-validation to find lambda
gfit = cv.glmnet(X[,-1], y) # we need to remove the intercept variable (glmnet will add another one)
lambda = gfit$lambda.min
# Obtain coefficients (properly scaling lambda and removing the intercept coefficient)
(beta = coef(gfit, x=X[,-1], y=y, s=lambda, exact=TRUE)[-1])
# [1]  0.99297607 -0.04300646
# Compute fixed lambda p-values and selection intervals
(out = fixedLassoInf(X[,-1], y, beta, lambda*n))
# Call:fixedLassoInf(x = X[, -1], y = y, beta = beta, lambda = lambda * n)
# 
# Standard deviation of noise (specified or estimated) sigma = 1.012
# 
# Testing results at lambda = 4.562, with alpha = 0.100
# 
# Var   Coef Z-score P-value LowConfPt UpConfPt LowTailArea UpTailArea
# 1  0.998  31.475   0.000     0.945    1.050       0.049      0.049
# 2 -0.048  -1.496   0.152    -0.100    0.032       0.050      0.049
# 
# Note: coefficients shown are partial regression coefficients

最新更新