gpt4 book ai didi

python - 在 python 中计算 F 分布 p 值?

转载 作者:太空宇宙 更新时间:2023-11-03 15:00:48 26 4
gpt4 key购买 nike

假设我有一个 F 值和相关联的自由度 df1 和 df2。我如何使用 python 以编程方式计算与这些数字关联的 p 值?

注意:我不会接受使用 scipy 或 statsmodels 的解决方案。

最佳答案

F 分布的 CDF(以及因此的 p 值)可以使用正则化(不完整)beta 函数 I(x; a, b) 计算,参见例如 MathWorld .使用来自此 blogI(x; a, b) 的代码,它仅使用 math,p 值为

1 - incompbeta(.5*df1, .5*df2, float(df1)*F/(df1*F+df2))

这里是一些样本值的结果,匹配scipy.stats.f.sf:

In [57]: F, df1, df2 = 5, 20, 18

In [58]: 1 - incompbeta(.5*df1, .5*df2, float(df1)*F/(df1*F+df2))
Out[58]: 0.0005812207389501722

In [59]: st.f.sf(F, df1, df2)
Out[59]: 0.00058122073922042188

以防博客消失,这里是代码:

import math

def incompbeta(a, b, x):

''' incompbeta(a,b,x) evaluates incomplete beta function, here a, b > 0 and 0 <= x <= 1. This function requires contfractbeta(a,b,x, ITMAX = 200)
(Code translated from: Numerical Recipes in C.)'''

if (x == 0):
return 0;
elif (x == 1):
return 1;
else:
lbeta = math.lgamma(a+b) - math.lgamma(a) - math.lgamma(b) + a * math.log(x) + b * math.log(1-x)
if (x < (a+1) / (a+b+2)):
return math.exp(lbeta) * contfractbeta(a, b, x) / a;
else:
return 1 - math.exp(lbeta) * contfractbeta(b, a, 1-x) / b;

def contfractbeta(a,b,x, ITMAX = 200):

""" contfractbeta() evaluates the continued fraction form of the incomplete Beta function; incompbeta().
(Code translated from: Numerical Recipes in C.)"""

EPS = 3.0e-7
bm = az = am = 1.0
qab = a+b
qap = a+1.0
qam = a-1.0
bz = 1.0-qab*x/qap

for i in range(ITMAX+1):
em = float(i+1)
tem = em + em
d = em*(b-em)*x/((qam+tem)*(a+tem))
ap = az + d*am
bp = bz+d*bm
d = -(a+em)*(qab+em)*x/((qap+tem)*(a+tem))
app = ap+d*az
bpp = bp+d*bz
aold = az
am = ap/bpp
bm = bp/bpp
az = app/bpp
bz = 1.0
if (abs(az-aold)<(EPS*abs(az))):
return az

print 'a or b too large or given ITMAX too small for computing incomplete beta function.'

关于python - 在 python 中计算 F 分布 p 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38113120/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com