4

これは、ポアソン分布のラムダパラメーターのML推定量を比較するためのテストです。

with(data.frame(x=rpois(2000, 1.5), i=LETTERS[1:20]),
     cbind(cf=tapply(x, i, mean),
           iter=optim(rep(1, length(levels(i))), function(par) 
             -sum(x * log(par[i]) - par[i]), method='BFGS')$par))

最初の列は閉形式の解から得られたML推定器(参照用)を示し、2番目の列はBFGS法を使用して対数尤度関数を最大化することによって得られたML推定器を示しています。結果:

    cf     iter
A 1.38 1.380054
B 1.61 1.609101
C 1.49 1.490903
D 1.47 1.468520
E 1.57 1.569831
F 1.63 1.630244
G 1.33 1.330469
H 1.63 1.630244
I 1.27 1.270003
J 1.64 1.641064
K 1.58 1.579308
L 1.54 1.540839
M 1.49 1.490903
N 1.50 1.501168
O 1.69 1.689926
P 1.52 1.520876
Q 1.48 1.479891
R 1.64 1.641064
S 1.46 1.459310
T 1.57 1.569831

反復最適化手法で得られた推定量は、正しい値からかなり外れる可能性があることがわかります。これは予想されることですか、それともより良い近似を生成する別の(多次元)最適化手法がありますか?

4

2 に答える 2

7

Chaseから提供された回答:

reltol渡されるパラメータを使用control()すると、収束のしきい値を調整できます。必要に応じて、それで遊んでみることができます。

編集:

これはコードの修正バージョンであり、オプションが含まれていますreltol=.Machine$double.eps。これにより、可能な限り最高の精度が得られます。

with(data.frame(x=rpois(2000, 1.5), i=LETTERS[1:20]),
     cbind(cf=tapply(x, i, mean),
           iter=optim(rep(1, length(levels(i))), function(par) 
             -sum(x * log(par[i]) - par[i]), method='BFGS',
             control=list(reltol=.Machine$double.eps))$par))

そして結果は次のとおりです。

    cf iter
A 1.65 1.65
B 1.54 1.54
C 1.80 1.80
D 1.44 1.44
E 1.53 1.53
F 1.43 1.43
G 1.52 1.52
H 1.57 1.57
I 1.61 1.61
J 1.34 1.34
K 1.62 1.62
L 1.23 1.23
M 1.47 1.47
N 1.18 1.18
O 1.38 1.38
P 1.44 1.44
Q 1.66 1.66
R 1.46 1.46
S 1.78 1.78
T 1.52 1.52

そのため、最適化アルゴリズムによって発生するエラー(つまり、との差cfiterはゼロになります。

于 2012-04-06T15:34:11.243 に答える
1

reltol引数を設定することに加えて、1つのパラメーターに対して実際に多数の最適化を行っていることも考慮してください。この関数は、単一パラメーターの場合optimizeよりもうまく機能optimし、実際の問題(実際には1次元の場合)に対してより適切に機能する可能性があります。

于 2012-04-06T16:15:44.700 に答える