【问题标题】:objective function in optim evaluates to length 2 not 1optim 中的目标函数评估为长度 2 而不是 1
【发布时间】:2020-08-18 21:10:56
【问题描述】:

我什至不知道我的任何方程式是否正确,但我这样做了,它说 optim 中的目标函数评估为长度 2 而不是 1。我正在尝试使用 mle 和对数似然估计 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
)
 

【问题讨论】:

    标签: r


    【解决方案1】:

    有几个地方可以让你的optim 飞起来:

    1. 您应该将您的 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
    )
    

    【讨论】:

    • 非常感谢,非常感谢。
    • 只是一个简单的问题......你如何从那里运行 mle()
    • @JoyShiro run mle() 是什么意思?作为函数运行?
    • @JoyShiro 要传递给mle() 的参数是什么?
    • 你看到了你刚刚帮我解决的方程......有一个后续说运行 mle() 函数。现在为那些参数。
    猜你喜欢
    • 2017-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多