【问题标题】:Boost chi2square inversion提升卡方求逆
【发布时间】:2022-01-21 12:50:28
【问题描述】:

Boost inversion_chi_square_distribution 与 Matlab 中的 chi2inv 共享不同的值,输入参数 (1 - 1e-3, 2)。

谁能解释我做错了什么?

我使用了伽马反转分布。

例子:

输入:

shape param : n/2 
scale : 2
p = 1 - 1e-3;

Matlab -> chi2inv(1-1e-3, 2);

Matlab -> gaminv(1-12-3, n/2, 2);

结果 -> 13.8155。两个函数的结果相同。

C++ 提升

cdf(boost::math::inverse_gamma_distribution<double> (n/2,2), a); -> a = 1-1e-3; n = 2;

结果:0.13506461276045323

提前谢谢你。

【问题讨论】:

  • 您的意思是1 - 1e-3 而不是1-12-3

标签: c++ matlab boost


【解决方案1】:

Boost 实现逆伽马分布,而您需要标准伽马分布的逆累积分布函数 (icdf)。 前者是在 1/x 处计算的 gamma 分布,而后者是 gamma 分布的 cdf 的倒数,请参阅https://en.wikipedia.org/wiki/Quantile_function。您使用两个完全不同的函数,但名称相似,因此结果不同。

恐怕您需要的函数在一般情况下没有封闭形式(尽管,例如,对于 shape = 1 scale = 2,很容易推导出其封闭形式:-2.0*log(1.0 - x))。可以使用一些数值反演方案来实现它,例如二分法、牛顿法等。

【讨论】:

    【解决方案2】:

    对数学/统计方面不太了解,我可以猜测 Matlab 的 gaminv 想法是特殊函数,而不是分布。

    根据 Wolfram Alpha,您可能应该使用“逆正则化 gamma 函数”:https://www.wolframalpha.com/input/?i=inverse+cdf+chi2

    或者明文:

    ConditionalExpression[Piecewise[{{2 InverseGammaRegularized[ν/2, 0, x], 0 < x < 1}, {0, x <= 0}}, Infinity], 0 <= x <= 1]
    

    我不立即知道如何将这个想法应用到候选代码 - 但它太大而无法在评论中发布

    【讨论】:

    • 嗨。感谢您的反馈意见。我从 boost 中发现的: boost::math::gamma_q_inv(scale/2, shape) * 2 也许对某人有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-07
    • 1970-01-01
    相关资源
    最近更新 更多