【问题标题】:Johnson Moments distribution in PythonPython 中的约翰逊矩分布
【发布时间】:2021-04-01 07:23:28
【问题描述】:

约翰逊矩分布,其算法于 1976 年发布,实现于

在 Scipy 中,没有实现它,只有 Johnson-SU-SB 分布,它们与 Johnson Moments 分布不同。是否还有其他python库,或者如何在Python中实现?

Hill, I. D, R. Hill, and R. L. Holder. 1976。算法 AS99:拟合 约翰逊瞬间弯曲。应用统计 25 (2): 180--189

【问题讨论】:

  • 不确定 Johnson Moments 分布是什么。在您提供的 R 包中,有 Johnson SU、SB、normal 和 lognormal,仅此而已。
  • 查看我添加的引用 Hill 论文的 matlab 代码?那是约翰逊矩分布,f_johnson_M。另一方面,R 包文档指出参数 “也可以从时刻估计。应用统计算法 99,由于 Hill、Hill 和 Holder (1976) 已被翻译成 C 用于此实现。”
  • 如果你甚至有一篇描述算法的论文,把算法翻译成 Python 代码是不是很简单?
  • 你看到Matlab代码有多长是对的

标签: python scipy statistics distribution


【解决方案1】:

我在当前工作的一个副项目中遇到了同样的问题,我找到了一个效果很好的解决方案。

首先,我建议您阅读该算法首次发布的Applied Statistics article。您需要注册一个免费帐户,然后您每月可以获得 100 篇免费文章。我建议这样做的原因是,根据您的描述,我觉得您可能误解了算法的作用。您提到了“约翰逊时刻分布”,这不是一回事。该文章中描述的算法(与您在帖子中提到的相同)描述了一个名为 JNSN 将均值、标准差、偏度和峰度作为输入,并返回估计的约翰逊分布类型(Su、Sb、正态或指数)以及分布所需的 4 个参数(γ、δ、β 和 λ)。这四个所需的参数在有关约翰逊分布的文献中有所描述,分别命名为 gamma、beta、sigma 和 lam(尽管在代码中他将最后 2 个称为 XLAM 和 XI,并在他的函数中以相反的顺序排列它们签名)。

给定输出“itype”,您可以选择通过 SciPy 实例化正态曲线、指数曲线、Johnson-SUJohnson-SB。当你这样做时,beta 和 gamma 对应于 SciPy 的“a”和“b”参数,而 sigma 和 lam 对应于“location”和“scale”参数。您可以通过从您实例化的 SciPy 分布中提取 Mean、StdDev、Skewness 和 Kurtosis 并检查它们是否与您传递给 JNSN 函数的输入相匹配来对此进行测试。

现在对于 python 实现......没有一个。那里的代码是fortran。我尝试将其翻译成 Python,但我的翻译中有太多错误。此外,翻译代码的速度也很糟糕。所以,我放弃了翻译代码的想法,转而使用numpy's excellent F2PY modulefortran source code编译成机器语言python插件。

注意:http://lib.stat.cmu.edu/apstat 也有许多其他 fortran 模块的源代码。
最后说明:原始源代码使用 4 字节浮点数。我直接在fortran代码中更新了它,然后使用f2py -h ...命令生成,然后调整python的签名。

【讨论】:

  • 你说得对,我在发表这篇文章后意识到 Hill et al (1976) 算法旨在另外识别 4(或 6)个 Johnson 分布中的一个,而不仅仅是 SU ,同时处理它们之间的重叠参数配置。你会碰巧在 python 中完成他们的算法的翻译,还是最接近(不存在的)约翰逊矩分布的东西?手动将 SU 参数映射到目标时刻是猜测stackoverflow.com/questions/65567759/…
  • 如前所述,我放弃了翻译的想法。相反,我获取了 fortran 源代码(上面链接)并使用 F2PY(上面也链接)将其编译为 python 插件。我建议你也这样做。
  • 还有一件事。该算法返回从 1 到 5 的“ITYPE”值,其中 1 是对数正态,2 是 Su,3 是 Sb,4 是正态,5 完全没有价值。如果你的 ITYPE 为 5,你就有点卡住了。最糟糕的是,有时算法无法收敛到 Sb,因此它选择返回 ITYPE 1 或 ITYPE 5。在这些情况下两者都不是很有用,因此请务必密切关注 JNSN 函数返回的 IFAULT 参数!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-20
  • 1970-01-01
  • 1970-01-01
  • 2019-02-08
  • 2017-06-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多