R 中 cv.glmnet 拟合回归的变化系数

Change coefficient of cv.glmnet fitted regression in R

我知道如何从 cv.glmnet 中“提取”系数。但是有没有办法改变拟合对象的系数呢?我知道这有点 hack,但我想手动调整拟合对象的系数只是为了我自己的实验。

Extracting coefficient variable names from glmnet into a data.frame

glmnet 的系数存储在 $glmnet.fit$beta 下:

library(glmnet)
library(Matrix)

fit = cv.glmnet(x=as.matrix(mtcars[,-1]),y=mtcars[,1])

head(fit$glmnet.fit$beta)
6 x 79 sparse Matrix of class "dgCMatrix"
   [[ suppressing 79 column names ‘s0’, ‘s1’, ‘s2’ ... ]]
                                                                        
cyl  . -0.01192151 -0.1447790 -0.2658654 -0.376195 -0.4770942 -0.5686616
disp .  .           .          .          .         .          .        
hp   .  .           .          .          .         .          .        
drat .  .           .          .          .         .          .        
wt   . -0.45776130 -0.7006176 -0.9218541 -1.123436 -1.3065806 -1.4739808
qsec .  .           .          .          .         .          .        

它是每个测试的 lambda 的一列,当您调用 coefficients() 时,默认情况下您会拉出对应于 fit$lambda.1se 的列。假设我们要更改该列:

coefficients(fit,s=fit$lambda.1se)

11 x 1 sparse Matrix of class "dgCMatrix"
                       1
(Intercept) 33.940487806
cyl         -0.843038418
disp         .          
hp          -0.006965929
drat         .          
wt          -2.365917424
qsec         .          
vs           .          
am           .          
gear         .          
carb         .       

wh = which(fit$lambda==fit$lambda.1se)
fit$glmnet.fit$beta[,wh] = runif(nrow(fit$glmnet.fit$beta))

coefficients(fit,s=fit$lambda.1se)

11 x 1 sparse Matrix of class "dgCMatrix"
                      1
(Intercept) 33.94048781
cyl          0.45636267
disp         0.28286532
hp           0.04186184
drat         0.55084730
wt           0.35273817
qsec         0.96165338
vs           0.79227125
am           0.01036681
gear         0.47738589
carb         0.17170791

其他列和截距不变:

11 x 1 sparse Matrix of class "dgCMatrix"
                      1
(Intercept) 36.38102033
cyl         -0.87610600
disp         .         
hp          -0.01377978
drat         .         
wt          -2.75934250
qsec         .         
vs           .         
am           0.16806977
gear         .         
carb        -0.01384960

做起来真的很奇怪。如果您想更改系数以用于预测目的,您可以随时提取系数,更改它们并再次与数据矩阵相乘。