|
Java example source code file (KendallsCorrelation.java)
The KendallsCorrelation.java Java example source code/* * 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.math3.stat.correlation; import org.apache.commons.math3.exception.DimensionMismatchException; import org.apache.commons.math3.linear.BlockRealMatrix; import org.apache.commons.math3.linear.MatrixUtils; import org.apache.commons.math3.linear.RealMatrix; import org.apache.commons.math3.util.FastMath; import org.apache.commons.math3.util.Pair; import java.util.Arrays; import java.util.Comparator; /** * Implementation of Kendall's Tau-b rank correlation</a>. * <p> * A pair of observations (x<sub>1, y1) and * (x<sub>2, y2) are considered concordant if * x<sub>1 < x2 and y1 < y2 * or x<sub>2 < x1 and y2 < y1. * The pair is <i>discordant if x1 < x2 and * y<sub>2 < y1 or x2 < x1 and * y<sub>1 < y2. If either x1 = x2 * or y<sub>1 = y2, the pair is neither concordant nor * discordant. * <p> * Kendall's Tau-b is defined as: * <pre> * tau<sub>b = (nc - nd) / sqrt((n0 - n1) * (n0 - n2)) * </pre> * <p> * where: * <ul> * <li>n0 = n * (n - 1) / 2 * <li>nc = Number of concordant pairs * <li>nd = Number of discordant pairs * <li>n1 = sum of ti * (ti - 1) / 2 for all i * <li>n2 = sum of uj * (uj - 1) / 2 for all j * <li>ti = Number of tied values in the ith group of ties in x * <li>uj = Number of tied values in the jth group of ties in y * </ul> * <p> * This implementation uses the O(n log n) algorithm described in * William R. Knight's 1966 paper "A Computer Method for Calculating * Kendall's Tau with Ungrouped Data" in the Journal of the American * Statistical Association. * * @see <a href="http://en.wikipedia.org/wiki/Kendall_tau_rank_correlation_coefficient"> * Kendall tau rank correlation coefficient (Wikipedia)</a> * @see <a href="http://www.jstor.org/stable/2282833">A Computer * Method for Calculating Kendall's Tau with Ungrouped Data</a> * * @since 3.3 */ public class KendallsCorrelation { /** correlation matrix */ private final RealMatrix correlationMatrix; /** * Create a KendallsCorrelation instance without data. */ public KendallsCorrelation() { correlationMatrix = null; } /** * Create a KendallsCorrelation from a rectangular array * whose columns represent values of variables to be correlated. * * @param data rectangular array with columns representing variables * @throws IllegalArgumentException if the input data array is not * rectangular with at least two rows and two columns. */ public KendallsCorrelation(double[][] data) { this(MatrixUtils.createRealMatrix(data)); } /** * Create a KendallsCorrelation from a RealMatrix whose columns * represent variables to be correlated. * * @param matrix matrix with columns representing variables to correlate */ public KendallsCorrelation(RealMatrix matrix) { correlationMatrix = computeCorrelationMatrix(matrix); } /** * Returns the correlation matrix. * * @return correlation matrix */ public RealMatrix getCorrelationMatrix() { return correlationMatrix; } /** * Computes the Kendall's Tau rank correlation matrix for the columns of * the input matrix. * * @param matrix matrix with columns representing variables to correlate * @return correlation matrix */ public RealMatrix computeCorrelationMatrix(final RealMatrix matrix) { int nVars = matrix.getColumnDimension(); RealMatrix outMatrix = new BlockRealMatrix(nVars, nVars); for (int i = 0; i < nVars; i++) { for (int j = 0; j < i; j++) { double corr = correlation(matrix.getColumn(i), matrix.getColumn(j)); outMatrix.setEntry(i, j, corr); outMatrix.setEntry(j, i, corr); } outMatrix.setEntry(i, i, 1d); } return outMatrix; } /** * Computes the Kendall's Tau rank correlation matrix for the columns of * the input rectangular array. The columns of the array represent values * of variables to be correlated. * * @param matrix matrix with columns representing variables to correlate * @return correlation matrix */ public RealMatrix computeCorrelationMatrix(final double[][] matrix) { return computeCorrelationMatrix(new BlockRealMatrix(matrix)); } /** * Computes the Kendall's Tau rank correlation coefficient between the two arrays. * * @param xArray first data array * @param yArray second data array * @return Returns Kendall's Tau rank correlation coefficient for the two arrays * @throws DimensionMismatchException if the arrays lengths do not match */ public double correlation(final double[] xArray, final double[] yArray) throws DimensionMismatchException { if (xArray.length != yArray.length) { throw new DimensionMismatchException(xArray.length, yArray.length); } final int n = xArray.length; final long numPairs = sum(n - 1); @SuppressWarnings("unchecked") Pair<Double, Double>[] pairs = new Pair[n]; for (int i = 0; i < n; i++) { pairs[i] = new Pair<Double, Double>(xArray[i], yArray[i]); } Arrays.sort(pairs, new Comparator<Pair Other Java examples (source code examples)Here is a short list of links related to this Java KendallsCorrelation.java source code file: |
... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2021 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.