【问题标题】:Lack of convergence of glmnet when lambda=0 for family="poisson"当 family="poisson" 的 lambda=0 时,glmnet 缺乏收敛性
【发布时间】:2013-10-20 00:04:57
【问题描述】:

在处理 glmnet 与 glm 时,我遇到了 lambda=0 和 family="poisson" 的收敛问题。我的理解是,当 lambda=0(和 alpha=1,默认值)时,答案应该基本相同。

下面的代码与 glmnet 帮助页面 (?glmnet) 上的泊松示例略有不同。唯一的变化是 nzc = p 使得所有变量都在真实模型中

N=1000; p=50
nzc=p
x=matrix(rnorm(N*p),N,p)
beta=rnorm(nzc)
f = x[,seq(nzc)]%*%beta
mu=exp(f)
y=rpois(N,mu)

#With lambda=0 glmnet throws the convergence error shown below
fit=glmnet(x,y,family="poisson",lambda=0)

#It works with default lambda passed in
# but estimates are quite different from glm.
fit=glmnet(x,y,family="poisson") #use default lambdas
fit2=glm(y~x,family="poisson")
plot(coef(fit2)[2:(p+1)], 
     coef(fit,s=min(fit$lambda))[2:(p+1)],
     xlab="glm",ylab="glmnet")
abline(0,1)

#works fine with gaussian response and lambda=0 or default lambda
#glm and glmnet identical
mu = f
y=rnorm(N,mu)
fit=glmnet(x,y,family="gaussian",lambda=0)
fit2=glm(y~x)
plot(coef(fit2)[2:(p+1)], coef(fit)[2:(p+1)])
abline(0,1)

这是错误信息

Warning messages:
1: from glmnet Fortran code (error code -1); Convergence for 1th lambda value not reached after maxit=100000 iterations; solutions for larger lambdas returned 
2: In getcoef(fit, nvars, nx, vnames) :an empty model has been returned; probably a convergence issue

更新: 问题似乎在于 glmnet 在 family="poisson" 时估计的截距,与 lambda 本身的设置无关。

fit=glmnet(x,y,family="poisson")
#intercept should be close to 0
coef(fit)[1,]
#but it is huge
#passing in intercept=FALSE however generates the convergence error again
fit=glmnet(x,y,family="poisson", intercept=FALSE)

【问题讨论】:

    标签: r bigdata glm poisson glmnet


    【解决方案1】:

    我认为您对 lambda 和 alpha 感到困惑。 alpha 是设置为 0 的惩罚因子,将为您提供岭回归。通常将其设置为 0.1 和 1 之间的值。lambda 通常未设置,帮助页面上有一条警告不要将其设置为单个值:

    WARNING: use with care. Do not supply a single value for lambda
    

    我不知道您为什么认为套索惩罚应该与未惩罚的泊松模型相同。惩罚模型的重点是减少普通回归模型的偏差和约束。

    【讨论】:

    • 我对 lambda 和 alpha 并不感到困惑,我知道您引用的警告。 Hastie 关于 glmnet 的信息表明,设置 alpha=1 和 lambda=0,应该返回与 glm 相同的值。它适用于家庭=“高斯”。我认为问题与截距的估计有关,与 lambda 本身无关。我只是在设置 lambda=0 时碰巧看到了问题。
    • 抱歉,信息重新设置 lambda=0 以获取 OLS 解决方案不是来自 Hastie。我在 glmnet 的讨论中看到过几次提到它——但实际上不是来自 Hastie。
    • @EliHolmes 您在哪里看到这些 cmets?我有兴趣阅读它们。
    【解决方案2】:

    您收到错误是因为您尝试将 lambda = 0 传递给 glmnet。 如果你想从 glmnet 中选择 lambda = 0 的系数,你可以使用:

    coef(fit, s=0)
    

    这会自动选择 lambda 的最后一个(最小)值。我猜你基本上已经用s = min(fit$lambda) 做到了。如果你想变得更小,你可能不得不手动放入一个 lambda 序列,但这有点棘手(glmnet 似乎对它的 lambda 有点固执)。

    另外请记住,glmnet 中可能存在一些偏差,因此它可能与 glm 的结果略有不同。

    【讨论】:

      猜你喜欢
      • 2019-09-01
      • 1970-01-01
      • 2015-11-18
      • 2017-05-27
      • 2021-12-13
      • 2012-06-12
      • 2021-11-21
      • 2012-01-07
      • 2021-05-12
      相关资源
      最近更新 更多