Ошибка при использовании оптимальной функции для уравнения правдоподобия на R

Я новичок в R и столкнулся с ошибкой при попытке использовать функцию optim.

У меня есть уравнение вероятности, которое я хотел бы максимизировать, поэтому я реализовал следующий код:

>datafile=read.delim("clipboard")

> log.lik=function(theta, x, mu){
+ b=theta[1]
+ beta=theta[2]
+ tau=theta[3]
+ result=function(b,beta, tau){(-sum(x)/b)-sum(log(-beta*(x-tau)))-sum(log(integrate(exp(-x/b)/(1+exp(-beta(x-tau)))), lower=1500, upper=Inf))}
+ return(result)
+ }
> estimate=c(1,1,1)
> model=optim(par=estimate, fn=log.lik, control=list(fnscale=-1), x=datafile, mu=1500)

Все работает, пока функция optim, при которой я получаю следующее сообщение об ошибке: Ошибка в optim(par = эстимейт, fn = log.lik, control = список (fnscale = -1),: не может привести тип "замыкание" к вектору типа "двойной"

Кто-нибудь может понять, в чем здесь проблема? Любая помощь будет оценена!

Файл данных - это всего лишь один столбец имитируемых финансовых потерь в формате CSV. Когда я вывожу переменную datafile, вот пример того, что я получаю:

       X1946774
1      34949037
2     734018898
3     393502463
4     388573133
5      93213300
6      74982868
7      55322550
8      10828207
9       4530577
10      3786748
11      2041762
12    342745985
13    292313639
14    259569928
15    143871771
16     53691635
17     24489644
18     20506718
19     14281945

Отредактированный код, включающий изменения из комментариев:

 > log.lik=function(theta,x,mu){
    + b=theta[1]
    + beta=theta[2]
    + tau=theta[3]
    + integrand<-function(x,b,beta,tau){exp(-x/b)/(1+exp(-beta*(x-tau)))}
    + result<-(-sum(x)/b)-sum(log(-beta*(x-tau)))-sum(log(integrate(integrand, lower=mu, upper=Inf)))
    + return(result)
    + }
    > model=optim(par=estimate, fn=log.lik, control=list(fnscale=-1), x=datafile, mu=1500)

1 ответ

Слишком долго для комментария.

Во-первых, вы все еще используете integrate(...) неправильно. Эта функция возвращает список (читайте документацию!!). $value Элементом этого списка является интеграл. Таким образом, чтобы найти интеграл f от a в b, используйте:

integrate(f,a,b,...)$value

К сожалению, это наименьшая из ваших проблем. По сути, вы берете слишком много ярлыков. Вы не можете просто собрать некоторый код - вам нужно обратить внимание на математику.

Например, вы составили график значений вашего integrand(...) функция для начальных значений theta, В диапазоне (mu,Inf)?? Если бы вы имели, вы бы увидели, что подынтегральная функция 0 в этом диапазоне, потому что mu=1500 а также b=1, а также exp(-1500/1) численно 0; следовательно, интеграл равен 0, а лог интеграла не определен. Кроме того, ваша целевая функция включает в себя термин log(-beta*(x-tau)), но для beta=tau=1, -beta*(x-tau) < 0 для всех x в вашем наборе данных, и снова журнал не определен.

Для протокола, я не понизил ваш вопрос (потому что нахожу практику оскорбительной...), но вам действительно нужно поработать над пониманием правильности вашей функции логарифмического правдоподобия, и когда вы это сделаете, примите внимательно посмотреть на ваши первоначальные оценки.

Другие вопросы по тегам