分布函数分位点及p-value计算及程序实现
各分布函数分位点及p-value计算及程序实现
一、各分布函数计算
1.标准正态分布函数的计算
方法(1):利用泰勒展示求解
由于分布函数
2
2
()
2
x
t
F t e dx
π
-
-∞
=?不能被求解成为简单的初等函数,所以不能
直接用定义初等复合函数的方法计算其值。通过把正态密度函数
2
2
f()
2
x
x e
π
-
=
展开为泰勒级数,对泰勒级数的各项求定积分,然后相加各项数值即得分布函数F(t)的值。
22462
2
123
()=...+(-1)...
1!2!3!!
22
x n
n
n
x x x x
f x e
n
ππ
-
=-+-++
?2?2?2?2
(1)(1)
22
22
()0.5
22
x x
t t
F t e dx e dx
ππ
--
-∞
==+
??(2)
由(1),(2)得出
35721
123
()0.5(...+(-1)...)
1!2!3!!n
2
n
n
n
t t t t
F t t
n
π
+
=+-+-++
?2?3?2?5?2?7?2?(2+1)
(3)因为(3)式是一个无穷级数,计算时只能对前面有限项相加。选择越多,结果越准确。但数值精度并不要求无限高,可选取50项就足够,因而这里n=0,1,2…50。
流程图如下:
代开C++软件,输入以下程序代码:
#include
#include
#define PI 3.141592653
main( )
{
float z,t,y=0,jsx,F,b=1 ; //jsx为每个级数项的值,F为所要求分布函数的值
int n=1,a=1,m=1 ;
printf("Please enter t:");
scanf("%f",&t); //输入分位点t
while(n<101) //n<101,得出的级数项值共有50个
{
z=pow(t,n);
jsx=a*z/(b*n);
y+=jsx;
a=-1*a ; //正负符号标志 b=b*2*m ; m++; n=n+2; }
F=0.5+y/sqrt(2*PI);
printf("The result you want is:\n"); printf("%f",F); }
输入数据:比如t=0.02,x=-0.01,x=0 输出:
方法(2):积分的近似算法: 正态分布函数2
2
()2x t
F t dx π
-
=?
的计算归为积分计算。
设将区间[a,b]分为n 等份,共有n+1个分点。分点x ,,0,1,...k b a
a kh h k n
-=+=
=,在每个子区间1[x ,x ]k k +(k=0,1,….,n-1)上采用梯形公式()[()()]2
b a
b a f x dx f a f b -≈+?则可得复合梯形公式11
101
[()()][()2()()]22n n n k k k k k h h
T f x f x f a f x f b --+===+=++∑∑。如果将求积区间再二分
一次,则可提高求积精度。此时分点增至2n+1个,则由原来每个子区间1[x ,x ]
k k +经过二分只增加了一个分点112
1
x (x x )2k k k ++=+,再用复合梯形公式求得该子区
间上的积分值为112
[()2()()]4k k k h
f x f x f x ++++(其中b a h n -=代表二分前的步
长)。将每个子区间上的积分值相加得:11
21100
2[()()]()42n n n k k k k k h h T f x f x f x --++===++∑∑
C++程序算法: #include
return exp(-x*x/2);
}
double F(double a,double b,double ep=1e-6)
{
double h,s1=0,s2=(b-a)*(f(a)+f(b))/2;
int n,k;
for(int n=1;fabs(s1-s2)>ep;n*=2)
{
h=(b-a)/n;
s1 = s2;
s2 = 0;
for(int k=0;k { s2 += h*f(a+(k+0.5)*h); } s2 = (s1+s2)/2; } return s2*sqrt(1/(8*atan(1.0))); } int main() { double c=0,x; printf("please enter x:"); scanf("%lf",&x); printf("%lf",0.5+F(c,x)); return 0; } 结果显示:(输入x的值为2) 输出: 方法(3):连分式展开(算法程序见下面最后部分的总程序编写) Φ(x)为标准正态分布函数,其是对称的,只要求出x>0时Φ(x)的值也就可以求得x<0时Φ(x)=1-Φ(-x)。由于Φ(x)的近似式: Φ(x)≈ 222 1()2(1) ......,03 2135(21) ()12 1......,3 n f x x x x nx x n f x n x x x x x ?-- +++++≤≤ ?+ ? ? ? -++++> ?? 当时 当时 其中 2 2 () x f x- =采用递推式表达, 当0≤x ≤3时,令12 1a 0 (1),,1,......1(21)n k k k kx a k n n k a ++=??-?==-?++? 则Φ(x )= 11()21f x x a ++ 当x>3时,令11a 0 ,,1,.....1n k k k a k n n x a ++=?? ?==-?+? 则Φ(x )= 1()1f x x a -+ 一般当n>28时,精度可达10-12 2.Beta 分布函数的计算 Beta 分布的分布函数I (a,b) x 递推如下: 1I (a+1,b)=I (a,b)-(,)1I (a,b+1)=I (a,b)+(,) (1,)(,) (,1)(1)(,) x x x x x x x x x x U a b a U a b b a b U a b xU a b a a b U a b x U a b a ? ?? ???+?+=??+?+=-? 其中1(,)(1)(,)a b x U a b x x B a b =- 由于利用Beta 分布的分布函数计算t 分布,F 分布,二项分布时,参数a,b 的值要么是正整数,要么就是1/2的倍数。所以考虑参数a,b 的值是正整数或者是1/2倍数情况下I (a,b) x 的计算。此时递推公式初值选取有以下4种: 1111112,(,)(,)=1-222222x x a b U π===当时, 111,1(,1)),I (222 x x a b U x ===-当时, 1111 1,(1,)I (1,2222 x x a b U ===当时, 1,1(1,1)(1),I (1,1)=x x x a b U x x ===-当时, 3.t 分布函数的计算 I (a,b) x 与 t 分布的关系 2 1 11(,),0 222(|),11,0(,)222 x x n I t n T t n x n t n t I ?-?>?==?≤+???其中。由于n 为整数,所以n/2可以递归到?,即可以使用Beta 分布的递推公式。 4.F 分布函数计算 I (a,b) x 与 F 分布的关系 (|,)(,),22y m n mx F x m n I y n mx ==+其中。由于m,n 均为整数,所以m/2,n/2均可以 递归到?,?,即可以使用Beta 分布的递推公式。 5.二项分布函数的计算 由二项分布函数的定义:()[]00,0x |,)(1) ,01,x n k n k k k x B n p p p x n x n -=??=-≤??≥?∑( 再利用Beta 分布函数I (a,b) x 计算:即1x |,)([],[]1),0p B n p I n x x x n -=-+≤<( 6.卡方分布函数的计算 卡方分布函数H (x|n )的递推计算公式如下: (|)(|2)2(|),(3,4,.....)(|)(|2)2H x n H x n f x n n x f x n f x n n =--?? =?=-?-?其中1221(|)()22()2 n x x f x n e n --=Γ 则递推初值为2 22(|2)1,(|1)1(|1)21,(|2)2 x x x H x e f x H x f x e ---?=-= ???? =Φ-=?? 7.Poisson 分布函数的计算 []P x |1H 2|2x 1λλ=-+()(()),x ≥0 二、各分布函数分位数的计算 1.标准正态分布分位数的计算 采用精度达到 1.2x10 -8 的Toda 近似公式:110 2 () i i u y b y α≈∑,其中 []l n 4(1)y α α=-- b i 的各数值用数组B[11]表示如下: B[11]=(1.570796288,0.0370*******,-0.8364353589e-3,-0.2250947176e-3, 0.6841218299e-5,0.5824238515e-5,-0.1045274970e-5,0.8360937017e-7, -0.3231081277e-8,0.3657763036e-10,0.6936233982e-12) 2. t 分布函数的计算 由T 分布函数与I (a,b) x 的关系可得: 2 1110t 0,t t | n (,)1,x 2222t x n n T I n αααααα<<>=-= +当时,且满足()=1-其中由此得1(,)22x n I ,则122 1(,),t ()22t p n n n n ααβ-==+1-1 t 0t ()=-t ()2 n n αααα><当时,, 3. F 分布函数分位数的计算 F 分布的α分位数(m,)F n α满足(|m,)1F F n αα=-。由F 分布函数与Beta 分布函 数的关系得F α满足(|m ,) (,)1,y 22y mF m n F F n I n mF ααα α==-=+其中,则 (,)22 mF m n n mF αααβ=+, 所以(,) 22(m,)(1(,)) 22 m n n F n m n m αααββ=- 4. 卡方分布函数α分位数2()n αχ的计算 ①当n=1时,由H (x|1)=2Φ -1=1-α,得Φ =1-α/2, u α2 =,22(1)(u )ααχ2 = ②当n=2时,2 (2)χ分布就是12λ=的指数分布1 ()2 e ,由2(x |2)11x H e α-=-=-得 2(2)2ln αχα=- ③当n ≥3 时,23 2()[19n n u n ααχ2 ≈- +, 其中u α是标准正态分布的α分位数。 程序算法如下: #include #define Pi 3.141592653 #define MaxTime 500 //定义最大迭代步数 #define eps 1.0e-10 //定义精度 double KaFangFx(float x,int Freedom); double PoissonFx(float x,double p); double KaFangFx1(float x,int Freedom); double GaossFx1(float x); double KaFangUa0(float af,int Freedom); double KaFangUa(float af,int Freedom); double Gama(int n); double KaFangPx(float x,int Freedom); double GaossFx(float x); double GaossUa(float af); double GaossUa1(float af); double GaossPx(float x); double BetaFx(float x,double a,double b); double TdistFx(float x,int Freedom); double FdistFx(float x,int Freedom_m,int Freedom_n); double BetaUa(float af,double a,double b); double TdistUa(float af,int Freedom); double FdistUa(float af,int Freedom_m,int Freedom_n); double BinominalFx(float x,float p,int n); double BetaFx(float x,double a,double b)//贝塔分布函数{ int m,n; double I,U; double ta,tb; m=(int)(2*a); n=(int)(2*b); if(m%2==1&&n%2==1) { ta=0.5; tb=0.5; U=sqrt(x*(1.0-x))/Pi; I=1.0-2.0/Pi*atan(sqrt((1.0-x)/x)); } else if(m%2==1&&n%2==0) { ta=0.5; tb=1; U=0.5*sqrt(x)*(1.0-x); I=sqrt(x); } else if(m%2==0&&n%2==1) { ta=1; tb=0.5; U=0.5*x*sqrt(1.0-x); I=1.0-sqrt(1.0-x); } else if(m%2==0&&n%2==0) { ta=1; tb=1; U=x*(1.0-x); I=x; }