glmnet:提取标准化系数

Bjö*_*ter 4 r glmnet

我正在使用函数运行回归模型cv.glmnet()。该参数standardize = TRUE在拟合模型之前对所有 x 变量(预测变量)进行标准化。但是,系数始终按输出/结果的原始比例返回。有没有办法接收输出的标准化系数(β权重),以便系数具有可比性?

Stu*_*olf 6

当您标准化或缩放时,您会执行 (x - 平均值 (x))/sd(x)。当对此进行回归时,中心部分 (-mean(x)) 进入截距,因此只有标准偏差影响您的系数。

要从未缩放系数变为缩放系数,您可以乘以标准差。

我们可以检查这一点,首先是缩放 x 变量的回归:

scaled_mt = mtcars
scaled_mt[,-1] = scale(scaled_mt[,-1])
fit_scaled = lm(mpg ~ .,data=scaled_mt)
Run Code Online (Sandbox Code Playgroud)

对原始数据的回归:

fit = lm(mpg ~ .,data=mtcars)
Run Code Online (Sandbox Code Playgroud)

在 glmnet 中,我设置了非常低的 lambda 以包含所有术语:

fit_lasso = cv.glmnet(y=as.matrix(mtcars[,1]),x=as.matrix(mtcars)[,-1],lambda=c(0.0001,0.00001))
Run Code Online (Sandbox Code Playgroud)

所有 x 变量的标准差:

AllSD = apply(mtcars[,-1],2,sd)
Run Code Online (Sandbox Code Playgroud)

为了证明转换没问题:

cbind(scaled=coefficients(fit_scaled)[-1],
from_lm = coefficients(fit)[-1]*allSD,
from_glmnet = coefficients(fit_lasso)[-1]*allSD)

         scaled    from_lm from_glmnet
cyl  -0.1990240 -0.1990240  -0.1762826
disp  1.6527522  1.6527522   1.6167872
hp   -1.4728757 -1.4728757  -1.4677513
drat  0.4208515  0.4208515   0.4268243
wt   -3.6352668 -3.6352668  -3.6071975
qsec  1.4671532  1.4671532   1.4601126
vs    0.1601576  0.1601576   0.1615794
am    1.2575703  1.2575703   1.2563485
gear  0.4835664  0.4835664   0.4922507
carb -0.3221020 -0.3221020  -0.3412025
Run Code Online (Sandbox Code Playgroud)

但请注意,这并不一定会使它们具有可比性,因为它们是按标准差缩放的。缩放的更重要目的是将它们居中,这样您就可以更轻松地解释积极或消极的关系。