Source code for pygeostat.multivariate.utils

#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
Various tools to aid in multivariate geostatistics.
"""
__author__ = 'pygeostat development team'
__date__ = '2016-03-16'
__version__ = '1.000'

import numpy as np
import pandas as pd


[docs] def mds(data, variables=None): """ Python implementation of the MDS coordinates calculated by the CCG program corrmat when set to 'ordination' mode. MDS coordinates are calculate from the correlation matrix .. seealso:: 1. Deutsch, M. V, & Deutsch, C. V. (2013). A Program to Calculate and Display Correlation Matrices with Relevant Analysis. Edmonton AB. Retrieved from http://www.ccgalberta.com Parameters: data: Tidy (long-form) 2-D data where each column is a variable and each row is an observation. A pandas dataframe or numpy array may be passed. variables (list): Variables from the pd.DataFrame passed with ``data`` to calculate coordinates for Returns: coords (pd.DataFrame): The 3-D MDS coordinates calculated .. codeauthor:: pygeostat development team 2016-05-30 """ # Calculate the correlation matrix if isinstance(data, pd.DataFrame) and (variables is not None): corrmat = data[variables].corr() else: corrmat = np.corrcoef(data, rowvar=0) nvar = corrmat.shape[0] # Calculate the MDS coordinates as done in the program 'corrmat' proxmat = 1 - corrmat imat = np.identity(nvar) jmat = imat - (1 / nvar) bmat = np.dot(jmat, proxmat) bmat = -0.5 * np.dot(bmat, jmat) eigval, eigvec = np.linalg.eig(bmat) eigval.sort() eigval = eigval[::-1] eigvalmat = np.zeros((3, 3)) for i in range(3): for j in range(3): if i == j: eigvalmat[i, j] = np.sqrt(abs(eigval[i])) coords = np.dot(eigvec[:, :3], eigvalmat) coords[:, 0] = coords[:, 0] * -1 coords[:, 2] = coords[:, 2] * -1 # Save the coordinates as a pd.DataFrame and return coords = pd.DataFrame(data=coords, columns=['X1', 'X2', 'X3']) return coords