функция возврата NaN - PullRequest
0 голосов
/ 21 мая 2018

Я не понимаю, почему приведенная ниже функция возвращает NaN, даже если ответ не должен быть NaN.Я пытался найти похожий вопрос, но большинство из них на другом языке программирования, который я не мог понять.

Код:

a0 = 1.5; a1 = 0.4; b1 = 0.3; g1= 0.7
nu = rep(0,1)
h.new = rep(0,1)
ddp = rep(0,1)

nu[1]=0

h.new[1] = a0/(1-a1-b1)
ddp[1] = 0.5*log(g1)- g1*h.new[1] + 
  nu[1]*(log(nu[1])-1) - log(factorial(nu[1]))+(g1)*nu[1]* 
  (1+log(h.new[1]/nu[1]))

Это вывод:

###> ddp
###[1] NaN

Затем я делаю ручной расчет, ясно показываю, что ddp - это не NaN:

###h.new = 1.5/(1-0.4-0.3) = 5

###ddp 
###= 0.5*log(0.7)- (0.7)*(5) + 
###(0)*(log(0)-1) - log(0!)+(0.7)*(0)* 
###(1+log(5/0))

###= 0.5*log(0.7)- (0.7)*(5)

###= -3.6783

Я знал, что для функции sum () na.rm = TRUE может пропустить все пропущенные значения, но в этомслучай, как изменить код, чтобы он вернулся к правильному ответу?

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 21 мая 2018

nu[1] равно 0, а журнал 0 не определен.R оценивает log(0) как -Inf Тогда у вас есть log(5/0) - что такое 5/0?Это не определено.Таким образом, у вас есть много неопределенных значений, которые приведут к общему неопределенному результату.Как отмечено в ответе Бена, NaN создается, когда вы умножаете 0 на Inf или -Inf

Однако, даже если эти два элемента будут преобразованы в 0, код, который вы написали, будетоцените -3,68, а не -0,52.Итак, вы делаете что-то не так вручную.

0 голосов
/ 21 мая 2018

В целом 0*Inf дает NaN в R: компьютер не знает / не может знать, как вы хотите взять предел.Если вы знаете, что хотите, чтобы эти пределы были равны нулю, вы можете указать, как ваши вычисления будут работать в особом случае nu==0:

term3 <- if (nu==0) 0 else nu*(log(nu)-1)
term5 <- if (nu==0) 0 else g1*nu*(1+log(h.new/nu))
ddp = 0.5*log(g1)-
    g1*h.new + 
    term3 - 
    log(factorial(nu))+
    term5

Вы можете сделать это немного более широко с помощью функции zprod:

zprod <- function(x,y) {
     if (x==0) 0 else x*y
}
ddp = 0.5*log(g1)- g1*h.new + 
      zprod(nu,log(nu)-1) - log(factorial(nu))+
      g1*zprod(nu,1+log(h.new/nu))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...