R optim()L-BFGS-B需要有限的“fn”和“fn”。 - 威布尔

时间:2016-09-28 12:29:38

标签: r weibull

我尝试使用optim()函数估计三个参数a,b0和b1。但我总是得到错误: optim中的错误(par = c(1,1,1),fn = logweibull,method =" L-BFGS-B",: L-BFGS-B需要有限的“fn'

t<-c(6,6,6,6,7,9,10,10,11,13,16,17,19,20,22,23,25,32,32,34,35,1,1,2,2,3,4,4,5,5,8,8,8,8,11,11,12,12,15,17,22,23)
d<-c(0,1,1,1,1,0,0,1,0,1,1,0,0,0,1,1,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1)
X<-c(1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0)

logweibull <- function (a,b0,b1) {a <- v[1];b0 <- v[2]; b1 <- v[3];
sum (d*log(t^a*exp(b0+X*b1)-t^a*exp(b0+X*b1))) + sum (d + log((a*t^(a-1))/t^a)) }

v<-c(1,1,1)

optim( par=c(1,1,1) ,fn = logweibull, method = "L-BFGS-B",lower = c(0.1, 0.1,0.1), upper = c(100, 100,100),control = list(fnscale = -1) )
你能帮帮我吗?你知道我做错了吗?

1 个答案:

答案 0 :(得分:3)

你也可以考虑

(1)将附加数据变量与您想要估计的参数一起传递给目标函数。

(2)传递渐变函数(添加渐变函数)

(3)原始目标函数可以进一步简化(如下)

logweibull <- function (v,t,d,X) {
  a <- v[1] 
  b0 <- v[2] 
  b1 <- v[3] 
  sum(d*(1+a*log(t)+b0+X*b1) - t^a*exp(b0+X*b1) + log(a/t)) # simplified function
}

grad.logweibull <- function (v,t,d,X) {
  a <- v[1] 
  b0 <- v[2] 
  b1 <- v[3] 
  c(sum(d*log(t) - t^a*log(t)*exp(b0+X*b1) + 1/a), 
    sum(d-t^a*exp(b0+X*b1)),
    sum(d*X - t^a*X*exp(b0+X*b1)))
}

optim(par=c(1,1,1), fn = logweibull, gr = grad.logweibull,
      method = "L-BFGS-B",
      lower = c(0.1, 0.1,0.1), 
      upper = c(100, 100,100),
      control = list(fnscale = -1), 
      t=t, d=d, X=X)

带输出

$par
[1] 0.2604334 0.1000000 0.1000000

$value
[1] -191.5938

$counts
function gradient 
      10       10 

$convergence
[1] 0

$message
[1] "CONVERGENCE: REL_REDUCTION_OF_F <= FACTR*EPSMCH"

此外,下面是有和没有梯度函数的收敛性(有限差分)之间的比较。使用显式梯度函数,需要9次迭代才能收敛到解,而没有它(有限差分),需要126次迭代才能收敛。

enter image description here