⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chisquaretestimpl.java

📁 Apache的common math数学软件包
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
     */    public double chiSquareDataSetsComparison(long[] observed1, long[] observed2)        throws IllegalArgumentException {                // Make sure lengths are same        if ((observed1.length < 2) || (observed1.length != observed2.length)) {            throw new IllegalArgumentException(                    "oberved1, observed2 array lengths incorrect");        }        // Ensure non-negative counts        if (!isNonNegative(observed1) || !isNonNegative(observed2)) {            throw new IllegalArgumentException(                "observed counts must be non-negative");        }        // Compute and compare count sums        long countSum1 = 0;        long countSum2 = 0;        boolean unequalCounts = false;        double weight = 0.0;        for (int i = 0; i < observed1.length; i++) {            countSum1 += observed1[i];            countSum2 += observed2[i];           }        // Ensure neither sample is uniformly 0        if (countSum1 * countSum2 == 0) {            throw new IllegalArgumentException(             "observed counts cannot all be 0");         }        // Compare and compute weight only if different        unequalCounts = (countSum1 != countSum2);        if (unequalCounts) {            weight = Math.sqrt((double) countSum1 / (double) countSum2);        }        // Compute ChiSquare statistic        double sumSq = 0.0d;        double dev = 0.0d;        double obs1 = 0.0d;        double obs2 = 0.0d;        for (int i = 0; i < observed1.length; i++) {            if (observed1[i] == 0 && observed2[i] == 0) {                throw new IllegalArgumentException(                        "observed counts must not both be zero");            } else {                obs1 = (double) observed1[i];                obs2 = (double) observed2[i];                if (unequalCounts) { // apply weights                    dev = obs1/weight - obs2 * weight;                } else {                    dev = obs1 - obs2;                }                sumSq += (dev * dev) / (obs1 + obs2);            }        }        return sumSq;    }    /**     * @param observed1 array of observed frequency counts of the first data set     * @param observed2 array of observed frequency counts of the second data set     * @return p-value     * @throws IllegalArgumentException if preconditions are not met     * @throws MathException if an error occurs computing the p-value     * @since 1.2     */    public double chiSquareTestDataSetsComparison(long[] observed1, long[] observed2)        throws IllegalArgumentException, MathException {        distribution.setDegreesOfFreedom((double) observed1.length - 1);        return 1 - distribution.cumulativeProbability(                chiSquareDataSetsComparison(observed1, observed2));    }    /**     * @param observed1 array of observed frequency counts of the first data set     * @param observed2 array of observed frequency counts of the second data set     * @param alpha significance level of the test     * @return true iff null hypothesis can be rejected with confidence     * 1 - alpha     * @throws IllegalArgumentException if preconditions are not met     * @throws MathException if an error occurs performing the test     * @since 1.2     */    public boolean chiSquareTestDataSetsComparison(long[] observed1, long[] observed2,            double alpha) throws IllegalArgumentException, MathException {        if ((alpha <= 0) || (alpha > 0.5)) {            throw new IllegalArgumentException(                    "bad significance level: " + alpha);        }        return (chiSquareTestDataSetsComparison(observed1, observed2) < alpha);    }    /**     * Checks to make sure that the input long[][] array is rectangular,     * has at least 2 rows and 2 columns, and has all non-negative entries,     * throwing IllegalArgumentException if any of these checks fail.     *      * @param in input 2-way table to check     * @throws IllegalArgumentException if the array is not valid     */    private void checkArray(long[][] in) throws IllegalArgumentException {                if (in.length < 2) {            throw new IllegalArgumentException("Input table must have at least two rows");        }                if (in[0].length < 2) {            throw new IllegalArgumentException("Input table must have at least two columns");        }                    if (!isRectangular(in)) {            throw new IllegalArgumentException("Input table must be rectangular");        }                if (!isNonNegative(in)) {            throw new IllegalArgumentException("All entries in input 2-way table must be non-negative");        }            }        //---------------------  Protected methods ---------------------------------    /**     * Gets a DistributionFactory to use in creating ChiSquaredDistribution instances.     * @deprecated inject ChiSquaredDistribution instances directly instead of     *             using a factory.     */    protected DistributionFactory getDistributionFactory() {        return DistributionFactory.newInstance();    }        //---------------------  Private array methods -- should find a utility home for these        /**     * Returns true iff input array is rectangular.     *      * @param in array to be tested     * @return true if the array is rectangular     * @throws NullPointerException if input array is null     * @throws ArrayIndexOutOfBoundsException if input array is empty     */    private boolean isRectangular(long[][] in) {        for (int i = 1; i < in.length; i++) {            if (in[i].length != in[0].length) {                return false;            }        }          return true;    }        /**     * Returns true iff all entries of the input array are > 0.     * Returns true if the array is non-null, but empty     *      * @param in array to be tested     * @return true if all entries of the array are positive     * @throws NullPointerException if input array is null     */    private boolean isPositive(double[] in) {        for (int i = 0; i < in.length; i ++) {            if (in[i] <= 0) {                return false;            }        }        return true;    }        /**     * Returns true iff all entries of the input array are >= 0.     * Returns true if the array is non-null, but empty     *      * @param in array to be tested     * @return true if all entries of the array are non-negative     * @throws NullPointerException if input array is null     */    private boolean isNonNegative(long[] in) {        for (int i = 0; i < in.length; i ++) {            if (in[i] < 0) {                return false;            }        }        return true;    }        /**     * Returns true iff all entries of (all subarrays of) the input array are >= 0.     * Returns true if the array is non-null, but empty     *      * @param in array to be tested     * @return true if all entries of the array are non-negative     * @throws NullPointerException if input array is null     */    private boolean isNonNegative(long[][] in) {        for (int i = 0; i < in.length; i ++) {            for (int j = 0; j < in[i].length; j++) {                if (in[i][j] < 0) {                    return false;                }            }        }        return true;    }     /**     * Modify the distribution used to compute inference statistics.     *      * @param value     *            the new distribution     * @since 1.2     */    public void setDistribution(ChiSquaredDistribution value) {        distribution = value;    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -