プログラムのデバッグに助けを求めるのはおそらく不合理ですが、この非常に単純なコードに 1 日半を費やし、アイデアが尽きてしまいました。最初の引数に関して「log.pr.data」という関数を最適化しようとしています。
関数optimizeでは引数に境界を設定するnlm
必要があるため、開始点のみを必要とするものを使用することにしました。nlm
実際に関数を引数として渡すことができる簡単な例で確認しました。私の問題は、この特定のケースで関数を引数として渡すことができないことです。
これが目的関数です (2 つの出力診断を使用)。引数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」が出力されないため、log.pr.data への単一の呼び出しがないように見えることも興味深いです。この問題のトラブルシューティングを試みた以前の試みで、渡される関数に記号「f」を使用していてnlm
、目的関数「f」と呼ばれるために問題が発生する可能性があることに気付きました。だから私はそれを「g」に変えました。