最大似然估计的准确性

时间:2012-04-06 14:49:04

标签: r mathematical-optimization

这是一个比较泊松分布的λ参数的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估计器,而第二列显示通过使用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

可以看出,使用迭代优化方法获得的估计量可能与正确的值有很大差异。这是预期的事情还是有另一种(多维)优化技术可以产生更好的近似值?

2 个答案:

答案 0 :(得分:6)

Chase提供的答案:

  

传递给reltol的{​​{1}}参数可以让您   调整收敛的门槛。你可以试试这个   如果有必要的话。

修改

这是现在代码的修改版本,包括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 cf之间的差异)现在减少到零。

答案 1 :(得分:1)

除了设置reltol参数之外,还要考虑到你实际上是在一个参数上做了一堆优化,optimize函数比optim对单个参数情况更有效,可能效果更好对于你真正的问题(如果它真的是一维的)。