Source code for chaospy.descriptives.correlation.spearman

"""Spearman's correlation coefficient."""
import numpy
from scipy.stats import spearmanr

import numpoly
import chaospy


[docs]def Spearman(poly, dist=None, sample=10000, retall=False, **kws): """ Calculate Spearman's rank-order correlation coefficient. Args: poly (numpoly.ndpoly): Polynomial of interest. dist (Distribution): Defines the space where correlation is taken. sample (int): Number of samples used in estimation. retall (bool): If true, return p-value as well. Returns: (float, numpy.ndarray): Correlation output ``rho``. Of type float if two-dimensional problem. Correleation matrix if larger. (float, numpy.ndarray): The two-sided p-value for a hypothesis test whose null hypothesis is that two sets of data are uncorrelated, has same dimension as ``rho``. Examples: >>> distribution = chaospy.MvNormal( ... [3, 4], [[2, .5], [.5, 1]]) >>> corr, pvalue = chaospy.Spearman(distribution, sample=50, retall=True) >>> corr.round(4) array([[1. , 0.603], [0.603, 1. ]]) >>> pvalue.round(8) array([[0.00e+00, 3.58e-06], [3.58e-06, 0.00e+00]]) """ if isinstance(poly, chaospy.Distribution): poly, dist = numpoly.variable(len(poly)), poly else: poly = numpoly.polynomial(poly) samples = dist.sample(sample, **kws) corr = numpy.eye(len(poly)) pval = numpy.zeros((len(poly), len(poly))) evals = poly.ravel()(*samples) assert len(poly) == len(evals) for idx in range(len(poly)): for idy in range(idx + 1, len(poly)): if idx == idy: pass spear = spearmanr(evals[idx], evals[idy]) pval[idx, idy] = pval[idy, idx] = spear.pvalue corr[idx, idy] = corr[idy, idx] = spear.correlation if retall: return corr, pval return corr