3

在处理 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

更新:问题似乎与当 family="poisson" 时 glmnet 估计的截距有关,并且与 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)
4

2 回答 2

1

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

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

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

于 2013-10-11T21:24:50.250 回答
0

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

coef(fit, s=0)

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

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

于 2017-01-30T09:17:26.183 回答