如何限制glmnet中的拦截

时间:2019-01-23 09:39:15

标签: r glmnet

我想使用限制截距的glmnet(或cv.glmnet)拟合模型。据我所知,lower.limitsupper.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)进行正则化/居中,但是我不希望将截距“固定”为一个常数,只是在拟合期间限制在上限和下限内。

0 个答案:

没有答案