Как ограничить перехват в glmnet - PullRequest
0 голосов
/ 23 января 2019

Я хотел бы подобрать модель с использованием glmnet (или cv.glmnet), которая ограничивает перехват. Насколько я могу судить, опции lower.limits и upper.limits влияют только на непостоянные коэффициенты:

library(glmnet)
library(Matrix)
fit.glmnet.intercept.nolimits=glmnet(
    x=as.matrix(iris[,1:3]),y=iris[,4]
    ,alpha=0
    ,intercept=TRUE
)
summ=summary(coef(fit.glmnet.intercept.nolimits))
c(min(summ[summ$i==1,]$x),max(summ[summ$i==1,]$x))
# -0.6992553  1.1993333

fit.glmnet.intercept.limits=glmnet(
    x=as.matrix(iris[,1:3]),y=iris[,4]
    ,lower.limits=-.25
    ,upper.limits=.25
    ,alpha=0
    ,intercept=TRUE
)
summ2=summary(coef(fit.glmnet.intercept.limits))
c(min(summ2[summ2$i==1,]$x),max(summ2[summ2$i==1,]$x))
# -0.7883313  1.1993333

Я также попытался установить пересечение вручную, создав столбец 1 с, но тогда модель вообще не соответствовала перехвату:

fit.glmnet.manualintercept=glmnet(
    x=as.matrix(cbind(iris[,1:3],1)),y=iris[,4]
    #,lower.limits=-.25
    #,upper.limits=.25
    ,alpha=0
    ,intercept=FALSE
)
coef(fit.glmnet.manualintercept)

В некотором роде я видел несколько других постов о регуляризации / центрировании регрессоров ( Glmnet отличается от intercept = TRUE по сравнению с intercept = FALSE и штрафом .factor = 0 для перехвата в x ) ( Как упорядочить перехват с помощью glmnet ), но я не хочу, чтобы перехват был «зафиксирован» на константе, просто ограниченной во время подгонки в пределах нижнего и верхнего предела.

...