`optimize()`:指数分布速率的最大似然估计

时间:2016-10-09 21:24:58

标签: r mle

我真的很难理解R中的MLE计算。

如果我从exp(λ)分布结果中随机抽取了大小为6的样本:

x <- c(1.636, 0.374, 0.534, 3.015, 0.932, 0.179)

我计算出MLE如下

mean(x)

并且获得了1.111667(我并非100%确定我做了这一部分)。

但是,当我尝试使用R编码数值计算时,我会得到错误或不匹配的答案。

lik <- function(lam) prod(dexp(x))   # likelihood function
nlik <- function(lam) -lik(lam)      # negative-likelihood function
optimize(nlik, x)

给了我

#$minimum
#[1] 3.014928
#
#$objective
#[1] -0.001268399

最初我有

lik <-function(lam) prod(dexp(x, lambda=lam))   # likelihood function
nlik <- function(lam) -lik(lam)      # negative-likelihood function
optim(par=1, nlik)   # minimize nlik with starting parameter value=1

但我一直在

#Error in dexp(x, lambda = lam) : 
#  unused argument (lambda = lam)
#In addition: Warning message:
#In optim(par = 1, nlik) :
#  one-dimensional optimization by Nelder-Mead is unreliable:
#use "Brent" or optimize() directly

1 个答案:

答案 0 :(得分:1)

所以这是你的观察载体

x <- c(1.636, 0.374, 0.534, 3.015, 0.932, 0.179)

我不确定为什么你会直接减少负面可能性;通常我们使用负 log 可能性。

nllik <- function (lambda, obs) -sum(dexp(obs, lambda, log = TRUE))

使用optimize时,设置下限和上限:

optimize(nllik, lower = 0, upper = 10, obs = x)

#$minimum
#[1] 0.8995461
#
#$objective
#[1] 6.635162

这距离样本平均值不太远:1.11,因为你只有6个观察值,不足以进行近似估计。

在此处使用optimize就足够了,因为您使用的是单变量优化。如果您想使用optim,请设置method = "Brent"。您可以阅读Error in optim(): searching for global minimum for a univariate function了解更多信息。