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
做起来真的很奇怪。如果您想更改系数以用于预测目的,您可以随时提取系数,更改它们并再次与数据矩阵相乘。
我知道如何从 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
做起来真的很奇怪。如果您想更改系数以用于预测目的,您可以随时提取系数,更改它们并再次与数据矩阵相乘。