套索回归,没有变量被丢弃
Lasso regression, no variable was dropped
我在 R 中对二元响应变量执行套索回归。
我正在使用 cv.glmnet
寻找最佳 lambda,并使用 glmnet
检查最佳 lambda 情况的系数。调用这两个函数时,我指定 standardize =TRUE
和 alpha = 1
。
我的案例中有大约 40 个变量,我确信其中一些变量与散点图和 vif
(当我对相同数据执行逻辑回归时)彼此密切相关。
我从套索回归中得到的最佳 lambda 小于 0.001,并且在最佳模型中没有丢弃任何变量(其中 lambda = 最佳 lambda)。
想知道为什么没有删除变量。
基本上是因为你的lambda
值太小了。 lambda<0.001
表示你的惩罚很小,真的一点都不重要。看看这个 "stupid" 例子:
让我们生成一些样本随机数据。请注意,变量 z
和 z1
是强相关的。
library(glmnet)
z<-rnorm(100)
data<-data.frame(y=3+rnorm(100),x1=rnorm(100),x2=rnorm(100),x3=rnorm(100),x4=rnorm(100),x5=rnorm(100),
x6=rnorm(100),x7=rnorm(100),x8=rnorm(100),x9=rnorm(100),x10=rnorm(100),z=z,z1=z+rnorm(100,0,0.3))
现在运行部分型号:
gl<-glmnet(y=data$y,x=as.matrix(data[,-1]),alpha = 1)
plot(gl,xvar="lambda")
lambda
等于 0.001
表示 log(lambda)=-6.907755
甚至在这个 "stupid" 示例中我们可以认为系数不会显着(因此值应该相等到 0
) 我们将得到小但非零的值(如图中所示)。
glmnet
和 lambda=0.001
的系数与 glm
的系数非常相似(就像我说的,小 lambda
等于对数似然没有惩罚):
gl1<-glmnet(y=data$y,x=as.matrix(data[,-1]),alpha = 1,lambda=0.001)
gl2<-glm(data=data,formula=y~x1+x2+x3+x4+x5+x6+x7+x8+x9+x10+z+z1)
gl1$beta
# x1 -0.10985215
# x2 -0.12337595
# x3 0.06088970
# x4 -0.12714515
# x5 -0.12237959
# x6 -0.01439966
# x7 0.02037826
# x8 0.22288055
# x9 -0.10131195
# x10 -0.04268274
# z -0.04526606
# z1 0.04628616
gl3$coefficients
(Intercept) x1 x2 x3 x4 x5 x6
2.98542594 -0.11104062 -0.12478162 0.06293879 -0.12833484 -0.12385855 -0.01556657
x7 x8 x9 x10 z z1
0.02071605 0.22408006 -0.10195640 -0.04419441 -0.04602251 0.04513612
现在看看这两种方法的系数有什么不同:
as.vector(gl1$beta)-as.vector(gl2$coefficients)[-1]
# [1] 0.0011884697 0.0014056731 -0.0020490872 0.0011896872 0.0014789566 0.0011669064
# [7] -0.0003377824 -0.0011995019 0.0006444471 0.0015116774 0.0007564556 0.00115004
我在 R 中对二元响应变量执行套索回归。
我正在使用 cv.glmnet
寻找最佳 lambda,并使用 glmnet
检查最佳 lambda 情况的系数。调用这两个函数时,我指定 standardize =TRUE
和 alpha = 1
。
我的案例中有大约 40 个变量,我确信其中一些变量与散点图和 vif
(当我对相同数据执行逻辑回归时)彼此密切相关。
我从套索回归中得到的最佳 lambda 小于 0.001,并且在最佳模型中没有丢弃任何变量(其中 lambda = 最佳 lambda)。
想知道为什么没有删除变量。
基本上是因为你的lambda
值太小了。 lambda<0.001
表示你的惩罚很小,真的一点都不重要。看看这个 "stupid" 例子:
让我们生成一些样本随机数据。请注意,变量 z
和 z1
是强相关的。
library(glmnet)
z<-rnorm(100)
data<-data.frame(y=3+rnorm(100),x1=rnorm(100),x2=rnorm(100),x3=rnorm(100),x4=rnorm(100),x5=rnorm(100),
x6=rnorm(100),x7=rnorm(100),x8=rnorm(100),x9=rnorm(100),x10=rnorm(100),z=z,z1=z+rnorm(100,0,0.3))
现在运行部分型号:
gl<-glmnet(y=data$y,x=as.matrix(data[,-1]),alpha = 1)
plot(gl,xvar="lambda")
lambda
等于 0.001
表示 log(lambda)=-6.907755
甚至在这个 "stupid" 示例中我们可以认为系数不会显着(因此值应该相等到 0
) 我们将得到小但非零的值(如图中所示)。
glmnet
和 lambda=0.001
的系数与 glm
的系数非常相似(就像我说的,小 lambda
等于对数似然没有惩罚):
gl1<-glmnet(y=data$y,x=as.matrix(data[,-1]),alpha = 1,lambda=0.001)
gl2<-glm(data=data,formula=y~x1+x2+x3+x4+x5+x6+x7+x8+x9+x10+z+z1)
gl1$beta
# x1 -0.10985215
# x2 -0.12337595
# x3 0.06088970
# x4 -0.12714515
# x5 -0.12237959
# x6 -0.01439966
# x7 0.02037826
# x8 0.22288055
# x9 -0.10131195
# x10 -0.04268274
# z -0.04526606
# z1 0.04628616
gl3$coefficients
(Intercept) x1 x2 x3 x4 x5 x6
2.98542594 -0.11104062 -0.12478162 0.06293879 -0.12833484 -0.12385855 -0.01556657
x7 x8 x9 x10 z z1
0.02071605 0.22408006 -0.10195640 -0.04419441 -0.04602251 0.04513612
现在看看这两种方法的系数有什么不同:
as.vector(gl1$beta)-as.vector(gl2$coefficients)[-1]
# [1] 0.0011884697 0.0014056731 -0.0020490872 0.0011896872 0.0014789566 0.0011669064
# [7] -0.0003377824 -0.0011995019 0.0006444471 0.0015116774 0.0007564556 0.00115004