如果你检查这些two https://stats.stackexchange.com/questions/56730/cannot-reproduce-ols-result-using-lasso-with-lambda-0 posts https://stackoverflow.com/questions/38378118/lasso-with-lambda-0-and-ols-produce-different-results-in-r-glmnet,您就会明白为什么没有得到相同的结果。
在本质上,glmnet
使用正则化路径来惩罚最大似然来估计模型。lm
使用 QR 分解解决最小二乘问题。因此,估计值永远不会完全相同。
但是,请注意手册中的?glmnet
在“拉姆达”下:
警告:小心使用。不要为 lambda 提供单个值(对于
CV 后的预测使用 Predict() 代替)。供应代替
lambda 值的递减序列。 glmnet 依靠它的温暖
开始是为了速度,并且通常比适应整个路径更快
计算单个拟合。
您可以(至少)做三件事来使系数更接近,这样差异就微不足道了 - (1) 有一个值范围lambda
,(2)降低阈值thres
,(3)增加最大迭代次数。
library(glmnet)
options(scipen = 999)
X = model.matrix(mpg ~ 0 + ., data = mtcars)
y = as.matrix(mtcars["mpg"])
lfit <- glmnet(X, y, lambda = rev(0:99), thres = 1E-10)
lmfit <- lm(y ~ X)
coef(lfit, s = 0) - coef(lmfit)
11 x 1 Matrix of class "dgeMatrix"
1
(Intercept) 0.004293053125
cyl -0.000361655351
disp -0.000002631747
hp 0.000006447138
drat -0.000065394578
wt 0.000180943607
qsec -0.000079480187
vs -0.000462099248
am -0.000248796353
gear -0.000222035415
carb -0.000071164178
X = model.matrix(mpg ~ 0 + . + . * disp, data = mtcars)
y = as.matrix(mtcars["mpg"])
lfit <- glmnet(X, y, lambda = rev(0:99), thres = 1E-12, maxit = 10^7)
lmfit <- glm(y ~ X)
coef(lfit, s = 0) - coef(lmfit)
20 x 1 Matrix of class "dgeMatrix"
1
(Intercept) -0.3174019115228
cyl 0.0414909318817
disp 0.0020032493403
hp 0.0001834076765
drat 0.0188376047769
wt -0.0120601219002
qsec 0.0019991131315
vs 0.0636756040430
am 0.0439343002375
gear -0.0161102501755
carb -0.0088921918062
cyl:disp -0.0002714213271
disp:hp -0.0000001211365
disp:drat -0.0000859742667
disp:wt 0.0000462418947
disp:qsec -0.0000175276420
disp:vs -0.0004657059892
disp:am -0.0003517289096
disp:gear 0.0001629963377
disp:carb 0.0000085312911
交互模型的一些差异可能很重要,但更接近。