Почему вы попадаете в неприятности?
Если вы делаете lnlike(c(10, 0.3))
, вы получаете -Inf
. Вот почему ваше сообщение об ошибке жалуется lnlike
, а не optim
.
Часто известен n
, и только p
нуждается в оценке. В этой ситуации оценка момента времени или оценка максимального правдоподобия находятся в закрытом виде, и никакая численная оптимизация не требуется. Итак, это действительно странно оценивать n
.
Если вы хотите оценить, вы должны знать, что он ограничен. Проверить
range(xi) ## 5 15
Вы наблюдения имеют диапазон [5, 15]
, следовательно, требуется, чтобы n >= 15
. Как вы можете передать начальное значение 10? Поисковое направление для n
, должно быть от большого стартового значения, а затем постепенно искать вниз, пока оно не достигнет max(xi)
. Итак, вы можете попробовать 30
в качестве начального значения для n
.
Кроме того, текущим способом не нужно определять lnlike
. Сделайте это:
lnlike <- function(theta, x) -sum(dbinom(x, size = theta[1], prob = theta[2], log = TRUE))
optim
часто используется для минимизации (хотя это может сделать максимизацию). Я положил знак минус в функцию, чтобы получить отрицательную вероятность регистрации. Таким образом, вы минимизируете lnlike
w.r.t. theta
.
- Вы также должны передать свои замечания
xi
в качестве дополнительного аргумента lnlike
, а не принимать его из глобальной среды.
Наивная попытка с optim
:
В моем комментарии, я уже сказал, что я не верю, что с помощью optim
оценить n
будет работать, потому что n
должны быть целыми числа, а optim
используется для непрерывных переменных , Эти ошибки и предупреждения должны вас убедить.
optim(c(30,.3), fn = lnlike, x = xi, hessian = TRUE)
Error in optim(c(30, 0.3), fn = lnlike, x = xi, hessian = TRUE) :
non-finite finite-difference value [1]
In addition: There were 15 or more warnings (use warnings() to see the
first 15
> warnings()
Warning messages:
1: In dbinom(x, size = theta[1], prob = theta[2], log = TRUE) : NaNs produced
2: In dbinom(x, size = theta[1], prob = theta[2], log = TRUE) : NaNs produced
3: In dbinom(x, size = theta[1], prob = theta[2], log = TRUE) : NaNs produced
4: In dbinom(x, size = theta[1], prob = theta[2], log = TRUE) : NaNs produced
5: In dbinom(x, size = theta[1], prob = theta[2], log = TRUE) : NaNs produced
Решение?
Бен предоставил вам способ. Вместо того, чтобы дать optim
для оценки n
, мы вручную проведем поиск сетки для n
. Для каждого кандидата n
мы выполняем одномерную оптимизацию w.r.t. p
. (Ой, на самом деле, здесь нет необходимости делать численную оптимизацию.) Таким образом, вы получаете вероятность профиля n
. Затем мы найдем n
на сетке, чтобы минимизировать вероятность этого профиля.
Бен предоставил вам полную информацию, и я не буду повторять этого. Хорошая (и быстрая) работа, Бен!
Что такое ошибка? – duffymo
Я не знаю, как добраться до ответа, но я также не вижу ошибки ... Не могли бы вы опубликовать его? Ваш вопрос должен быть более сфокусированным на том, как исправить ошибку о том, как добраться до решения. (Получение решения может быть только исправлением ошибки, хотя ..) –
@ZheyuanLi Это иллюстративный пример того, что мне нужно. – andre