R认为积分可能是发散的,而不是发散的

R认为积分可能是发散的,而不是发散的,r,integral,R,Integral,我试图用R来计算一个积分 以下是我试图评估的函数: #Define the marginal likelihood function (which will we then integrate) marginal = function(z, se, alpha, beta, noise){ log_result = log(

我试图用R来计算一个积分

以下是我试图评估的函数:

#Define the marginal likelihood function (which will we then integrate)
marginal = function(z, 
                    se,
                    alpha, 
                    beta,
                    noise){
    log_result = log( 1 / ( ( z^-1*se - 4 )^.5 * z^-1*se ^ ( 3 / 2 ) ) ) +
    log( ( dbeta( ( 0.5 - ( ( z^-1*se - 4 ) ^ .5 ) / ( 2 * ( z^-1*se ) ^ .5 ) ) , alpha, beta ) +  
             dbeta( ( 0.5 + ( ( z^-1*se - 4 ) ^ .5 ) / ( 2 * ( z^-1*se ) ^ .5 ) ) , alpha, beta ) ) ) + 
    dgamma( z, shape = 1 / noise, scale = noise, log = TRUE) +
    log( z^-1 )
    
    return(exp(log_result))
}

integrate( marginal, lower = 0, upper = 0.9584705, se = 3.833882, alpha = 4.568112, beta = 4.830437, noise = 1e-4)$value
然而,这样做的结果是我的积分被认为是发散的。事实并非如此,而且,对于介于0和~0.96的上限之间的所有值,可以对函数求值

我查看了函数的外观,下面是一个示例:

非常有趣,如果我决定将下限改为0.8,我现在得到一个有限的答案,0.0001505723。很明显,现在发生的是,因为我的函数在很长一段时间内基本上处于零,只有在边界R处的峰值,在计算积分时,这里做了一些奇怪的事情

不幸的是,我在α/β/噪声/SE等不同的值上做积分,这个下界的范围变化了,有时积分像在附图中一样达到峰值,有时在边界的中间达到峰值(上界是根据数据输入改变的)。因此,我不能简单地选择将下限更改为始终为0.8。出于计算方面的原因,我也不希望写一个测试来确定下限应该在哪里,因为这对我来说是非常特别的,对于我来说不是一个合适的解决方案


是否有其他更好的方法来计算该积分?

这是一个根本性的难题(但tl;dr
pracma::integral()
似乎做得很好):参见例如的答案

  • 如果您有可能获得对函数的分析理解,以便您可以根据参数进行合理的直接计算,以确定合理的下限(即函数的非平凡质量大约在什么范围内?)这将是最稳健的方法——但当然它需要对您的特定功能进行详细分析(我不想费心去做…)
  • 对于某些情况,但我认为不是这一种,我建议重新进行数值计算,以最小化数值不稳定性/底流。即使是像这样简单的操作也能正常工作,但在这种情况下,我认为它不起作用,因为您的函数范围太广(即,如果我们计算出如何使浮点值的下限大于下溢水平(约1e-308),那么上限将大于上溢水平(约1e308)。有很多方法,但我们可能不想在这里讨论这个问题(PS:我用
    matrixStats::logsumexp
    尝试了它,但要么我出了问题,要么它也不能很好地工作……)
曲线(边际(x,se=3.833882,alpha=4.568112,beta=4.830437,
噪声=1e-4),从=0到=1,n=501,log=“y”)

  • 一种很有技巧的解决方案是将积分分为一个分段和;只要
    integrate()
    正确地处理了所有非平凡的组件,就可以继续使用。但是,请注意,这种策略也不稳健:对于
    cuts=8
    ,它会遗漏一个非平凡的组件

pieclewise\u int R做非常简单的数值积分,在像这样的极端情况下,这可能不是计算值的最佳方法。恐怕没有适合每个函数的计算方法。你能推荐(最好是在R中)那么,一个计算该积分的解决方案?你能想出一个合理的算法策略来确定下限的大致位置吗?(我知道你说过你不想为此“写一个测试”,但如果有一些基于函数形状的合理理论基础的方法…)@BenBolker下限始终为0。但实际上,有时这意味着函数在很长一段时间内处于零,直到达到某个拐点,然后达到峰值。感谢@BenBolker提供详细的响应。如果这解决了您的问题,建议您单击复选标记接受它。。。