如何计算python中非中心f分布的逆?
How to calculate the inverse of non-central f distribution in python?
我正在尝试使用此处的函数来计算非中心 F 分布的 cdf 的倒数
scipy.special import ncfdtr,ncfdtri, ncfdtridfd, ncfdtridfn,ncfdtrinc
'
我正在使用
2
和5-2=3
作为自由度
5/ (0.001042**2 )
作为nc,我觉得应该是正确的。
1-0.0027=0.9973
作为 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 as the p
- 剩下的唯一参数是比例或位置。您可以轻松地将其添加到 ncf(dfn, dfd, nc, loc, scale)
调用中。
更新
实际上,如果您弄乱了参数,使 nc
实际上等于 0.9973,那么我的第二张图几乎就是您问题的答案。
更新二
嗯,如果nc
真的是500万左右,那么print(rv.ppf(0.9973))
真的产生了输出1100。查看左上角的第一张图和注释编号。
我正在尝试使用此处的函数来计算非中心 F 分布的 cdf 的倒数
scipy.special import ncfdtr,ncfdtri, ncfdtridfd, ncfdtridfn,ncfdtrinc
'
我正在使用
2
和5-2=3
作为自由度5/ (0.001042**2 )
作为nc,我觉得应该是正确的。1-0.0027=0.9973
作为 p 的,我认为它应该是 c.d.f. 的输出
但我尝试了每个功能,但我得到的只是 nan
和 0.0
。
我也尝试使用 here 中的 excel 版本和 p=0.0027
,但是在使用 python
print(ncfdtri( dfd, dfn, ncp, a )) = 264386.8371546744
,在excel
print(ncfdtri(dfn, dfd, ncp, a )) = 496074.40359445167
,在excel
但是当我尝试使用 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。查看左上角的第一张图和注释编号。