2013-02-17 65 views
4

我不想使用glm中的標準日誌鏈接進行泊松迴歸,因爲我有零。請看下面的代碼:如何在glm中使用自定義鏈接功能?

foo = 0:10 
bar = 2 * foo 
glm(bar ~ foo, family = poisson(link = "identity")) 

我得到的錯誤:

Error: no valid set of coefficients has been found: please supply starting values

我不能確定這是什麼意思。我認爲它是「身份」鏈接功能(即它根本不轉換數據)?這個錯誤意味着什麼,我該如何解決它?

回答

7

如果您從默認(0,0)起點以外的地方開始,則可以獲得答案。參數start是一個包含響應截距和斜率的矢量,在鏈接函數的尺度上。 R報告的問題通常是計算的(負)對數似然性對於起始值變得無限。你可以自己檢查一下:-sum(dpois(bar,0+0*foo,log=TRUE))Inf(因爲我們設置了一個零均值的泊松,但得到一個非零的響應)。

但是,這並不是一個完整的解釋,因爲即使對於起始負對數似然性是有限的(0,2)的某些起始點(-sum(dpois(bar,0+2*foo,log=TRUE))約爲20),也會出現相同的錯誤 - 一個必須深入挖掘才能看出問題所在,但我可以想象,例如代碼中根本不允許泊松均值爲零。泊松的對數似然是(一個常數加上)x*log(lambda)-lambda:儘管如果lambdax都爲零,那麼這個結果仍然可以,但這在數學中並不總是顯而易見的。特別是,如果您查看poisson()$validmu,這是glm用於確定Poisson的一組計算方法是否正常的函數,您會看到它的定義是function (mu) { all(mu > 0) }。 (可以修改這個以允許mu爲零值,但這樣做會有足夠的麻煩,因爲您需要一個很好的理由來這麼做 - 我試過了,還有另一個問題,因爲差異計算爲零。簡而言之,通過自定義最大似然估計器(例如bbmle::mle2())來做到這一點要比破解glm做到這一點更容易......)

但是,沒有零泊松估計的起點意思是精品了,雖然有很多的警告:

glm(bar ~ foo, family = poisson(link = "identity"), start=c(1,0)) 

然而:我想指出THA你誤解了鏈接功能的目的。在Poisson迴歸的響應變量中有零,即使使用標準的日誌鏈接也是可以的。用於泊松迴歸的GLM模型是y ~ Poisson(exp(a+b*x)),而不是log(y) = a + b*x。後者是壞的,如果y=0,但前者是完全正常的。 glm(bar ~ foo, family = poisson())工作得很好。

一般來說,非規範鏈接函數有點痛苦:它們有時正是你所需要的(雖然從你所說的我不相信這是你的情況),但是他們往往比規範鏈接更加困難和困難。

最後一個注意事項:我可能會將您想要的作爲一個「非規範」或「非標準」鏈接;一個定製鏈接功能,對我來說,將是一個不被R中的family()命令提供的,所以你必須自己編寫鏈接功能(例如,見http://rpubs.com/bbolker/4082

+1

好吧,我想我的問題是,在誤解鏈接功能甚至意味着什麼。我會研究更多,也許會問一個不同的問題。 – Xodarap 2013-02-17 16:49:25