2009-11-18 433 views
0

我可能是不合理的要求帮助调试一个程序,但我花了一天半的时间在这个非常简单的代码上,并且已经没有想法。我试图优化一个名为“log.pr.data”的函数关于它的第一个参数。通过R函数传递一个函数参数nlm

因为函数优化需要你设置参数的边界,我决定使用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这个函数。所以我重新定义了在log.pr.data中留下g未指定的函数。换句话说,我只是删除了参数列表中的“= 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, 粗麻布,typsize ,FSCALE,味精,:在参数

无效的NA值这也是有趣的是,似乎没有成为一个调用log.pr.data因为... e“功能log.pr.data”未打印。在早先尝试解决这个问题的尝试中,我意识到我正在使用符号“f”作为传递的函数,并且这可能会导致问题,因为nlm称其为obejctive函数“f”。所以我把它改成了“g”。

+0

请发布一个可重复的例子。 – 2009-11-18 20:13:59

回答

1

首先,我同意Eduardo Leoni的评论,我们需要一个可重复的例子,以便我们有“真正的”代码可以使用。

我盲目的猜测是,因为R中可以缩写参数,g不正确“您”克从nlm功能的缩写gradtol之间解决。

在另一方面,如果我尝试你的代码片段,nlm继续进行调用log.pr.data因为T.chan不知道只在第二print语句失败。

很遗憾,如果没有工作(即重复失败)的例子,很难找出问题所在。