我正在尝试使用此处的函数来计算非中心 F 分布的 cdf 的倒数
scipy.special 导入 ncfdtr、ncfdtri、ncfdtridfd、ncfdtridfn、ncfdtrinc
'
我正在使用
2
和5-2=3
作为自由度5/(0.001042**2 )
作为 nc,我认为应该是正确的。1-0.0027=0.9973
作为 the 的 p,我认为它应该是 c.d.f 的输出。
但是我尝试了每个函数,但我得到的只是 nan
和 0.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 作为 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/