Я хотел бы подобрать модель с использованием 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 ), но я не хочу, чтобы перехват был «зафиксирован» на константе, просто ограниченной во время подгонки в пределах нижнего и верхнего предела.