Answers:
您问题的简要答案:
glmnet
R中的“ glmnet”包中的函数为执行套索(不是自适应套索)alpha=1
。参考文献:
LASSO解决方案是最小化的解决方案
自适应套索只是简单地增加了权重,以试图抵消已知的LASSO估计偏差的问题。
常,你会看到,其中是一些初始估计(也许从只使用LASSO,或使用最小二乘法,等)。有时,自适应套索可以使用“路径方式”进行拟合,其中权重可以使用进行更改〜β Ĵ β λ
glmnet penalty.factor glmnet
自适应LASSO用于一致的变量选择。使用LASSO进行变量选择时,我们遇到的问题是:
因此,LASSO仅在某些条件下在收缩参数,参数(β-min条件)和相关性(无法表示的条件)下进行变量选择是一致的。有关详细说明,请参见我的硕士论文的第101-106页。
当选择用于预测的调整参数时,LASSO通常包含太多变量,但是真实模型很可能是这些变量的子集。这建议使用诸如自适应LASSO之类的估计的辅助阶段,该阶段使用预测最佳调整参数来控制LASSO估计的偏差。这将导致没有上述条件的一致选择(或oracle属性)。
您可以将glmnet用于自适应LASSO。首先,您需要一个初始估计值,即最小二乘法,岭估计值,甚至是LASSO估计值,才能计算权重。然后,您可以通过缩放X矩阵来实现自适应LASSO。这是一个在训练数据上使用最小二乘方初始估计的示例:
# get data
y <- train[, 11]
x <- train[, -11]
x <- as.matrix(x)
n <- nrow(x)
# standardize data
ymean <- mean(y)
y <- y-mean(y)
xmean <- colMeans(x)
xnorm <- sqrt(n-1)*apply(x,2,sd)
x <- scale(x, center = xmean, scale = xnorm)
# fit ols
lm.fit <- lm(y ~ x)
beta.init <- coef(lm.fit)[-1] # exclude 0 intercept
# calculate weights
w <- abs(beta.init)
x2 <- scale(x, center=FALSE, scale=1/w)
# fit adaptive lasso
require(glmnet)
lasso.fit <- cv.glmnet(x2, y, family = "gaussian", alpha = 1, standardize = FALSE, nfolds = 10)
beta <- predict(lasso.fit, x2, type="coefficients", s="lambda.min")[-1]
# calculate estimates
beta <- beta * w / xnorm # back to original scale
beta <- matrix(beta, nrow=1)
xmean <- matrix(xmean, nrow=10)
b0 <- apply(beta, 1, function(a) ymean - a %*% xmean) # intercept
coef <- cbind(b0, beta)