鉴于这是一个相当长的帖子,我认为最好是从我的问题开始:在python中实现这个模型的最佳方法是什么?

我正在开发一个涉及概率密度函数卷积的统计模型 . 没有放弃我不能的东西,这是我的问题:

参数A描述了从t0到t1的事件A的时间 . 它由具有下限和上限a和b的均匀分布给出 .

A ~ U(a, b)

参数B描述了在t2从t1到事件B的时间 . 它也由具有下限和上限c和d的均匀分布给出 .

B ~ U(c, d)

参数G描述了在未知时间从t0到事件C的时间 . 它由具有形状和尺度参数α和β的伽马分布给出,其中均值=α/β且标准偏差=α/(β^ 2) .

G ~ G(alpha, beta)

我们想知道G落在t1和t2之间的概率 . 我们还想对这些参数执行网格搜索,因此有效地完成计算非常重要 . 目标最终用户包括无法访问高性能计算的公务员机构(就像我们一样),因此不能选择并行化 .

t1出现的时间由A给出,但是t2出现的时间给出为A和B的总和

Y = A + B

W = A - G

Z = Y - G

由于这两个分布是统一的,因此可以对它们进行分析卷积 . G出现在A和Y之间的概率为P(A <G <Y) . 我们可以如上所述引入变量Y和Z:

P(A < G < Y) = P(W < 0 < Z)
P(A < G < Y) = P(Z > 0) - P(W > 0)
P(A < G < Y) = [1 - P(Z < 0)] - [1 - P(W < 0)]
P(A < G < Y) = Fw(0) - Fz(0)

Fw(0)和Fz(0)分别表示分布Y和Z的累积密度函数 .

Fw(0) can be calculated as shown in this image.

For Fz(0), a triple integral is required.

在python中计算这些数学的最佳方法是什么?我们有一个工作程序,但即使我们约束积分边界并且分析地将A和B卷积为Y,它也很慢 . 策略是使用scipy.integrate中的quad进行数值卷积 . 这很慢并经常给我们舍入错误并超出最大细分数 .

有没有更好的办法?

我们可以针对两个现有的实现来验证程序的结果,一个在fortran中编程但是使用NAG库集成例程,另一个用matlab编写 . fortran版本对我们自己的科学研究来说是令人满意的,但是我们使用python的动机是使用开源例程(如Scipy库中的那些)生成一个可自由使用的语言编写的可分发源代码 . 使用NAG库例程从fortran中解决了这个问题 .