具有glmnet和lm的普通最小二乘法

时间:2017-02-23 01:19:41

标签: r lm least-squares glmnet

stackoverflow.com/q/38378118中提出了这个问题,但没有令人满意的答案。

LASSO与λ= 0相当于普通最小二乘法,但对于R中的glmnet()lm(),情况似乎并非如此?

library(glmnet)
options(scipen = 999)

X = model.matrix(mpg ~ 0 + ., data = mtcars)
y = as.matrix(mtcars["mpg"])
coef(glmnet(X, y, lambda = 0))
lm(y ~ X)

他们的回归系数最多同意2个有效数字,可能是由于优化算法的终止条件略有不同:

                  glmnet        lm
(Intercept)  12.19850081  12.30337
cyl          -0.09882217  -0.11144
disp          0.01307841   0.01334
hp           -0.02142912  -0.02148
drat          0.79812453   0.78711
wt           -3.68926778  -3.71530
qsec          0.81769993   0.82104
vs            0.32109677   0.31776
am            2.51824708   2.52023
gear          0.66755681   0.65541
carb         -0.21040602  -0.19942

当我们添加互动条款时,差异会更大。

X = model.matrix(mpg ~ 0 + . + . * disp, data = mtcars)
y = as.matrix(mtcars["mpg"])
coef(glmnet(X, y, lambda = 0))
lm(y ~ X)

回归系数:

                     glmnet           lm
(Intercept)   36.2518682237  139.9814651
cyl          -11.9551206007  -26.0246050
disp          -0.2871942149   -0.9463428
hp            -0.1974440651   -0.2620506
drat          -4.0209186383  -10.2504428
wt             1.3612184380    5.4853015
qsec           2.3549189212    1.7690334
vs           -25.7384282290  -47.5193122
am           -31.2845893123  -47.4801206
gear          21.1818220135   27.3869365
carb           4.3160891408    7.3669904
cyl:disp       0.0980253873    0.1907523
disp:hp        0.0006066105    0.0006556
disp:drat      0.0040336452    0.0321768
disp:wt       -0.0074546428   -0.0228644
disp:qsec     -0.0077317305   -0.0023756
disp:vs        0.2033046078    0.3636240
disp:am        0.2474491353    0.3762699
disp:gear     -0.1361486900   -0.1963693
disp:carb     -0.0156863933   -0.0188304

1 个答案:

答案 0 :(得分:4)

如果您查看这些two posts,您就会明白为什么没有得到相同的结果。

实质上,glmnet使用正则化路径来估计模型,从而惩罚最大似然。 lm使用QR分解解决最小二乘问题。所以估计值永远不会完全相同。

但是,请注意“lambda”下的?glmnet手册:

  

警告:小心使用。不要为lambda提供单个值(for   CV使用后预测(而不是)。供应而不是   减少λ值的序列。 glmnet依赖于它的温暖   从速度开始,它通常比整个路径更快   计算单一的契合度。

你可以做(​​至少)三件事来使系数更接近,所以差异是微不足道的 - (1)有lambda的值范围,(2)降低阈值{{1} },以及(3)增加最大迭代次数。

thres
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

相互作用模型的一些差异可能是非平凡的,但更接近。