我正在尝试使用最大似然估计方法来估计lambda。
这是我正在使用的代码:
set.seed(0)
x=rexp(100,10)
plot(x)
fn <- function(lambda){
length(x)*log(lambda)-lambda*sum(x)
}
plot(fn)
optim(lambda, fn)
optim(lambda,fn)中的错误:找不到对象'lambda'nlm(fn,lambda) nlm(fn,lambda)中的错误:找不到对象“ lambda”
很明显,我的问题是错误,我不确定如何解决。 谁能告诉我如何解决这个问题,以便我可以进行估算或推荐更好的方法?
答案 0 :(得分:2)
当然。因此,optimize
函数就是这种情况
# Build Data
set.seed(0)
x=rexp(100,10)
稍微修改对数似然方程(仍然在数值上等效):
log_like_lambda <- function(lambda, x){
length(x) * log(lambda) - lambda*length(x)*mean(x)
}
然后我们可以使用优化函数来找到最大值。
optimize(f = log_like_lambda, x, interval = c(1,15), maximum = TRUE)
从假数据中输出预期的最大值
$maximum
[1] 9.688527
$objective
[1] 127.0944
在旁边:
请注意,绘制对数可能性以确保您正在优化自己认为正在优化的内容也很有帮助:
log_like <- log_like_lambda(1:50)
plot(log_like)
答案 1 :(得分:2)
这里有几个问题:
optim()
最小化,因此您需要control=list(fnscale=-1))
或将功能重新定义为负对数可能性optim(1,fn,control=list(fnscale=-1))
可行,尽管它给出警告,提示您应使用method="Brent"
。
您可能要考虑fitdistr()
包中的MASS
函数(因为MLE适合各种发行版),或mle2()
包中的bbmle
函数(对于一般的MLE,包括这种情况,例如mle2(x ~ dpois(lambda), data=data.frame(x), start=list(lambda=1))