【问题标题】:Error in using optim function due to length由于长度而使用 optim 函数时出错
【发布时间】:2018-09-23 23:28:54
【问题描述】:

我正在尝试使用 R 中的最大似然法估计以下对数函数,但出现以下错误:

优化错误(start, f, method = method, hessian = TRUE, ...) : 优化中的目标函数计算为长度 10 而不是 1

我的尝试如下:

生成数据

set.seed(101)
n <- 10
u <- runif(n)
theta1 <- 1
lamba1 <- 0.5

使用分位数函数生成 PTIR 数据

x <- function(u, theta1, lamba1) { 
    (-theta1/(log((1+lamba1)-sqrt((1+lamba1)^2-(4*lamba1*u)))/(2*lamba1)))^(1/(2))
}
x <- x(u = u, theta1 = theta1, lamba1 = lamba1)

声明对数似然函数

LL <- function(theta, lamba) { 
    R = suppressWarnings((n*log(2))+
      (n*log(theta))-(((2)+1)*sum(log(x)))-
      (sum(theta/(x^(2))))+
      (log(1+lamba-(2*lamba*exp(-theta/(x^(2)))))))
    return(-R) 
}
mle(LL, start = list(theta = 5, lamba=0.5))

任何建议将不胜感激。

【问题讨论】:

  • 目前无法复制...需要在调用mle之前使用library(stats4),然后...nlog是什么?
  • 对不起,它是“n*log”而不是“nlog”,我没明白你的意思。
  • 如果您愿意,我需要更多说明
  • 对于mle 和类似函数,您的目标函数需要返回单个标量值。您的函数LL 显然返回一个长度为10 的向量——这并不奇怪,因为您的计算涉及一个非标量xsuppressWarning 在数值计算中通常是一个非常的坏主意:你不想想忽略警告。它还有助于清晰地格式化方程式并去掉不必要的括号。
  • 不管怎样,你有没有可能只是忘了sum你的等式的最后一项?

标签: r


【解决方案1】:

我不知道如何解决您的问题,但希望我能帮助您诊断它。正如@KonradRudolph 在 cmets 中所建议的那样,这可能是通常的建议“如果您不确定,请添加更多括号”可能弊大于利......我已经以与您匹配的方式重写了您的函数上面有,但括号更少,换行/缩进更一致。下面的每一行都是一个单独的附加项。您的具体问题是最后一项涉及 x (在这种情况下长度为 10),但没有求和,因此返回值最终是长度为 10 的向量。

LL2 <- function(theta, lambda) {
    R <- n*log(2)+
        n*log(theta)-
        ((2)+1)*sum(log(x))-
        sum(theta/(x^2))+
        log(1+lambda-(2*lambda*exp(-theta/x^2)))
    return(-R)
}

all.equal(LL(1,1),LL2(1,1)) ## TRUE
length(LL2(1,1))  ## 10

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-18
    • 2017-10-28
    • 1970-01-01
    • 1970-01-01
    • 2014-02-15
    • 1970-01-01
    • 2014-04-22
    • 1970-01-01
    相关资源
    最近更新 更多