R的数值精度问题?

时间:2015-08-06 10:59:40

标签: r gamma-function

我在R中遇到以下函数的问题:

test <- function(alpha, beta, n){
  result <- exp(lgamma(alpha) + lgamma(n + beta) - lgamma(alpha + beta + n) - (lgamma(alpha) + lgamma(beta) - lgamma(alpha + beta)))
  return(result)
}

现在,如果您插入以下值:

betabinom(-0.03292708, -0.3336882, 10)

它应该失败并导致NaN。那是因为如果我们在Excel中实现确切的函数,我们会得到一个不是数字的结果。 Excel中的实现很简单,因为J32是alpha,K32 beta和L N的单元格。结果单元格的实现如下:

=EXP(GAMMALN(J32)+GAMMALN(L32+K32)-GAMMALN(J32+K32+L32)-(GAMMALN(J32)+GAMMALN(K32)-GAMMALN(J32+K32)))

所以这似乎给出了正确的答案,因为该函数仅定义为alpha和beta大于零且n大于或等于零。因此,我想知道这里发生了什么?我也试过包Rmpf来提高数值精度,但这似乎没有做任何事情。

由于

1 个答案:

答案 0 :(得分:2)

tl; dr log(gamma(x))的定义比您想象的更普遍,或者比Excel认为的要好。如果您希望自己的函数不接受alphabeta的负值,或者要返回NaN,只需手动测试并返回相应的值(if (alpha<0 || beta<0) return(NaN))。

这不是数值精度问题,而是定义问题。为负实数定义Gamma函数 ?lgamma说:

  

伽玛函数由(Abramowitz和Stegun第6.1.1节,第255页)

定义      

Gamma(x)= integral_0 ^ Inf t ^(x-1)exp(-t)dt

     

表示除零和负整数外的所有实数'x'(返回'NaN'时)。

此外,请参阅lgamma ...

  

...... 的自然对数伽玛函数的绝对值......

(强调原文)

curve(lgamma(x),-1,1)

enter image description here

gamma(-0.1)          ## -10.68629
log(gamma(-0.1)+0i)  ## 2.368961+3.141593i
log(abs(gamma(-0.1)) ## 2.368961
lgamma(-0.1)         ## 2.368961

Wolfram Alpha agrees with second calculation