在 R 中,“glmnet”是否适合截距?

机器算法验证 r 回归 套索
2022-03-08 20:38:49

我正在使用 R 在 R 中拟合线性模型glmnet原始(非正则化)模型是使用拟合的,lm并且没有常数项(即它的形式为lm(y~0+x1+x2,data))。

glmnet采用预测变量矩阵和响应向量。我一直在阅读glmnet文档,但找不到关于常数项的内容。

那么,有没有办法要求glmnet通过原点强制线性拟合?

1个回答

是的, glmnet模型中包含截距,但它没有被正则化(参见通过坐标下降的广义线性模型的正则化路径,第 13 页)。通过仔细查看代码当然可以获得有关实现的更多细节(对于高斯族,它是由elnet()调用的函数glmnet()),但它是在 Fortran 中的。

您可以尝试使用惩罚包,它允许通过传递unpenalized = ~0给来删除拦截penalized()

> x <- matrix(rnorm(100*20),100,20)
> y <- rnorm(100)
> fit1 <- penalized(y, penalized=x, unpenalized=~0, 
                    standardize=TRUE) 
> fit2 <- lm(y ~ 0+x)
> plot((coef(fit1) + coef(fit2))/2, coef(fit2)-coef(fit1))

要获得 Lasso 正则化,您可以尝试类似

> fit1b <- penalized(y, penalized=x, unpenalized=~0, 
                     standardize=TRUE, lambda1=1, steps=20)
> show(fit1b)
> plotpath(fit1b)

如下图所示,使用两种方法计算的回归参数之间几乎没有差异(左),您可以非常轻松地绘制 Lasso 路径解(右)。

替代文字