3

glmnet と glm を比較しているときに、lambda=0 と family="poisson" の収束の問題に遭遇しました。私の理解では、ラムダ= 0(およびデフォルトのアルファ= 1)では、答えは本質的に同じであるはずです。

以下は、glmnet ヘルプ ページ (?glmnet) の poisson の例からわずかに変更されたコードです。唯一の変更点は、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 によって推定されるインターセプトにあり、ラムダ自体の設定には関係ないようです。

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

ラムダとアルファについて混乱していると思います。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 に渡そうとすると、エラーが発生します。ラムダ = 0 の glmnet から係数を選択する場合は、次を使用できます。

coef(fit, s=0)

これにより、ラムダの最後の (最小の) 値が自動的に選択されます。基本的にはすでにそれを行っていると思いますが、s = min(fit$lambda). それよりもさらに小さくしたい場合は、手動でラムダ シーケンスを挿入する必要があるかもしれませんが、これは少し注意が必要です (glmnet はラムダについて少し頑固なようです)。

また、glmnet には多少の偏りがある可能性があるため、glm の結果とは若干異なる場合があることに注意してください。

于 2017-01-30T09:17:26.183 に答える