2015-12-18 2 views
1

Я выполняю регрессию lasso в R для переменной двоичного ответа.Lasso регрессия, переменная не была удалена

Я использую cv.glmnet, чтобы найти наилучшую лямбду и использовать glmnet, чтобы проверить коэффициенты для лучшего лямбда-чехла. При вызове обеих функций я указываю standardize =TRUE и alpha = 1.

У меня около 40 переменных в моем случае, и я уверен, что некоторые из них сильно коррелированы друг с другом от диаграмм рассеяния и vif (когда я выполнял логистическую регрессию по тем же данным).

Лучшая лямбда, которую я получил от моей регрессии лассо, составляет < 0,001, и никакая переменная не падает в лучшей модели (с лямбдой = лучшая лямбда).

Удивление, почему переменная не была удалена.

+0

Можете ли вы опубликовать воспроизводимый пример? сколько наблюдений? – sahir

+0

@sahir. К сожалению, я не мог привести пример, который может воспроизвести ситуацию. У меня около 2000 наблюдений. Я, наконец, заканчиваю использование логистической регрессии и SVM, потому что замечаю, что даже я вручную контролирую уровень лямбда (чтобы он был больше), переменные кадровой регрессии Lasso произвольны. – Rwitch

ответ

1

В основном это потому, что ваше значение lambda слишком мало. lambda<0.001 означает, что ваш штраф настолько мал, что это действительно не имеет значения. Посмотрите на этот «глупый» пример:

Давайте сгенерируем выборочные случайные данные. Обратите внимание, что переменная 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") 

enter image description here

lambda равно 0.001 означает log(lambda)=-6.907755 и даже в этой "глупой" пример, где мы могли бы думать, что коэффициенты не будут значительными (поэтому значения должны быть равны 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