R optim()L-BFGS-B需要有限的';fn';-韦布尔

R optim()L-BFGS-B需要有限的';fn';-韦布尔,r,weibull,R,Weibull,我尝试使用optim()函数估计三个参数a、b0和b1。但我总是犯错误: optim中的错误(par=c(1,1,1),fn=logweibull,方法=“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

我尝试使用
optim()
函数估计三个参数a、b0和b1。但我总是犯错误: optim中的错误(par=c(1,1,1),fn=logweibull,方法=“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) )
t您也可以考虑

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

(2) 传递梯度函数(添加梯度函数)

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

logweibull您也可以考虑

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

(2) 传递梯度函数(添加梯度函数)

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


logweibull
logweibull
logweibull
logweibull,但理想情况下,不应该使用条件pdf计算条件期望值?看看这一点:,它们是如何从任意pdf中采样的(通过计算cdf,然后找到根),monte carlo采样不应该从这个截短的pdf中进行吗?但理想情况下,条件期望不应该使用条件pdf计算吗?看看这个:,它们是如何从任意pdf中进行采样的(通过计算cdf,然后找到根),monte carlo采样不应该从这个截短的pdf中进行吗?
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"