0

我可能不合理地寻求帮助调试程序,但我花了一天半的时间在这个非常简单的代码上并且已经没有想法了。我正在尝试针对第一个参数优化一个名为“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”。

4

1 回答 1

1

首先,我同意 Eduardo Leoni 的评论,即我们需要一个可重现的示例,以便我们可以使用“真实”的代码。

我的盲目猜测是,因为在 R 中你可以缩写参数,在“你的”g 和函数的g缩写之间没有正确解析。gradtolnlm

另一方面,如果我尝试您的代码片段,则nlm继续调用log.pr.data并仅在第二print条语句处失败,因为T.chan未知。

可悲的是,如果没有一个有效(即重复失败)的例子,很难找出问题所在。

于 2009-12-17T17:16:56.687 回答