Optim()函数错误

时间:2014-02-14 20:49:05

标签: r mathematical-optimization

这是我的代码。

beta1 = function(a,b,t) { beta(a+(1/t),b) }
beta2 = function(a,b,t) { beta(a+(2/t),b) }

eb11 = function(a,b,t) { beta2(a,b,t)/beta(a,b) }
eb12 = function(a,b,t) { (beta1(a,b,t)-beta2(a,b,t))/beta(a,b) }
eb22 = function(a,b,t) { 1 + (beta2(a,b,t)-2*beta1(a,b,t))/beta(a,b) }

eb11r11 = function(a,b,t) { beta2(a,b,t)*beta(a,b)/beta1(a,b,t)^2 }
eb12r12 = function(a,b,t) { (beta1(a,b,t)-beta2(a,b,t))*beta(a,b)/beta1(a,b,t)/(beta(a,b)-beta1(a,b,t)) }
eb22r22 = function(a,b,t) { (beta(a,b)^2 + (beta2(a,b,t)-2*beta1(a,b,t))*beta(a,b))/(beta(a,b)-beta1(a,b,t))^2 }

gbetloglik = function(a,b,t) {
  loglik = n1*log(eb11r11(a,b,t)) + n2*log(eb12r12(a,b,t)) + n3*log(eb22r22(a,b,t))
  return(-loglik)
}

abt = optim(c(0.5,0.5,1),gbetloglik,lower=c(0.001,0.001,0.001),method="L-BFGS-B")$par

我想要做的是找到最大化'gbetloglik'功能的a,b和t。 但我得到了这个错误。

Error in 2/t : 't' is missing

似乎缺少函数'beta2'的第三个参数。当我在gbetloglik函数中直接输入三个数字时,效果很好。该问题仅出现在optim()函数中。 有没有人有任何想法?

1 个答案:

答案 0 :(得分:1)

看起来你错误地解释了optim函数的第一个参数。第一个参数只为正在优化的1个参数提供初始值。在你的情况下,这是为gbetloglik的一个参数提供3个初始猜测。这个电话会有效:

abt = optim(0.5,gbetloglik,lower=c(0.001,0.001,0.001),method="L-BFGS-B", b=0.5, t= 0.5)$par

但不会针对所有三个参数进行优化,它只会优化a给定bt。要优化所有参数,您需要从here安装外部包。以下是nlmrt的示例:

ydat  =  c(6.308, 6.94, 9.638, 12.866, 17.069, 23.192, 31.443, 37.558, 51.156, 64.948, 77.995, 91.972)
tdat  =  seq_along(ydat)
start1  =  c(b1=1, b2=1, b3=1)
eunsc  =   y ~ b1/(1+b2*exp(-b3*tt))
anlxb1g =try(nlxb(eunsc, start=start1, trace=FALSE, data=data.frame(y=ydat, tt=tdat)))
print(anlxb1g)
anlxb1g$coefficients