2009-11-18 4 views
0

Я, вероятно, неразумный, прося помощь для отладки программы, но я потратил полтора дня на этот довольно простой бит кода и исчерпал идеи. Я пытаюсь оптимизировать функцию, называемую «log.pr.data» в отношении ее первого аргумента.Передача аргумента функции через R-функцию nlm

Поскольку функция optimize требует, чтобы вы задавали границы аргумента, я решил использовать 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) 

для диапазона значений «л» и она отлично работает и дает то же значение, что и предыдущей функция, где г = 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) 

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

Ошибка в НМГ (функция (х) е (х, ...), р, мешковину, typsize , FSCALE, сообщ,: недопустимое значение NA в параметре

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

+0

Пожалуйста, отправьте воспроизводимый пример. –

ответ

1

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

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

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

Так грустно, что без работы (т. Е. С ошибкой воспроизводимого), трудно понять, что не так.

Смежные вопросы