2016-10-03 5 views
0

だから私は、ガンマ、ポアソンのための尤度関数を最大化しようとしていると私は、次のようにRにそれをプログラムしました:二変数関数の最大化 - Rコード

xとtである
lik<- function(x,t,a,b){  
    for(i in 1:n){ 
     like[i] = 
     log(gamma(a + x[i]))-log(gamma(a)) 
      -log(gamma(1+x[i] + x[i]*log(t[i]/b)-(a+x[i])*log(1+t[i]/b) 
     } 
     return(sum(like)) 
} 

私はn個のデータ行を持っています。

私はaとbを同時に解決する必要があります。 Rには組み込み関数が存在しますか?または、方程式のシステムを解くアルゴリズムをハードコードする必要がありますか? [私はむしろ]私はoptimize()が1つの変数を解決し、fminbnd()も解決することを知っています。 MathematicaでFindMaximum()の振る舞いをコピーしようとしています。

optimize(f=lik, a>0, b>0, x=x, t=t, maximum=TRUE, iteration=5000) 
$maximum 
    a 150 
    b 6 

ありがとう:完璧な世界では私はこのような何かを動作するようにコードをしたいと思います。

+0

はい、私はちょうど1時間以上グーグルでグーグルしていますが、ここでR. –

+0

(1)のプログラムで誰も '?optim'を見て、デフォルトで*を最小限に抑えていますヘルプファイルの 'fnscale'の説明を参照してください)。 (2) 'dnbinom'が役に立ちます。 (3)そうすれば 'MASS :: fitdistr' –

答えて

1

optim'第1引数にパラメータのベクトルを指定できます。ですから、このような何かを試みることができる:

lik <- function(p=c(1,1), x, t){ 
    # In the body of the function replace a by p[1] and b by p[2] 
} 

optim(c(1,1), lik, method = c("L-BFGS-B"), x=x, t=t, control=list(fnscale=-1)) 
0

だから、出て働くことになった解決策は次のとおりです。

attempt2d <- optim(
    par = c(sumx/sumt, 1), fn = lik, data = data11, 
    method = "L-BFGS-B", control = list(fnscale = -1, trace=TRUE), 
    lower=0.1, upper = 170 
    ) 

私のパラメータは、基本的に私のガンマパラメータはInfにあることを意味し、170に出て実行しますが。 gamma()は比較的早く無限に達するからです。そして、数学では、解はa = 169、b = 16505であり、Rは170に達するところには至っていません。既知の解は、ある場合には170を超えています。