我不明白为什么以下函数返回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可以省略所有缺失的值, 但在这种情况下,如何修改代码使其返回正确的答案?
提前致谢。
答案 0 :(得分:2)
一般情况下,0*Inf
在R中提供NaN
:计算机无法/无法知道您希望如何获取限制。如果您知道希望这些限制为零,则可以在特殊情况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))
答案 1 :(得分:2)
log(0)
为0且未定义日志0。 R将-Inf
评估为log(5/0)
然后你有NaN
- 什么是5/0?它未定义。因此,您有许多未定义的值,这将创建一个整体未定义的结果。正如Ben的回答中所述,当您将0乘以Inf
或-Inf
但是,即使将这两个元素解析为0,您编写的代码也会评估为-3.68,而不是-0.52。所以,你手动做错了。