我可能是不合理的要求帮助调试一个程序,但我花了一天半的时间在这个非常简单的代码上,并且已经没有想法。我试图优化一个名为“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”。
请发布一个可重复的例子。 – 2009-11-18 20:13:59