0

プログラムのデバッグに助けを求めるのはおそらく不合理ですが、この非常に単純なコードに 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」に変えました。

4

1 に答える 1

1

まず、「実際の」コードを使用するには、再現可能な例が必要だという Eduardo Leoni のコメントに同意します。

私の盲目的な推測は、R ではパラメーターを省略できるため、g「あなたの」g と関数gradtolから省略された a の間で正しく解決されないというnlmことです。

一方、コードフラグメントを試してみると、nlm呼び出しに進み、不明なため、2 番目のステートメントlog.pr.dataでのみ失敗します。printT.chan

悲しいことに、実際に動作する (つまり、再現可能に失敗する) 例がなければ、何が問題なのかを突き止めるのは困難です。

于 2009-12-17T17:16:56.687 に答える