我甚至不知道我的方程是否正确,但我做到了,它说optim中的目标函数的长度为2而不是1。我正在尝试使用mle和log似然来估计lambda和alfa。
set.seed(1001)
q <- 1:5000
mean(q)
sd(q)
ll <- function(lambda = 0.5, alpha = 3.5) {
n <- 5000
(-n) * alpha * log(lambda) +
n * log(gamma(alpha)) - ((alpha - 1) * sum(log(q))) +
lambda * sum(q)
}
MLE <- optim(c(0.5, 3.5),
fn = ll,
method = "L-BFGS-B",
lower = 0.00001,
control = list(fnscale = -1),
hessian = T
)
有几个地方可以让你的optim
飞起来:
- 您应该将
ll
定义为一个参数的函数(而不是两个参数,否则您将出现错误"optim中的目标函数计算长度为2而不是1"(,因为在optim
中,您的初始值x0
将传递给目标函数fn
ll<-function(x){
n<-5000
lambda <- x[1]
alfa <- x[2]
(-n)*alfa*log(lambda)+n*log(gamma(alfa))-((alfa-1)*sum(log(q)))+lambda*sum(q)
}
- 在
optim
中,下界lower
的维数应该与x0
相同,例如
MLE = optim(c(0.5,3.5),
fn = ll,
method = "L-BFGS-B",
lower = c(1e-5,1e-5),
control = list(fnscale = -1),
hessian = FALSE
)