我可能是不合理地要求帮助调试一个程序,但我花了一天半的时间在这个相当简单的代码,并已用尽的想法。我试图对一个名为"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。因此,我重新定义了在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,hessian,类型化,fscale,msg,:参数中的无效NA值
同样有趣的是,似乎没有一个对log.pr.data的调用,因为没有打印“log.pr.data函数”。在早期解决此问题的尝试中,我意识到正在传递的函数使用符号"f“,这可能会导致问题,因为nlm将其目标函数称为"f”。所以我自始至终把它改为"g“。
发布于 2009-12-17 17:16:56
首先,我同意Eduardo的评论,我们需要一个可复制的例子,这样我们就可以使用“真正的”代码。
我的盲目猜测是,因为在R中您可以缩写参数,所以g在“您的”g和nlm函数中的缩写的gradtol之间没有正确的解析。
另一方面,如果我尝试您的代码片段,nlm将继续调用log.pr.data,并且只在第二个print语句中失败,因为T.chan是未知的。
因此,不幸的是,如果没有一个工作(即可重复失败)的例子,就很难找出出了什么问题。
https://stackoverflow.com/questions/1753950
复制相似问题