Ошибка при использовании optim для максимизации вероятности в r

Итак, у меня есть эти функции:

funk1 <- function(a,x,l,r) {
x^2*exp(-(l*(1-exp(-r*a))/r))}

funk2 <- function(x,l,r) {
sapply(x, function (s) {
integrate(funk1, lower = 0, upper = s, x=s, l=l, r=r)$value })}  

которые используются для объяснения данных y in,

z <- data.frame(ts = 1:100,
            y = funk2(1:100, l = 1, r = 1) + rpois(100, 1:100))

Я хочу использовать optim, чтобы максимизировать вероятность, поэтому я определил функцию правдоподобия:

LL_funk <- function(l,r) { 
n=nrow(z)
R = sum((funk2(ts,l,r) - y)^2)
logl = -((n/2)*log(R))
return(-logl)
} 

и я попытался подогнать с помощью optim

fit <- optim(par=c(0.5,0.5), fn= LL_funk, method="Nelder-Mead")

Но я получаю сообщение об ошибке:

 Error in integrate(funk1, lower = 0, upper = s, x = s, l = l, r = r) : 
 a limit is missing 

Я не уверен, почему? Я мог бы запустить nls, подбирая funk2(x,l,r) к y

nls(y ~ funk2(ts,l,r), data = z, start = list(l = 0.5, r = 0.5))

Это означает, что funk2 работает. Я предполагаю, что это проблема с функцией LL, которую я разработал, которую я не могу понять! Пожалуйста помоги!


person VitalSigns    schedule 20.07.2016    source источник


Ответы (1)


Ага! Были две проблемы с вашей функцией. Это сработало для меня:

LL_funk <- function(params) { 
  n=nrow(z)
  l = params[1]
  r = params[2]
  R = sum((funk2(z$ts,l,r) - z$y)^2)
  logl = -((n/2)*log(R))
  return(-logl)
}

Предыдущие выпуски:

  • LL_funk принимает только 1 аргумент, который является вектором параметров.
  • В LHS назначения R, ts и y фактически не относятся к столбцам в вашем наборе данных.
person homer    schedule 20.07.2016
comment
Благодаря тонну! Не знал, что функция LL принимает только один аргумент. второй проблемой была ошибка опечатки. - person VitalSigns; 20.07.2016
comment
@ZheyuanLi Да, я должен начать делать это очень осторожно. Спасибо! - person VitalSigns; 21.07.2016