为什么R语言中的grpreg库和gglasso库在进行分组LASSO时会产生不同的结果?

5
我一直在尝试使用LASSO进行无监督特征选择(通过删除类列)。数据集包括分类(因子)和连续(数值)变量。这里是链接。我使用model.matrix()构建了一个设计矩阵,为每个分类变量的级别创建虚拟变量。
dataset <- read.xlsx("./hepatitis.data.xlsx", sheet = "hepatitis", na.strings = "")
names_df <- names(dataset)
formula_LASSO <- as.formula(paste("~ 0 +", paste(names_df, collapse = " + ")))
LASSO_df <- model.matrix(object = formula_LASSO, data = dataset, contrasts.arg = lapply(dataset[ ,sapply(dataset, is.factor)], contrasts, contrasts = FALSE ))

### Group LASSO using gglasso package
gglasso_group <- c(1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 15, 16, 17, 17)
fit <- gglasso(x = LASSO_df, y = y_k, group = gglasso_group, loss = "ls", intercept = FALSE, nlambda = 100)
# Cross validation
fit.cv <- cv.gglasso(x = LASSO_df, y = y_k, group = gglasso_group, nfolds = 10)
# Best lambda
best_lambda_fit.cv <- fit.cv$lambda.1se
# Final coefficients of variables
coefs = coef.gglasso(object = fit, s = best_lambda_fit.cv)

### Group LASSO with grpreg package
group_lasso <- grpreg(X = LASSO_df, y = y_k, group = gglasso_group, penalty = "grLasso")
plot(group_lasso)
cv_group_lasso <- cv.grpreg(X = LASSO_df, y = y_k, group = gglasso_group, penalty = "grLasso", se = "quick")
# Best lambda
best_lambda_group_lasso <- cv_group_lasso$lambda.min
coef_mat_group_lasso <- as.matrix(coef(cv_group_lasso))

如果您检查 coefscoef_mat_group_lasso,您会发现它们并不相同。此外,最佳的 lambda 值也不相同。我不确定哪一个适合用于特征选择。
有没有办法在 grpreg() 函数中去除截距? intercept = FALSE 没有生效。
感谢您提供的任何帮助。提前致谢。
1个回答

2
请参考gglasso论文grpreg论文。在grpreg论文第175页上,作者进行了称为组标准化的步骤,该步骤通过右乘正交矩阵和非负对角线矩阵来归一化每个组中的特征矩阵。经过组套索步骤和组标准化后,估计的系数被左乘相同的矩阵,以便获得原始线性模型的系数。然而,这样做会导致组套索惩罚与不进行组标准化的惩罚不等价。详细讨论请参见第175页。 grpreg使用块坐标下降算法,而gglasso使用一种称为组逐步主导下降的算法。当算法不同时,自然会看到小的数值差异。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接