Я думаю, вы хотите оптимизировать функцию только двух параметров. Итак, мы могли бы сделать:
x <- c(1,2,3,3,3,4,4,5,5,6,7)
log.lklh.lnorm <- function(x, mu, sd, input_min, input_max){-sum(log(dlnorm(x, meanlog = mu, sdlog = sd, log = FALSE)/((plnorm(input_max, meanlog = mu, sdlog = sd, lower.tail = TRUE, log.p = FALSE)) - (plnorm(input_min, meanlog = mu, sdlog = sd, lower.tail = TRUE, log.p = FALSE)))))}
f <- function(y) {
log.lklh.lnorm(x,y[1],y[2],1,100000)
}
optim(par = c(3,1), f)
Примечания в ответ на дополнительные вопросы в комментариях:
Какова функция par = c(3,1)
? Это имеет две функции. (1) Это начальная точка (предположение). (2) Определяет количество параметров для оптимизации. В данном случае это 2. Следует отметить, что вы можете (и должны) рассчитывать очень хорошие начальные значения. Вы можете получить очень хорошие оценки для μ и σ, просто рассчитав среднее значение и стандартное отклонение выборки. (В статистике это иногда называется method of moments
). Это значительно облегчит задачу optim
. Поэтому вместо par=c(3,1)
мы действительно должны сделать: par = c(mean(x),sd(x))
.
Что делает y[1]/y[2]
? Функция optim
организует все параметры для оптимизации, как одиночный вектор . Таким образом, я представлял (μ, σ) одним вектором y
(длиной 2). В функции f
этот массив распаковывается и передается log.lklh.lnorm
в качестве отдельных аргументов.