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

📄 chisquaretestimpl.java

📁 Apache的common math数学软件包
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements.  See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License.  You may obtain a copy of the License at * *      http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */package org.apache.commons.math.stat.inference;import org.apache.commons.math.MathException;import org.apache.commons.math.distribution.ChiSquaredDistribution;import org.apache.commons.math.distribution.ChiSquaredDistributionImpl;import org.apache.commons.math.distribution.DistributionFactory;/** * Implements Chi-Square test statistics defined in the * {@link UnknownDistributionChiSquareTest} interface. * * @version $Revision: 620312 $ $Date: 2008-02-10 12:28:59 -0700 (Sun, 10 Feb 2008) $ */public class ChiSquareTestImpl implements UnknownDistributionChiSquareTest {    /** Distribution used to compute inference statistics. */    private ChiSquaredDistribution distribution;      /**     * Construct a ChiSquareTestImpl      */    public ChiSquareTestImpl() {        this(new ChiSquaredDistributionImpl(1.0));    }    /**     * Create a test instance using the given distribution for computing     * inference statistics.     * @param x distribution used to compute inference statistics.     * @since 1.2     */    public ChiSquareTestImpl(ChiSquaredDistribution x) {        super();        setDistribution(x);    }     /**     * {@inheritDoc}     * <p><strong>Note: </strong>This implementation rescales the      * <code>expected</code> array if necessary to ensure that the sum of the     * expected and observed counts are equal.</p>     *      * @param observed array of observed frequency counts     * @param expected array of expected frequency counts     * @return chi-square test statistic     * @throws IllegalArgumentException if preconditions are not met     * or length is less than 2     */    public double chiSquare(double[] expected, long[] observed)        throws IllegalArgumentException {        if ((expected.length < 2) || (expected.length != observed.length)) {            throw new IllegalArgumentException(                    "observed, expected array lengths incorrect");        }        if (!isPositive(expected) || !isNonNegative(observed)) {            throw new IllegalArgumentException(                "observed counts must be non-negative and expected counts must be postive");        }        double sumExpected = 0d;        double sumObserved = 0d;        for (int i = 0; i < observed.length; i++) {            sumExpected += expected[i];            sumObserved += observed[i];        }        double ratio = 1.0d;        boolean rescale = false;        if (Math.abs(sumExpected - sumObserved) > 10E-6) {            ratio = sumObserved / sumExpected;            rescale = true;        }        double sumSq = 0.0d;        double dev = 0.0d;        for (int i = 0; i < observed.length; i++) {            if (rescale) {                dev = ((double) observed[i] - ratio * expected[i]);                sumSq += dev * dev / (ratio * expected[i]);            } else {                dev = ((double) observed[i] - expected[i]);                sumSq += dev * dev / expected[i];            }        }        return sumSq;    }    /**     * {@inheritDoc}     * <p><strong>Note: </strong>This implementation rescales the      * <code>expected</code> array if necessary to ensure that the sum of the     * expected and observed counts are equal.</p>     *      * @param observed array of observed frequency counts     * @param expected array of expected frequency counts     * @return p-value     * @throws IllegalArgumentException if preconditions are not met     * @throws MathException if an error occurs computing the p-value     */    public double chiSquareTest(double[] expected, long[] observed)        throws IllegalArgumentException, MathException {        distribution.setDegreesOfFreedom(expected.length - 1.0);        return 1.0 - distribution.cumulativeProbability(            chiSquare(expected, observed));    }    /**     * {@inheritDoc}     * <p><strong>Note: </strong>This implementation rescales the      * <code>expected</code> array if necessary to ensure that the sum of the     * expected and observed counts are equal.</p>     *      * @param observed array of observed frequency counts     * @param expected array of expected frequency counts     * @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     */    public boolean chiSquareTest(double[] expected, long[] observed,             double alpha) throws IllegalArgumentException, MathException {        if ((alpha <= 0) || (alpha > 0.5)) {            throw new IllegalArgumentException(                    "bad significance level: " + alpha);        }        return (chiSquareTest(expected, observed) < alpha);    }        /**     * @param counts array representation of 2-way table     * @return chi-square test statistic     * @throws IllegalArgumentException if preconditions are not met     */    public double chiSquare(long[][] counts) throws IllegalArgumentException {                checkArray(counts);        int nRows = counts.length;        int nCols = counts[0].length;                // compute row, column and total sums        double[] rowSum = new double[nRows];        double[] colSum = new double[nCols];        double total = 0.0d;        for (int row = 0; row < nRows; row++) {            for (int col = 0; col < nCols; col++) {                rowSum[row] += (double) counts[row][col];                colSum[col] += (double) counts[row][col];                total += (double) counts[row][col];            }        }                // compute expected counts and chi-square        double sumSq = 0.0d;        double expected = 0.0d;        for (int row = 0; row < nRows; row++) {            for (int col = 0; col < nCols; col++) {                expected = (rowSum[row] * colSum[col]) / total;                sumSq += (((double) counts[row][col] - expected) *                         ((double) counts[row][col] - expected)) / expected;             }        }         return sumSq;    }    /**     * @param counts array representation of 2-way table     * @return p-value     * @throws IllegalArgumentException if preconditions are not met     * @throws MathException if an error occurs computing the p-value     */    public double chiSquareTest(long[][] counts)    throws IllegalArgumentException, MathException {        checkArray(counts);        double df = ((double) counts.length -1) * ((double) counts[0].length - 1);        distribution.setDegreesOfFreedom(df);        return 1 - distribution.cumulativeProbability(chiSquare(counts));    }    /**     * @param counts array representation of 2-way table     * @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     */    public boolean chiSquareTest(long[][] counts, double alpha)    throws IllegalArgumentException, MathException {        if ((alpha <= 0) || (alpha > 0.5)) {            throw new IllegalArgumentException("bad significance level: " + alpha);        }        return (chiSquareTest(counts) < alpha);    }        /**     * @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 chi-square test statistic     * @throws IllegalArgumentException if preconditions are not met     * @since 1.2

⌨️ 快捷键说明

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