2012-04-06 68 views
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估计,而第二列显示利用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

传递给'control()'的'reltol'参数可以调整收敛的阈值。如有必要,您可以尝试使用该功能。我理解争论的理由,但对于封闭形式解决方案不容易计算的实际应用,精确到2位或3位小数不够? – Chase 2012-04-06 15:02:01

+0

谢谢。设置reltol = .Machine $ double.eps似乎消除所有错误。 – 2012-04-06 15:21:31

+0

酷!很高兴这有帮助。正如您可能知道的那样,您可以发布问题的答案并将其标记为正确的,以便其他人可以轻松查看您的解决方案。 – Chase 2012-04-06 15:29:28

回答

6

回答大通提供:

它被传递给了control()让你 调整会聚的门槛reltol参数。如有必要,您可以尝试玩 。

编辑:

这是现在的代码包括选项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 

因此,优化所产生的错误等gorithm(即。现在减至零,即cfiter之间的差值)。

+2

请考虑发布上述代码的修改版本。 – 2012-04-06 17:04:19

1

除了设置RELTOL说法,还认为你真的做了一堆优化跨一个参数,即optimize功能更好地工作比optim单参数的情况下,可以更好地为您的实际问题(如果它真的是一维)。

+0

实际问题是多维的,在我试图模拟多维优化问题的例子中,即使你是对的,实际上只有一个参数......这只是因为用这种方法写起来更容易。 – 2012-04-06 16:35:52