Передача аргумента функции через R-функцию nlm - PullRequest
0 голосов
/ 18 ноября 2009

Я, наверное, безрассудно просить помощи в отладке программы, но я потратил полтора дня на эту довольно простую часть кода и исчерпал идеи. Я пытаюсь оптимизировать функцию с именем "log.pr.data" относительно ее первого аргумента.

Поскольку функция оптимизации требует, чтобы вы установили границы для аргумента, я решил использовать nlm, для которого требуется только начальная точка. Я проверил на простых примерах, что nlm действительно может передавать функции в качестве аргументов. Моя проблема в том, что я не могу передать функцию в качестве аргумента в данном конкретном случае.

Итак, вот целевая функция (с двумя диагностиками печати). Я хочу максимизировать это в отношении аргумента lambda.s. (Интересно, я не максимизирую здесь вероятность. Я пытаюсь оптимизировать сэмплер важности.)

log.pr.data<-function(lambda.s,n1,n0,lambda.star,psi0,tobs,g=T.chan){
           print("Function log.pr.data")
           print(g)
          psi.s<-boundary(lambda.s,g,psi0,tobs,n1,n0)
         -my.dbinom(n0*lambda.s,n0,lambda.star,log=TRUE)
}

У меня нет проблем с командой:

nlm(log.pr.data,p=0.6,n1=n1,n0=n0,lambda.star=lambda.star,psi0=psi0,tobs=tobs)

Работает нормально. Но я хочу иметь возможность изменить функцию g = T.chan. Поэтому я переопределил функцию, оставив g неопределенным в log.pr.data. Другими словами, я просто удалил "= T.chan" из списка аргументов. Я проверил, что функция работает нормально. Например, с помощью команды

 log.pr.data(l,n1,n0,lambda.star,psi0,tobs,T.chan)

для диапазона значений «l», он работает нормально и дает те же значения, что и предыдущая функция, где g = T.chan указан в списке аргументов. Таким образом, функция T.chan проходит правильно, как кажется.

Затем я пытаюсь оптимизировать

nlm(log.pr.data,p=0.6,n1=n1,n0=n0,lambda.star=lambda.star,psi0=psi0,tobs=tobs,g=T.chan)

и я получаю ошибку

Ошибка в nlm (функция (x) f (x, ...), p, hessian, typsize, fscale, msg,: неверное значение NA в параметре

Интересно также, что, похоже, не было ни одного вызова log.pr.data, потому что «Функция log.pr.data» не печатается. В более ранних попытках устранить эту проблему я понял, что я использовал символ «f» для передаваемой функции и что это может вызвать проблемы, потому что nlm назвал свою целевую функцию «f». Поэтому я изменил его на "g".

1 Ответ

1 голос
/ 17 декабря 2009

Во-первых, я согласен с комментарием Эдуардо Леони о том, что нам нужен воспроизводимый пример, чтобы у нас был & ldquo; real & rdquo; код для работы.

Мое слепое предположение могло бы состоять в том, что, поскольку в R вы можете сокращать параметры, g неправильно определяется между & ldquo; вашим & rdquo; g и сокращение gradtol от функции nlm.

С другой стороны, если я попробую ваши фрагменты кода, nlm продолжит вызов log.pr.data и завершится неудачей только при втором операторе print, поскольку T.chan неизвестно.

Так что, к сожалению, без работающего (т.е. не воспроизводимого) примера трудно определить, в чем дело.

...