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

How to calculate the inverse of non-central f distribution in python?

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

scipy.special import ncfdtr,ncfdtri, ncfdtridfd, ncfdtridfn,ncfdtrinc'

我正在使用

但我尝试了每个功能,但我得到的只是 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))

将生成图形

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

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

更新

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

更新二

嗯,如果nc真的是500万左右,那么print(rv.ppf(0.9973))真的产生了输出1100。查看左上角的第一张图和注释编号。