R 由于长度原因,使用optim函数时出错

R 由于长度原因,使用optim函数时出错,r,R,我试图使用R中的最大似然法估计以下对数函数,但我得到以下误差: optim中的错误(start,f,method=method,hessian=TRUE,…):optim中的目标函数计算长度为10,而不是1 我的尝试如下: 生成数据 set.seed(101) n <- 10 u <- runif(n) theta1 <- 1 lamba1 <- 0.5 set.seed(101) 我不知道如何解决你的问题,但希望我能帮你诊断。正如@KonradRudolph在评论中所

我试图使用R中的最大似然法估计以下对数函数,但我得到以下误差:

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

我的尝试如下:

生成数据

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

我不知道如何解决你的问题,但希望我能帮你诊断。正如@KonradRudolph在评论中所建议的那样,在这种情况下,通常的建议“如果你不确定,请添加更多括号”可能弊大于利。。。我已经用一种与上面的方法相匹配的方式重写了您的函数,但是括号更少,换行/缩进更一致。下面的每一行都是一个单独的加法项。您的具体问题是,最后一个项涉及
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

LL2目前无法复制。。。在调用
mle
之前需要使用
库(stats4)
,然后。。。什么是
nlog
?很抱歉,它是“n*log”而不是“nlog”,我不明白你的意思。如果你愿意,我需要更多的澄清,关于
mle
和类似的函数,你的目标函数需要返回一个单一的标量值。函数
LL
显然返回长度为10的向量-这并不奇怪,因为您的计算涉及非标量
x
<代码>抑制警告
通常在数值计算中是一个非常糟糕的主意:您不希望忽略警告。它也有助于清晰地格式化方程式,并去除不必要的括号。不管怎样,您是否忘记了对方程式的最后一项求和?
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))
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