0

私は R の初心者で、optim 関数を使用しようとしているときにエラーが発生しました。

最大化したい尤度方程式があるので、次のコードを実装しました。

>datafile=read.delim("clipboard")

> log.lik=function(theta, x, mu){
+ b=theta[1]
+ beta=theta[2]
+ tau=theta[3]
+ result=function(b,beta, tau){(-sum(x)/b)-sum(log(-beta*(x-tau)))-sum(log(integrate(exp(-x/b)/(1+exp(-beta(x-tau)))), lower=1500, upper=Inf))}
+ return(result)
+ }
> estimate=c(1,1,1)
> model=optim(par=estimate, fn=log.lik, control=list(fnscale=-1), x=datafile, mu=1500)

次のエラー メッセージが表示される最適化関数まで、すべてが機能します。 'ダブル'

ここで何が問題なのか、誰にもわかりますか?どんな助けでも大歓迎です!

データ ファイルは、CSV 形式でシミュレートされた金銭的損失の 1 つの列にすぎません。データファイル変数を出力すると、次のサンプルが得られます。

       X1946774
1      34949037
2     734018898
3     393502463
4     388573133
5      93213300
6      74982868
7      55322550
8      10828207
9       4530577
10      3786748
11      2041762
12    342745985
13    292313639
14    259569928
15    143871771
16     53691635
17     24489644
18     20506718
19     14281945

コメントからの変更を組み込んだ編集済みコード:

 > log.lik=function(theta,x,mu){
    + b=theta[1]
    + beta=theta[2]
    + tau=theta[3]
    + integrand<-function(x,b,beta,tau){exp(-x/b)/(1+exp(-beta*(x-tau)))}
    + result<-(-sum(x)/b)-sum(log(-beta*(x-tau)))-sum(log(integrate(integrand, lower=mu, upper=Inf)))
    + return(result)
    + }
    > model=optim(par=estimate, fn=log.lik, control=list(fnscale=-1), x=datafile, mu=1500)
4

1 に答える 1

1

コメントが長すぎます。

まず、あなたはまだintegrate(...)間違った使い方をしています。この関数はリストを返します (ドキュメントを読んでください!! )。このリストの$value要素は積分です。したがって、fからaまでの積分を求めるにはb、次を使用します。

integrate(f,a,b,...)$value

悲しいことに、これはあなたの問題の中で最も小さいものです。基本的に、近道をしすぎています。単純にコードをまとめることはできません。計算に注意を払う必要があります。

たとえば、範囲内の のintegrand(...)初期値に対する関数の値をプロットしましたか?? もし持っていれば、被積分関数がこの範囲で 0 であることがわかります。したがって、積分は 0 であり、積分の対数は未定義です。また、目的関数には という用語が含まれていますが、データセット内のすべての について、ログは定義されていません。theta(mu,Inf)mu=1500b=1exp(-1500/1)log(-beta*(x-tau))beta=tau=1-beta*(x-tau) < 0x

記録のために、私はあなたの質問に反対票を投じませんでした(練習が不快だと思うため...)が、対数尤度関数が正しいかどうかを理解するために本当に取り組む必要があります。最初の見積もりをよく見てください。

于 2014-08-04T22:22:08.563 に答える