我可能在寻求帮助调试程序时是不合理的,但是我花了一天半时间在这个非常简单的代码上并且已经用完了想法。我正在尝试针对其第一个参数优化名为“log.pr.data”的函数。
因为函数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的功能。所以我重新定义了在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中的错误(function(x)f(x,...),p, hessian,typsize,fscale,msg,: 参数
中的NA值无效
有趣的是,似乎没有一次调用log.pr.data,因为没有打印“Function log.pr.data”。在早期尝试解决这个问题时,我意识到我正在使用符号“f”来传递函数,这可能会导致问题,因为nlm
称其为目标函数“f”。所以我在整个过程中将它改为“g”。
答案 0 :(得分:1)
首先,我同意Eduardo Leoni的评论,即我们需要一个可重复的示例,以便我们可以使用“真正的”代码。
我的盲目猜测是,因为在R中你可以缩写参数,g
在“你的”g和gradtol
函数中的缩写nlm
之间无法正确解析。 / p>
另一方面,如果我尝试使用您的代码片段,nlm
会继续调用log.pr.data
并仅在第二个print
语句处失败,因为T.chan
未知
很遗憾,如果没有工作(即重复失败)的例子,很难找出错误的原因。