我在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来提高数值精度,但这似乎没有做任何事情。
由于
答案 0 :(得分:2)
tl; dr log(gamma(x))的定义比您想象的更普遍,或者比Excel认为的要好。如果您希望自己的函数不接受alpha
和beta
的负值,或者要返回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)
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