デフォルトの (0,0) 開始点以外の場所から開始すると、答えを得ることができます。パラメーターは、リンク関数のstartスケールで、応答の切片と勾配を含むベクトルです。Rが報告している問題は、通常、計算された(負の)対数尤度が開始値に対して無限になることです。これは自分で確認できます: -sum(dpois(bar,0+0*foo,log=TRUE))is Inf(ゼロ平均でポアソンを設定しているが、ゼロ以外の応答が得られるため)。
ただし、これは完全な説明ではありません。(0,2) のような負の対数尤度の開始が有限 (-sum(dpois(bar,0+2*foo,log=TRUE))約 20) のようないくつかの開始点でも、同じエラーが発生するためです。掘り下げる必要があります。何が問題なのかを詳しく見ていきますが、たとえば、コードではゼロのポアソン平均がまったく許可されていないことを想像できます。ポアソンの対数尤度は (一定のプラス)x*log(lambda)-lambdaです。lambdaとxが両方ともゼロの場合、これはうまくいきますが、数学では必ずしも明らかではありません。特に、ポアソンの計算された平均のセットが OK かどうかを確立するために使用するpoisson()$validmu関数であるを見ると、その定義が であることがわかります。(これを変更して、glmfunction (mu) { all(mu > 0) }mu、しかし、そうするのに十分な理由が必要になるのは十分な問題です-私はそれを試しましたが、分散がゼロに等しくなるように計算されるため、別の問題があります。要するに、カスタムの最尤推定器 (例: bbmle::mle2()) を使ってこれを行う方が、ハッキングglmして行うよりも簡単です ...)
ただし、ポアソン平均のゼロ推定値がない開始点は問題なく機能しますが、多くの警告があります。
glm(bar ~ foo, family = poisson(link = "identity"), start=c(1,0))
ただし、リンク機能の目的を誤解していることを指摘したいと思います。標準のログ リンクがある場合でも、ポアソン回帰の応答変数にゼロがあっても問題ありません。ポアソン回帰の GLM モデルは でありy ~ Poisson(exp(a+b*x))、 ではありませんlog(y) = a + b*x。なら後者はダメですy=0が、前者は全然OKです。glm(bar ~ foo, family = poisson())うまく動作します。
一般に、非標準的なリンク関数は少し面倒です: それらは時々まさにあなたが必要としているものです (ただし、あなたが言ったことから、これがあなたの場合に当てはまるとは確信していません)。正規のリンクよりも面倒で、合わせるのが難しいです。
最後に 1 つ: 私はおそらく、あなたが望むものを「非正規」または「非標準」リンクと呼ぶでしょう。私にとって、カスタム リンク関数は、R のコマンドによって提供されないものになるため、family()リンク関数を自分で作成する必要がありました (たとえば、http://rpubs.com/bbolker/4082を参照) 。