2011-11-21 4 views
3

Я хочу запустить Gaussian 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, enc)): не удается найти допустимые стартовые значения: укажите некоторые« Я играл с каким-то простым «glm (y ~ 1 + offset (junk)) 'и все работает нормально. Я думаю, у вас очень маленький набор данных и некоторые весьма маловероятные смещения, поэтому glm просто не может найти нужную. –

+0

Мой «очень маленький набор данных» - это то, что люди называют минимальным примером. Позвольте вам – Andi

+0

Разве это не потому, что вы пытаетесь записать в журнал 0? – James

ответ

8

Похоже, что start не распознается, когда есть offset. Вы пытаетесь взять журнал 0 в значениях y, который равен -Inf. 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 функции:

Debugging (с 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"), кажется, работает нормально ... I думаю, это должно быть разумным общим решением.Если кто-то хочет привести эту проблему в список развития R, не стесняйтесь.

+0

С добавлением к вызову техническая проблема решена. Спасибо! Можете ли вы также дать мне подсказку, почему оценочный параметр отличается от poisson-glm? (такое же смещение, одна и та же лог-ссылка). Без срока смещения обе оценки идентичны. – Andi

+0

У меня нет времени на это, но почему вы ожидаете, что они будут такими же? Я думаю, что это особый случай, когда модели без смещения идентичны ... Я бы просто работал по определению модели шаг за шагом (т. Е. Нашел минимальную ожидаемую взвешенную взвешенную сумму квадратов на шкале ссылок с или без смещение) –