Вот результаты некоторых археологии, которая объясняет, что происходит, глубоко внутри 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, не стесняйтесь.
«не работает» менее полезен, чем фактическое сообщение об ошибке «Ошибка в eval (expr, envir, enc)): не удается найти допустимые стартовые значения: укажите некоторые« Я играл с каким-то простым «glm (y ~ 1 + offset (junk)) 'и все работает нормально. Я думаю, у вас очень маленький набор данных и некоторые весьма маловероятные смещения, поэтому glm просто не может найти нужную. –
Мой «очень маленький набор данных» - это то, что люди называют минимальным примером. Позвольте вам – Andi
Разве это не потому, что вы пытаетесь записать в журнал 0? – James