统计学:卡方分布临界值的计算
前言
做应用统计分析的课后习题时,有一道题的χ2分布临界值在表上查不到。老师给出的解决办法是在EXCEL中用=CHISQ.INV.RT(α, n)来计算。但是这样未免有些无聊,为什么不自己写一个程序呢?
准备知识
卡方分布的分布函数
F(x,k)=Γ(2k)γ(2k,2x)
其中:
γ(s,x)=∫0xe−tts−1dt
Γ(s)=∫0∞e−tts−1dt
临界值
P(X<x)=F(x,k)

所谓临界值就是求得一个x使得P(X<x)大于等于置信水平。
由此我们列出关于x的方程,其中α为拒绝域面积,1-α为置信水平:
F(x,k)=1−α
scipy模块
SciPy 包含的模块有最优化、线性代数、积分、插值、特殊函数、快速傅里叶变换、信号处理和图像处理、常微分方程求解和其他科学与工程中常用的计算。
本次用到SciPy中的积分模块和求解非线性方程组的模块
含参数定积分:
1 2 3 4 5
| from scipy import integrate def f(x, a, b): return a * x + b v, err = integrate.quad(f, 1, 2, args = (-1, 1)) print v
|
非线性方程求解(最小二乘法):
python实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| from scipy import integrate import math from scipy import optimize
def gamma(s): def f(t,s): return math.exp(-t)*pow(t,s-1) v,err=integrate.quad(f,0,float('inf'),args=(s)) return v
def LI_gamma(s,x): def f(t,s): return math.exp(-t)*pow(t,s-1) v,err=integrate.quad(f,0,x,args=(s)) return v
def Fchi(x,k): F=LI_gamma(k/2,x/2)/gamma(k/2) return F
def cv_chi(alpha,n): def func(x): return Fchi(x,n)-1+alpha r=optimize.fsolve(func,0) return r
|
运行结果:
1 2
| alpha=0.025,n=40: 59.341707143171185 alpha=0.025,n=10: 20.483177350807395
|
与卡方分布临界值表完全一致
参考文献
卡方分布的概率密度函数推导过程? - 知乎 (zhihu.com)
卡方分布 - 维基百科,自由的百科全书 (wikipedia.org)
不完全伽玛函数 - 维基百科,自由的百科全书 (wikipedia.org)
Python 解方程的三种方法 - 知乎(zhihu.com)
python Scipy积分运算大全(integrate模块——一重、二重及三重积分) - The-Chosen-One - 博客园 (cnblogs.com)