我想使用限制截距的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
我还尝试通过创建1s列来手动拟合截距,但随后该模型根本不适合截距:
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 is different with intercept=TRUE compared to intercept=FALSE and with penalty.factor=0 for an intercept in x)(How to regularize the intercept with glmnet)进行正则化/居中,但是我不希望将截距“固定”为一个常数,只是在拟合期间限制在上限和下限内。