我是靠谱客的博主 难过大门,最近开发中收集的这篇文章主要介绍Java计算卡方值和P值1.计算卡方值和P值2.伽马函数3.不完全伽马函数,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

  • 1.计算卡方值和P值
  • 2.伽马函数
  • 3.不完全伽马函数

1.计算卡方值和P值

P值就是计算卡方分布的分布函数值,公式如下:

F(x;k)=γ(k2,x2)Γ(k2)=P(k2,x2) F ( x ; k ) = γ ( k 2 , x 2 ) Γ ( k 2 ) = P ( k 2 , x 2 )

其中,分子为不完全伽马函数,分母为伽马函数。

/**
 * 计算卡方值和P值
 * @description
 */
public class ChiSquareAndPValue {

    /**
     * 自由度v=(行数-1)(列数-1)
     * @param rowNum
     * @param columnNum
     * @return
     */
    public static int degreeOfFreedomValue(int rowNum, int columnNum) {
        if (rowNum < 0 || columnNum < 0) {
            return 0;
        }
        return (rowNum - 1) * (columnNum - 1);
    }

    /**
     * 四格表格式计算卡方值
     * 卡方值=n(ad-bc)^2/(a+b)(c+d)(a+c)(b+d)
     */
    public static double chisquareValue(int a, int b, int c, int d) {
        if (a < 1 || b < 1 || c < 1 || d < 1) {
            return 0;
        }
        int n = a + b + c + d;
        double f = n * Math.pow((a * d - b * c), 2);
        double m = (a + b) * (c + d) * (a + c) * (b + d);
        double s = f / m;
        return s;
    }

    /**
     * 根据自由度和卡方值计算P值
     * @param dof 自由度
     * @param chi_squared 卡方值
     * @return
     */
    public static double chisqr2pValue(int dof, double chi_squared) {
        if (chi_squared < 0 || dof < 1) {
            return 0.0;
        }
        double k = ((double) dof) * 0.5;
        double v = chi_squared * 0.5;
        if (dof == 2) {
            return Math.exp(-1.0 * v);
        }
        double incompleteGamma = IncompleteGamma.log_igf(k, v);
        // 如果过小或者非数值或者无穷
        if (Math.exp(incompleteGamma) <= 1e-8 || Double.isNaN(Math.exp(incompleteGamma))
                || Double.isInfinite(Math.exp(incompleteGamma))) {
            return 1e-14;
        }
        double gamma = Math.log(Gamma.getApproxGamma(k));
        incompleteGamma -= gamma;
        if (Math.exp(incompleteGamma) > 1) {
            return 1e-14;
        }
        double pValue = 1.0 - Math.exp(incompleteGamma);
        return (double) pValue;
    }

}

2.伽马函数

斯特灵求伽马函数的近似公式:

Γ(z)2πz(1e(z+112z110z))z Γ ( z ) ≈ 2 π z ( 1 e ( z + 1 12 z − 1 10 z ) ) z

public class Gamma {
    /**
     * 求伽马函数的近似公式
     * @param n
     * @return
     */
    public static double getApproxGamma(double n) {  
        // RECIP_E = (E^-1) = (1.0 / E)  
        double RECIP_E = 0.36787944117144232159552377016147;  
        // TWOPI = 2.0 * PI  
        double TWOPI = 6.283185307179586476925286766559;  
        double d = 1.0 / (10.0 * n);  
        d = 1.0 / ((12* n) - d);  
        d = (d + n) *RECIP_E;  
        d = Math.pow(d,n);  
        d *= Math.sqrt(TWOPI/ n);  
        return d;  
    }
}

3.不完全伽马函数

不完全伽马函数计算公式:

γ(s,z)=s1zsezM(1,s+1,z) γ ( s , z ) = s − 1 z s e − z M ( 1 , s + 1 , z )

其中M函数是合连几何函数,计算公式:

M(1,s+1,z)=1+zs+1+z2(s+1)(s+2)+z3(s+1)(s+2)(s+3)+ M ( 1 , s + 1 , z ) = 1 + z s + 1 + z 2 ( s + 1 ) ( s + 2 ) + z 3 ( s + 1 ) ( s + 2 ) ( s + 3 ) + ⋯

public class IncompleteGamma {
    /**
     * 不完全伽马函数
     * @param s
     * @param z
     * @return
     */
    public static double log_igf(double s, double z) {  
        if (z < 0.0) {  
            return 0.0;  
        }  
        double sc = (Math.log(z) * s) - z - Math.log(s);  
        double k = KM(s, z);  
        return Math.log(k) + sc;  
    }  

    private static double KM(double s, double z) {  
        double sum = 1.0;  
        double nom = 1.0;  
        double denom = 1.0;  
        double log_nom = Math.log(nom);  
        double log_denom = Math.log(denom);  
        double log_s = Math.log(s);  
        double log_z = Math.log(z);  
        for (int i = 0; i < 1000; ++i) {  
           log_nom += log_z;  
           s++;  
           log_s = Math.log(s);  
           log_denom += log_s;  
            double log_sum = log_nom - log_denom;  
           sum += Math.exp(log_sum);  
        }  
        return sum;  
    } 
}

本文参考:
卡方检验值转换为P值

最后

以上就是难过大门为你收集整理的Java计算卡方值和P值1.计算卡方值和P值2.伽马函数3.不完全伽马函数的全部内容,希望文章能够帮你解决Java计算卡方值和P值1.计算卡方值和P值2.伽马函数3.不完全伽马函数所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(46)

评论列表共有 0 条评论

立即
投稿
返回
顶部