R 由于长度原因,使用optim函数时出错
我试图使用R中的最大似然法估计以下对数函数,但我得到以下误差: optim中的错误(start,f,method=method,hessian=TRUE,…):optim中的目标函数计算长度为10,而不是1 我的尝试如下: 生成数据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在评论中所
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