Boost C++ Libraries

...世界上最受推崇和专业设计的 C++ 库项目之一。 Herb SutterAndrei Alexandrescu, C++ 编码标准

PrevUpHomeNext

非中心 Beta 分布

#include <boost/math/distributions/non_central_beta.hpp>
namespace boost{ namespace math{

template <class RealType = double,
          class Policy   = policies::policy<> >
class non_central_beta_distribution;

typedef non_central_beta_distribution<> non_central_beta;

template <class RealType, class Policy>
class non_central_beta_distribution
{
public:
   typedef RealType  value_type;
   typedef Policy    policy_type;

   // Constructor:
   BOOST_MATH_GPU_ENABLED non_central_beta_distribution(RealType alpha, RealType beta, RealType lambda);

   // Accessor to shape parameters:
   BOOST_MATH_GPU_ENABLED RealType alpha()const;
   BOOST_MATH_GPU_ENABLED RealType beta()const;

   // Accessor to non-centrality parameter lambda:
   BOOST_MATH_GPU_ENABLED RealType non_centrality()const;
};

}} // namespaces

非中心 beta 分布是 Beta 分布 的推广。

它被定义为比率

X = χm2(λ) / (χm2(λ) + χn2)

其中 χm2(λ) 是具有 m 个自由度的非中心 χ2 随机变量,而 χn2 是具有 n 个自由度的中心 χ2 随机变量。

这给出了一个 PDF,可以表示为 beta 分布 PDF 的泊松混合

其中 P(i;λ/2) 是在 i 处的离散泊松概率,均值为 λ/2,而 Ix'(α, β) 是不完全 beta 函数的导数。 这导致 CDF 的常用形式为

下图说明了分布如何随 λ 值的不同而变化

成员函数
BOOST_MATH_GPU_ENABLED non_central_beta_distribution(RealType a, RealType b, RealType lambda);

构造一个非中心 beta 分布,其形状参数为 ab,非中心参数为 lambda

要求 a > 0、b > 0 和 lambda >= 0,否则调用 domain_error

BOOST_MATH_GPU_ENABLED RealType alpha()const;

返回从中构造此对象的参数 a

BOOST_MATH_GPU_ENABLED RealType beta()const;

返回从中构造此对象的参数 b

BOOST_MATH_GPU_ENABLED RealType non_centrality()const;

返回从中构造此对象的参数 lambda

非成员访问器

支持大多数 常用的非成员访问器函数累积分布函数概率密度函数分位数均值方差标准差中位数众数风险函数累积风险函数范围支持。 对于此分布,这些函数标记为 BOOST_MATH_GPU_ENABLED,并且可以在主机和设备上运行。

均值和方差是使用超几何 pfq 函数以及 Wolfram 非中心 Beta 分布 中给出的关系实现的。

但是,以下函数当前未实现:偏度峰度超额峰度

随机变量的域为 [0, 1]。

准确性

下表显示了在各种平台上使用各种浮点类型找到的峰值误差(以 epsilon 为单位)。 与 R Math 库 比较中的失败似乎主要是在概率非常小的极端情况下。 除非另有说明,否则任何比所示类型窄的浮点类型都将具有 有效零误差

表 5.4. 非中心 beta CDF 的错误率

GNU C++ 版本 7.1.0
linux
double

GNU C++ 版本 7.1.0
linux
long double

Sun 编译器版本 0x5150
Sun Solaris
long double

Microsoft Visual C++ 版本 14.1
Win32
double

非中心 Beta,中等参数

最大值 = 0.998ε(平均值 = 0.0649ε)

Rmath 3.2.3: 最大值 = 1.46e+26ε(平均值 = 3.5e+24ε) 以及其他失败。

最大值 = 824ε(平均值 = 27.4ε)

最大值 = 832ε(平均值 = 38.1ε)

最大值 = 242ε(平均值 = 31ε)

非中心 Beta,大型参数

最大值 = 1.18ε(平均值 = 0.175ε)

Rmath 3.2.3: 最大值 = 1.01e+36ε(平均值 = 1.19e+35ε) 以及其他失败。

最大值 = 2.5e+04ε(平均值 = 3.78e+03ε)

最大值 = 2.57e+04ε(平均值 = 4.45e+03ε)

最大值 = 3.66e+03ε(平均值 = 500ε)


表 5.5. 非中心 beta CDF 补码的错误率

GNU C++ 版本 7.1.0
linux
double

GNU C++ 版本 7.1.0
linux
long double

Sun 编译器版本 0x5150
Sun Solaris
long double

Microsoft Visual C++ 版本 14.1
Win32
double

非中心 Beta,中等参数

最大值 = 0.998ε(平均值 = 0.0936ε)

Rmath 3.2.3: 最大值 = 7.5e+97ε(平均值 = 1.37e+96ε) 以及其他失败。

最大值 = 396ε(平均值 = 50.7ε)

最大值 = 554ε(平均值 = 57.2ε)

最大值 = 624ε(平均值 = 62.7ε)

非中心 Beta,大型参数

最大值 = 0.986ε(平均值 = 0.188ε)

Rmath 3.2.3: 最大值 = +INFε(平均值 = +INFε) 以及其他失败。

最大值 = 6.83e+03ε(平均值 = 993ε)

最大值 = 3.56e+03ε(平均值 = 707ε)

最大值 = 1.25e+04ε(平均值 = 1.49e+03ε)


PDF、CDF 补码和分位数函数的错误率大致相似。

测试

有两组测试数据用于验证此实现:首先,我们可以与 R 库 生成的一些样本值进行比较。 其次,我们有使用此实现和区间算术计算的测试数据表 - 此数据应至少精确到小数点后 50 位 - 并且用于我们的准确性测试。

实现

CDF 及其补码的评估方法如下

首先,我们确定两个值(CDF 或其补码)中哪个可能更小,交叉点被认为是分布的均值:为此,我们使用以下近似值:R. Chattamvelli 和 R. Shanmugam,“算法 AS 310:计算非中心 Beta 分布函数”,应用统计学,第 46 卷,第 1 期。(1997),第 146-156 页。

然后使用以下关系计算 CDF 或其补码

求和是通过从 i = λ/2 开始,然后在两个方向上递归进行的,使用泊松 PDF 和不完全 beta 函数的常用递归关系。 这是以下文献中描述的“方法 2”

Denise Benton 和 K. Krishnamoorthy,“计算连续分布的离散混合:非中心卡方、非中心 t 和样本多重相关系数的平方分布”,计算统计与数据分析 43 (2003) 249-267。

在以下文献中可以找到上述公式在非中心 beta 分布中的具体应用

Russell V. Lenth,“算法 AS 226:计算非中心 Beta 概率”,应用统计学,第 36 卷,第 2 期。(1987),第 241-244 页。

H. Frick,“算法 AS R84:关于算法 AS 226 的评论:计算非中心 Beta 概率”,应用统计学,第 39 卷,第 2 期。(1990),第 311-312 页。

Ming Long Lam,“评论 AS R95:关于算法 AS 226 的评论:计算非中心 Beta 概率”,应用统计学,第 44 卷,第 4 期。(1995),第 551-552 页。

Harry O. Posten,“非中心 Beta 分布函数的有效算法”,美国统计学家,第 47 卷,第 2 期。(1993 年 5 月),第 129-131 页。

R. Chattamvelli,“关于非中心 Beta 分布函数的注释”,美国统计学家,第 49 卷,第 2 期。(1995 年 5 月),第 231-234 页。

其中,Posten 参考资料提供了最完整的概述,并包括在 λ/2 处开始迭代的修改。

此实现与上述参考文献之间的主要区别在于,当最有效时直接计算补码,以及将总和累加到 -1 而不是在最后从 1 中减去结果:当结果接近 1 时,这可以显着减少所需的迭代次数。

PDF 是使用 Benton 和 Krishnamoorthy 的方法以及关系式计算的

分位数是使用专门修改的 bracket and solve 版本计算的,从分布的均值开始搜索根。(也尝试了 Cornish-Fisher 类型展开,虽然这在许多情况下非常接近根,但当它错误时,往往会引入非常病态的行为:可能需要对该领域进行更多研究)。


PrevUpHomeNext