2014-06-27 2 views
0

Следующий код - это поиск трех параметров обобщенного бета-распределения.ошибка функции optim() при оценке параметров

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

geb11 = function(a,b,t) { beta2(a,b,t)/beta(a,b) } 
geb12 = function(a,b,t) { (beta1(a,b,t)-beta2(a,b,t))/beta(a,b) } 
geb22 = function(a,b,t) { 1 + (beta2(a,b,t)-2*beta1(a,b,t))/beta(a,b) } 

gbetloglik = function(v) { 
    a = v[1]; b = v[2]; t = v[3] 
    loglik = n1*log(geb11(a,b,t)) + n3*log(geb12(a,b,t)) + n2*log(geb22(a,b,t)) 
    return(-loglik) 
} 

n1 = 127; n2 = 111; n3 = 262 
abt = optim(c(5,5,1),gbetloglik,lower=c(0.01,0.01,0.1),method="L-BFGS-B")$par 

Затем оно дает ошибку, как указано ниже, со многими предупреждениями.

Error in optim(c(2, 8, 1), gbetloglik, lower = c(0.01, 0.01, 0.1), method = "L-BFGS-B") : 
    L-BFGS-B needs finite values of 'fn' 

Сообщение предупреждающего

1: In beta(a + (2/t), b) : underflow occurred in 'beta' 
2: In beta(a, b) : underflow occurred in 'beta' 
3: In beta(a + (1/t), b) : underflow occurred in 'beta' 
... 

n1, n2 и n3 генерируются некоторыми случайными сценариями генерации чисел, и (n1, n2, n3) решает, происходит ли ошибка. (Для некоторых (n1, n2, n3) ошибка не происходит)

Я не понимаю, в чем причина этой ошибки и что «опустошения в„бета“означает.

ответ

1

Как предупредительное сообщение указывает на наличие сгущенного при вычислении бета

Попробуйте это (там, где мы добавили ## строку):.

gbetloglik = function(v) { 
    a = v[1]; b = v[2]; t = v[3] 
    if (beta(a, b) == 0) return(1e6) ## 
    loglik = n1*log(geb11(a,b,t)) + n3*log(geb12(a,b,t)) + n2*log(geb22(a,b,t)) 
    return(-loglik) 
} 
+0

кажется, что ошибка возникает реже, после добавления этой команды, но она по-прежнему происходит .. . – user67275

+0

Затем соответствующим образом обрабатывайте другие случаи бета-тестирования. –

+0

Ваше предложение разрешило ошибку. Но все еще есть предупреждения «underflow in beta». – user67275

Смежные вопросы