Я, наверное, безрассудно просить помощи в отладке программы, но я потратил полтора дня на эту довольно простую часть кода и исчерпал идеи. Я пытаюсь оптимизировать функцию с именем "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".