2011-11-21 6 views
3

我想運行一個帶日誌鏈接和偏移量的高斯GLM。 會出現以下問題:glm的起始值不被接受log-link

y <- c(1,1,0,0) 
t <- c(5,3,2,4) 

沒有問題:

exp(coef(glm(y~1 + offset(log(t)), family=poisson))) 

family=gaussian,起始值需要指定,它在這裏工作:

exp(coef(glm(y~1, family=gaussian(link=log), start=0))) 

,但不會在這裏工作:

exp(coef(glm(y~1 + offset(log(t)), family=gaussian(link=log), start=0))) 

錯誤的eval(表達式,ENVIR,enclos):找不到有效的初始值:請註明一些」

有誰看到(在我的編碼希望只)是怎麼回事?

+1

「不起作用」比實際的錯誤消息(它是「eval(expr,envir,enclos)中的錯誤:無法找到有效的起始值:請指定一些」我玩過w /一些簡單的'glm y〜1 +偏移量(垃圾))',一切正常。我認爲你有一個非常小的數據集和一些不太可能的偏移量,所以glm根本找不到合適的。 –

+0

我的「非常小的數據集」就是人們所說的最小的例子,讓你 – Andi

+0

這不是因爲你想記錄0嗎? – James

回答

8

我看起來像startoffset存在時未被識別。您正在嘗試取y值爲-Inf的0的對數。 glm明顯無法處理此問題時尋找一個解決方案,而不是給予start一些幫助。在你的y值的小擾動將允許一個解決方案。

exp(coef(glm(I(y+.Machine$double.eps)~1 + offset(log(t)), family=gaussian(link=log)))) 
(Intercept) 
    0.1481481 
+1

一種有效的解決方法。 –

+1

不錯,謝謝! – Andi

6

這裏有一些考古學解釋這是怎麼回事,內glm功能深的結果:

調試(含debug("glm")),並通過功能步進表明,它未能在下面的調用:

if (length(offset) && attr(mt, "intercept") > 0L) { 
    fit$null.deviance <- eval(call(if (is.function(method)) "method" else method, 
    x = X[, "(Intercept)", drop = FALSE], y = Y, weights = weights, 
    offset = offset, family = family, control = control, 
    intercept = TRUE))$deviance 
} 

這是試圖計算模型的無效偏差。只有在有截距項和偏移項時纔會評估(我不確定爲什麼;可能是由於以前調用glm而計算的默認無效偏差在這種情況下是錯誤的,因此必須重新計算?)。它調用glm.fit(默認值爲method),但沒有起始值,因爲這些通常對於僅用於截取模型是不必要的。

現在裏面glm.fit調試,看看會發生什麼:我們得到

if (is.null(etastart) && is.null(start) && is.null(mustart) && 
    ((family$link == "inverse" && any(y == 0)) || (family$link == 
     "log" && any(y <= 0)))) 
    stop("cannot find valid starting values: please specify some") 

,我們看到,由於初始值不通過,因爲日誌的鏈接被使用,因爲有些y值相等歸零,則配合失敗。因此,如果(且僅當?)指定了偏移量和截距,使用了日誌鏈接,並且響應中的值爲零,則應該發生這種情況。

如果你dump("glm",file="glmtemp.R");添加行

start = start[1], etastart = etastart[1], mustart = mustart[1], 

到適合無效偏差的呼叫(即上面顯示的那個);和source("glmtemp.R"),它似乎工作正常...我認爲這應該是一個合理的通用解決方案。如果有人想在R開發名單上提出這個問題,請隨意。

+0

隨着您的除了呼叫技術問題解決。謝謝!你能否給我一個提示,爲什麼估計的參數與泊松 - 格拉姆不同? (相同的偏移量,相同的日誌鏈接)沒有偏移量,兩個估計值都是相同的。 – Andi

+0

我沒有時間去挖掘這個,但你爲什麼期望它們是相同的?我認爲這是一個特殊情況,非偏移模型是相同的...我只是逐步完成模型的定義(即在鏈接規模上查找最小期望方差加權平方和,有或沒有偏移量) –