python - 如何在Python中计算非中心f分布的逆?

标签 python math distribution

我正在尝试使用此处的函数来计算非中心 F 分布的 cdf 的倒数

scipy.special 导入 ncfdtr、ncfdtri、ncfdtridfd、ncfdtridfn、ncfdtrinc'

我正在使用

  • 25-2=3 作为自由度
  • 5/(0.001042**2 ) 作为 nc,我认为应该是正确的。
  • 1-0.0027=0.9973 作为 the 的 p,我认为它应该是 c.d.f 的输出。

但是我尝试了每个函数,但我得到的只是 nan0.0

我还尝试使用 here 中的 Excel 版本,使用 p=0.0027,但使用 python 时无法获得相同的值

print(ncfdtri( dfd, dfn, ncp, a )) = 264386.8371546744,在 Excel 中为 259533.97396

print(ncfdtri(dfn, dfd, ncp, a )) = 496074.40359445167,在 Excel 中为 487951.32384

但是当我尝试使用 a=1-0.0027 时,这给了我 1e+100 两者,我认为这不是答案。

有人可以帮我解决这个问题吗?

最佳答案

要获得逆 CDF,您必须调用百分比点函数,又名 PPF。

首先,您的 nc 参数存在问题 - 它约为 5,000,000,这在图表中产生了非常尖锐的步骤。所以,代码

import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import ncf

dfn = 2
dfd = 3
nc  = 5 / (0.001042**2) # 1.0

rv = ncf(dfn, dfd, nc) # RV of non-central F distribution

x = np.linspace(0.01, 0.99, 100) # for inverse CDF, [0...1] is proper X interval

fig, ax = plt.subplots(1, 1)
ax.plot(x, rv.ppf(x), 'r-', lw=5, alpha=0.6, label='ncf PPF(inv.CDF)')

plt.show()

print(rv.ppf(0.9973))

将生成图表

enter image description here

如果将 nc 更改为合理的 1.0,您将得到图表

enter image description here

无论如何,这里是您要求的逆 CDF(又名 PPF)的代码。最后一个问题是 0.9973 作为 p 是什么 - 剩下的唯一参数是比例或位置。您可以轻松地将其添加到 ncf(dfn, dfd, nc, loc,scale) 调用中。

更新

实际上,如果您弄乱了参数,使得 nc 实际上等于 0.9973,那么我的第二张图几乎就是您问题的答案。

更新二

好吧,如果 nc 确实约为 500 万,那么 print(rv.ppf(0.9973)) 确实会产生输出 1100。查看左上角的第一个图表和注释编号。

关于python - 如何在Python中计算非中心f分布的逆?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55536975/

相关文章:

java - 在 Java 中四舍五入到最接近的其他 double 倍数?

r - 二元正态分布的离散近似

python - Numpy - 修改匹配值旁边的值

Python - 带有字母数字的人类数字,但在 pyQt 和 __lt__ 运算符中

python - 在python中删除字符中串(可迭代)

python - 用 Python 计算密度

python - 如何确保任意数量的权重总和为 1(Python)?

python - 在循环体中使用 remove 时,python "for...in..."如何工作?

r - 拟合 beta 分布时出错 : the function mle failed to estimate the parameters with error code 100

python - 用频率计数绘制概率密度函数