Commit 4ffde83e by Eric Coissac

Merge branch 'Release-1.0' into 'master'

Release 1.0

See merge request !2
parents cb0a71e2 4976bcea
^.*\.Rproj$
^\.Rproj\.user$
^LICENCE-CECILL-2.1.txt$
LICENCE-CECILL-2.1.txt
Package: ProcMod
Type: Package
Title: Informative Procrustean Matrix Correlation
Version: 1.0.0
Version: 1.0.2
Author: Eric Coissac, Christelle Gonindard-Melodelima
Maintainer: Eric Coissac <eric.coissac@metabarcoding.org>
Description: Estimates procrustean corrected correlation between matrices for removing overfitting effect.
License: CECILL-2.1
Description: Estimates corrected Procrustean correlation between matrices for removing overfitting effect.
License: CeCILL-2
Encoding: UTF-8
LazyData: true
RoxygenNote: 6.1.1
......@@ -16,16 +16,16 @@ Imports: MASS,
Matrix,
mvtnorm,
stats,
doParallel,
foreach,
Rdpack
Suggests: knitr,
rmarkdown,
roxygen2,
vegan,
testthat
testthat,
ade4,
doParallel
RdMacros: Rdpack
VignetteBuilder: knitr
Collate:
'internals.R'
'procmod_frame.R'
......
......@@ -34,11 +34,10 @@ export(pca)
export(pcoa)
export(procmod_frame)
export(protate)
export(rmatrix)
export(simulate_correlation)
export(simulate_matrix)
export(varls)
import(MASS)
import(doParallel)
import(foreach)
import(permute)
import(stats)
......
......@@ -67,6 +67,18 @@ NULL
#' \insertRef{Jackson:95:00}{ProcMod}
#' }
#'
#' @examples
#' A <- simulate_matrix(10,3)
#' B <- simulate_matrix(10,5)
#' C <- simulate_correlation(B,10,r2=0.6)
#'
#' # Computes the correlation matrix
#' data <- procmod_frame(A = A, B = B, C = C)
#'
#' corls_test(A, B, permutations = 100)
#' corls_test(B, C, permutations = 100)
#' corls_test(data, permutations = 100)
#'
#' @seealso \code{\link[stats]{p.adjust}}
#'
#' @author Eric Coissac
......@@ -95,7 +107,7 @@ corls_test <- function(...,
xs <- ortho(xs)
cov <- varls(xs, nperm = 0)
cov <- varls(xs, nrand = 0)
lcov <- cov - eps
ngreater <- array(0,dim = dim(cov))
......@@ -123,7 +135,7 @@ corls_test <- function(...,
function(j) xs[[j]][pmatrix[ps[j], ], ]
)
),
nperm = 0
nrand = 0
)
ngreater <- ngreater + (
rcov >= lcov)
......
#' @include procmod.R
#' @include procmod_frame.R
#' @include multivariate.R
#' @import doParallel
#' @import foreach
#' @import stats
#'
......@@ -9,8 +8,8 @@
#' @author Eric Coissac
NULL
library(doParallel)
registerDoParallel(1)
.has_doParallel <- is.element("doParallel",installed.packages())
if (.has_doParallel) require(doParallel)
#' Compute the trace of a square matrix.
#'
......@@ -125,15 +124,24 @@ registerDoParallel(1)
#'
#' @examples
#' # Build Three matrices of 3 rows.
#' A <- matrix(1:9, nrow = 3)
#' B <- matrix(10:15, nrow = 3)
#' C <- matrix(20:31, nrow = 3)
#' # compute the variance covariance matrix
#' A <- simulate_matrix(10,3)
#' B <- simulate_matrix(10,5)
#' C <- simulate_correlation(B,10,r2=0.6)
#'
#' # Computes the variance covariance matrix
#' varls(A, B, C)
#' varls(A = A, B = B, C = C)
#'
#' data = procmod_frame(A = A, B = B, C = C)
#' varls(data)
#'
#' # Computes the correlation matrix
#' corls(data, nrand = 500)
#'
#' # Computes the partial correlation matrix
#' corls_partial(data)
#' corls_partial(data, nrand = 0)
#'
#' @author Eric Coissac
#' @author Christelle Gonindard-Melodelima
#'
......@@ -193,10 +201,15 @@ varls <- function(...,
for (i in seq_len(nx))
v_xs[[i]] <- var(xs[[i]])
if (! getDoParRegistered()) registerDoParallel(1)
if (.has_doParallel && getDoParRegistered()) {
`%dp%` <- `%dopar%`
}
else{
`%dp%` <- `%do%`
}
s_cov_xxs <- foreach(k = seq_len(nrand),
.combine = cbind) %dopar% {
.combine = cbind) %dp% {
s1_cov_xxs <- matrix(0, nrow = nx, ncol = nx)
r_xs <- vector(mode = "list", nx)
r_ys <- vector(mode = "list", nx)
......@@ -297,12 +310,24 @@ corls_partial <- function(..., nrand = 100) {
make_subS3Class(rp, "procmod_corls")
}
#' Print procrustean variance / covariance matrix.
#' Print procrustean Variance / Covariance Matrix.
#'
#' @param x a \code{procmod_varls}
#' object
#' @param ... other parameters passed to other functions
#'
#' @examples
#' # Build Three matrices of 3 rows.
#' A <- simulate_matrix(10,3)
#' B <- simulate_matrix(10,5)
#' C <- simulate_correlation(B,10,r2=0.6)
#'
#' # Computes the variance covariance matrix
#' data <- procmod_frame(A = A, B = B, C = C)
#' v <- varls(data, nrand = 1000)
#'
#' print(v)
#'
#' @seealso \code{\link[ProcMod]{varls}}
#'
#' @author Eric Coissac
......@@ -323,6 +348,27 @@ print.procmod_varls <- function(x, ...) {
attr(x,name)
}
#' The Names of the elements of a Variance / Covariance Matrix.
#'
#' Returns the names of the elements associated to a \code{procmod_varls}
#' object.
#'
#' @param x a \code{procmod_varls} object
#'
#' @examples
#' # Build Three matrices of 3 rows.
#' A <- simulate_matrix(10,3)
#' B <- simulate_matrix(10,5)
#' C <- simulate_correlation(B,10,r2=0.6)
#'
#' # Computes the variance covariance matrix
#' data <- procmod_frame(A = A, B = B, C = C)
#' v <- varls(data, nrand = 1000)
#'
#' names(v)
#'
#' @seealso \code{\link[ProcMod]{varls}}
#'
#' @author Eric Coissac
#' @author Christelle Gonindard-Melodelima
#' @export
......@@ -334,12 +380,24 @@ names.procmod_varls <- function(x) {
}
#' Print procrustean correlation matrix.
#' Print a procrustean Correlation Matrix.
#'
#' @param x a \code{procmod_corls}
#' object
#' @param ... other parameters passed to other functions
#'
#' @examples
#' # Build Three matrices of 3 rows.
#' A <- simulate_matrix(10,3)
#' B <- simulate_matrix(10,5)
#' C <- simulate_correlation(B,10,r2=0.6)
#'
#' # Computes the correlation matrix
#' data <- procmod_frame(A = A, B = B, C = C)
#' cls <- corls(data, nrand = 1000)
#'
#' print(cls)
#'
#' @seealso \code{\link[ProcMod]{corls}}
#'
#' @author Eric Coissac
......@@ -362,6 +420,27 @@ print.procmod_corls <- function(x, ...) {
}
#' The Names of the elements of a Correlation Matrix
#'
#' Returns the names of the elements associated to a \code{procmod_corls}
#' object.
#'
#' @param x a \code{procmod_corls} object
#'
#' @examples
#' # Build Three matrices of 3 rows.
#' A <- simulate_matrix(10,3)
#' B <- simulate_matrix(10,5)
#' C <- simulate_correlation(B,10,r2=0.6)
#'
#' # Computes the correlation matrix
#' data <- procmod_frame(A = A, B = B, C = C)
#' cls <- corls(data, nrand = 1000)
#'
#' names(cls)
#'
#' @seealso \code{\link[ProcMod]{corls}}
#'
#' @author Eric Coissac
#' @author Christelle Gonindard-Melodelima
#' @export
......
......@@ -22,6 +22,16 @@ NULL
#' \code{\link[base]{matrix}} method.
#' @param ... additional arguments to be passed to or from methods.
#'
#' @examples
#' data(bacteria)
#' bacteria_rel_freq <- sweep(bacteria,
#' 1,
#' rowSums(bacteria),
#' "/")
#' bacteria_hellinger <- sqrt(bacteria_rel_freq)
#' bacteria_dist <- dist(bacteria_hellinger)
#' bdf <- as.data.frame(bacteria_dist)
#'
#' @author Eric Coissac
#' @author Christelle Gonindard-Melodelima
#' @export
......@@ -62,6 +72,17 @@ as.data.frame.dist <- function(x, row.names = NULL, optional = FALSE, ...) {
#' \code{n} the number pf observations. This matrix defines the
#' coordinates of each point in the orthogonal space.
#'
#' @examples
#' data(bacteria)
#' bacteria_rel_freq <- sweep(bacteria,
#' 1,
#' rowSums(bacteria),
#' "/")
#' bacteria_hellinger <- sqrt(bacteria_rel_freq)
#' bacteria_dist <- dist(bacteria_hellinger)
#'
#' project <- nmds(bacteria_dist)
#'
#' @author Eric Coissac
#' @author Christelle Gonindard-Melodelima
#' @export
......@@ -117,6 +138,17 @@ nmds <- function(distances,
#' \code{n} the number pf observations. This matrix defines the
#' coordinates of each point in the orthogonal space.
#'
#' @examples
#' data(bacteria)
#' bacteria_rel_freq <- sweep(bacteria,
#' 1,
#' rowSums(bacteria),
#' "/")
#' bacteria_hellinger <- sqrt(bacteria_rel_freq)
#' bacteria_dist <- dist(bacteria_hellinger)
#'
#' project <- pcoa(bacteria_dist)
#'
#' @author Eric Coissac
#' @author Christelle Gonindard-Melodelima
#' @export
......@@ -154,6 +186,16 @@ pcoa <- function(distances) {
#' \code{n} the number pf observations. This matrix defines the
#' coordinates of each point in the orthogonal space.
#'
#' @examples
#' data(bacteria)
#' bacteria_rel_freq <- sweep(bacteria,
#' 1,
#' rowSums(bacteria),
#' "/")
#' bacteria_hellinger <- sqrt(bacteria_rel_freq)
#'
#' project <- pca(bacteria_hellinger)
#'
#' @author Eric Coissac
#' @author Christelle Gonindard-Melodelima
#' @export
......@@ -184,6 +226,12 @@ pca <- function(data, scale = FALSE) {
#' @return a \code{numeric} matrix centred by rows
#' and columns
#'
#' @examples
#' data(bacteria)
#' bact_bc <- bicenter(bacteria)
#' sum(rowSums(bact_bc))
#' sum(colSums(bact_bc))
#'
#' @author Eric Coissac
#' @author Christelle Gonindard-Melodelima
#' @export
......@@ -208,6 +256,21 @@ bicenter <- function(m) {
#' considered positive if it is larger than
#' -tol*lambda1 where lambda1 is the largest eigenvalue.
#'
#' @examples
#' library(vegan)
#' data(bacteria)
#'
#' bacteria_rel_freq <- sweep(bacteria,
#' 1,
#' rowSums(bacteria),
#' "/")
#'
#' bacteria_bray <- vegdist(bacteria_rel_freq,method = "bray")
#' is_euclid(bacteria_bray)
#'
#' bacteria_chao <- vegdist(floor(bacteria*10000),method = "chao")
#' is_euclid(bacteria_chao)
#'
#' @author Eric Coissac
#' @author Christelle Gonindard-Melodelima
#' @export
......@@ -258,6 +321,33 @@ is_orthogonal <- function(x) {
#' \code{n} the number pf observations. This matrix defines the
#' coordinates of each point in the orthogonal space.
#'
#' @examples
#' library(vegan)
#' data(bacteria)
#' data(eukaryotes)
#' data(soil)
#'
#' dataset <- procmod_frame(euk = vegdist(decostand(eukaryotes,
#' method = "hellinger"),
#' method = "euclidean"),
#' bac = vegdist(decostand(bacteria,
#' method = "hellinger"),
#' method = "euclidean"),
#' soil = scale(soil,
#' center = TRUE,
#' scale = TRUE))
#'
#' dp <- ortho(dataset)
#'
#' bacteria_rel_freq <- sweep(bacteria,
#' 1,
#' rowSums(bacteria),
#' "/")
#' bacteria_hellinger <- sqrt(bacteria_rel_freq)
#' bacteria_dist <- dist(bacteria_hellinger)
#'
#' project <- ortho(bacteria_dist)
#'
#' @author Eric Coissac
#' @author Christelle Gonindard-Melodelima
#' @export
......
#' @title Informative Procrustean Matrix Correlation
#' @name procmod
#' @description Estimates corrected Procrustean correlation between
#' matrices for removing overfitting effect.
#' @details
#' The functions in the ProcMod package aims to estimate and to test correlation
#' between matrices, correcting for the spurious correlations because of the
#' over-fitting effect.
#'
#' The ProcMod package is developed on the metabarcoding.org gitlab
#' (https://git.metabarcoding.org/lecasofts/ProcMod).
#' The gitlab of metabarcoding.org provides up-to-date information and
#' forums for bug reports.
#'
#' @author Christelle Gonindard-Melodelima
#' @author Eric Coissac
#'
#' @docType package
#' @importFrom Rdpack reprompt
NULL
......@@ -8,7 +25,8 @@ NULL
#' is a simplified version of a full data set
#' describing biodiversity changes along a South-North
#' gradient on the Australian East Coast, from Sidney to
#' North Cap. The gradient is constituted of 21 locations.
#' North Cap using a DNA metabarcoding approach.
#' The gradient is constituted of 21 locations.
#'
#' \describe{
#' \item{bacteria}{is a 21 x 2150 \code{data.frame} describing bacterial
......
......@@ -309,6 +309,18 @@ procmod_frame <- function(...,
#' \code{TRUE} if \code{x} is a \code{procmod_frame},
#' \code{FALSE} otherwise.
#'
#' @examples
#' # Builds a procmod_frame with two random matrices
#' m1 <- simulate_matrix(10,20)
#' m2 <- simulate_matrix(10,30)
#' pmf <- procmod_frame(m1 = m1, m2 = m2)
#'
#' # Returns TRUE
#' is_procmod_frame(pmf)
#'
#' # Returns FALSE
#' is_procmod_frame(3)
#'
#' @author Eric Coissac
#' @author Christelle Gonindard-Melodelima
#' @export
......@@ -327,6 +339,28 @@ is_procmod_frame <- function(x) {
#' implementation of that method
#' @return a \code{procmod_frame} object
#'
#' @examples
#' # Builds a list containing two random matrices
#' m1 <- simulate_matrix(10,20)
#' m2 <- simulate_matrix(10,30)
#' l <- list(m1 = m1, m2 = m2)
#'
#' # Converts the list to a procmod_frame
#' pmf1 <- as_procmod_frame(l)
#'
#' # Builds a procmod_frame from a matrix
#' m3 <- matrix(1:12,nrow=3)
#' pmf2 <- as_procmod_frame(matrix(1:12,nrow=3))
#' # Returns 4, the column count of the input matrix
#' length(pmf2)
#'
#' # Builds a 3D array
#' a <- array(1:24,dim = c(3,4,2))
#'
#' # The conversion to a procmod_frame makes
#' # an procmod element from each third dimension
#' as_procmod_frame(a)
#'
#' @author Eric Coissac
#' @author Christelle Gonindard-Melodelima
#' @export
......@@ -390,9 +424,20 @@ as_procmod_frame.matrix <- function(data, ...) {
#' Dimensions of a ProcMod Frame.
#'
#' Dimension 1 is the number of rows (individus)
#' shared by the aggregated matrices. Dimension 2
#' is the number of aggregated matrices
#'
#' @param x a \code{\link[ProcMod]{procmod_frame}}
#' object
#'
#' @examples
#' # Builds a procmod_frame with two random matrices
#' m1 <- simulate_matrix(10,20)
#' m2 <- simulate_matrix(10,30)
#' pmf <- procmod_frame(m1 = m1, m2 = m2)
#' dim(pmf)
#'
#' @author Eric Coissac
#' @author Christelle Gonindard-Melodelima
#' @export
......@@ -504,6 +549,58 @@ dim.procmod_frame <- function(x)
y
}
#' Subsetting Procmod Frames
#'
#' This is the implementation of the \code{\link[base]{subset}} generic function for
#' \code{procmod_frame}.
#'
#' The subset argument works on rows. Note that subset will be evaluated in the
#' \code{procmod_frame}, so columns can be referred to (by name) as variables
#' in the expression (see the examples).
#'
#' The select argument if provided indicates with matrices
#' have to be conserved. It works by first replacing column names in the selection
#' expression with the corresponding column numbers in the \code{procmod_frame} and then using
#' the resulting integer vector to index the columns. This allows the use of the
#' standard indexing conventions so that for example ranges of columns can
#' be specified easily, or single columns can be dropped (see the examples). Remember
#' that each column of a \code{procmod_frame} is actually a matrix.
#'
#' The drop argument is passed on to the \code{procmod_frame} indexing method.
#' The default value is \code{FALSE}.
#'
#' @param x object to be subsetted.
#' @param subset logical expression indicating elements or
#' rows to keep: missing values are taken as false.
#' @param select expression, indicating columns to select from a data frame.
#' @param drop passed on to [ indexing operator.
#' @param ... further arguments to be passed to or from other methods.
#'
#' @return A \code{procmod_frame} containing just the selected rows and columns.
#'
#' @examples
#' library(vegan)
#' data(bacteria)
#' data(eukaryotes)
#' data(soil)
#'
#' dataset <- procmod_frame(euk = vegdist(decostand(eukaryotes,
#' method = "hellinger"),
#' method = "euclidean"),
#' bac = vegdist(decostand(bacteria,
#' method = "hellinger"),
#' method = "euclidean"),
#' soil = scale(soil,
#' center = TRUE,
#' scale = TRUE))
#' dim(dataset)
#'
#' higher_ph = subset(dataset,soil[,"pH"] > 0)
#' dim(higher_ph)
#'
#' without_bacteria = subset(dataset,soil[,"pH"] > 0, -bac)
#' dim(without_bacteria)
#'
#' @author Eric Coissac
#' @author Christelle Gonindard-Melodelima
#' @export
......
#' @include internals.R
#'
#' @title ProcMod
#' @name procmod
#' @description blabla
#' @author Christelle Gonindard-Melodelima
#' @author Eric Coissac
#'
NULL
#' Rotate the \code{src} matrix to fit into the space of the \code{dest} matrix.
......@@ -20,9 +14,11 @@ NULL
#' @return a numeric matrix
#'
#' @examples
#' # Renerate a random matrix of size 10 x 15
#' m1 <- rmatrix(10, 15)
#' m2 <- rmatrix(10, 20)
#' # Generates two random matrices of size 10 x 15
#' m1 <- simulate_matrix(10, 15)
#' m2 <- simulate_matrix(10, 20)
#'
#' # Rotates matrix m1 on m2
#' mr <- protate(m1, m2)
#'
#' @author Christelle Gonindard-Melodelima
......
......@@ -17,14 +17,14 @@
#' @return a numeric matrix of \code{n} rows and \code{p} columns
#'
#' @examples
#' sim1 <- rmatrix(25,10)
#' sim1 <- simulate_matrix(25,10)
#' class(sim1)
#' dim(sim1)
#'
#' @author Eric Coissac
#' @author Christelle Gonindard-Melodelima
#' @export
rmatrix <- function(n, p, equal_var = TRUE) {
simulate_matrix <- function(n, p, equal_var = TRUE) {
new <- rnorm(n * p, mean = 0, sd = 1)
dim(new) <- c(n, p)
......@@ -33,12 +33,10 @@ rmatrix <- function(n, p, equal_var = TRUE) {
attributes(new)$`scaled:center` <- NULL
attributes(new)$`scaled:scale` <- NULL
new.sd <- sqrt(sum(new^2) / (n - 1))
new <- new / new.sd
return(new)
new / new.sd
}
#' Simulate n points of dimension p correlated with a reference matrix.
#' Simulate n points of dimension p correlated to a reference matrix.
#'
#' Simulates a set of point correlated to another set according to the
#' procrustean correlation definition.
......@@ -63,7 +61,7 @@ rmatrix <- function(n, p, equal_var = TRUE) {
#' @return a numeric matrix of \code{nrow(reference)} rows and \code{p} columns
#'
#' @examples
#' sim1 <- rmatrix(25,10)
#' sim1 <- simulate_matrix(25,10)
#' class(sim1)
#' dim(sim1)
#' sim2 <- simulate_correlation(sim1,20,0.8)
......@@ -77,7 +75,7 @@ simulate_correlation <- function(reference, p, r2, equal_var = TRUE) {
n <- nrow(reference)
maxdim <- max(ncol(reference), p)
noise <- rmatrix(n, p, equal_var = equal_var)
noise <- simulate_matrix(n, p, equal_var = equal_var)
if (maxdim == p && maxdim > ncol(reference)) {
# noise is the largest matrix
......@@ -86,9 +84,6 @@ simulate_correlation <- function(reference, p, r2, equal_var = TRUE) {
rot <- svd.YX$v %*% t(svd.YX$u)
rotr <- svd.YX$u %*% t(svd.YX$v)
print(rot)
print(rotr)
new = ((reference %*% rot) * sqrt(r2) +
noise * sqrt(1 - r2)) %*% rotr
}
......@@ -106,9 +101,7 @@ simulate_correlation <- function(reference, p, r2, equal_var = TRUE) {
new <- scale(new, scale = FALSE)
attributes(new)$`scaled:center` <- NULL
new.sd <- sqrt(sum(new^2) / (n - 1))
new <- new / new.sd
return(new)
new / new.sd
}
#rmatrix_tree
#simulate_matrix_tree
This source diff could not be displayed because it is too large. You can view the blob instead.
"","Aspect","TempSeasonality","MaxMonTemp","MeanMonTempRange","AnnMeanTemp","Isothemality"
"AA1",103.6505,0.9665,30.71,9.62,22.5,0.5483
"AA2",187.3814,0.9971,27.14,8.64,19.13,0.5107
"AA3",87.605,0.8224,31.9,9.12,24.46,0.5699
"AA4",270.3022,0.8563,26.97,7.92,19.8,0.5285
"ABR",142.1181,1.4235,24.98,9.5,14.01,0.4607
"ADR",105.0941,1.4423,26.4,11.94,15.92,0.5151
"AE1",310.0796,1.2487,27.89,9.16,19.21,0.4793
"AE2",203.875,1.2345,27.62,8.91,19.11,0.4752
"AI1",170.3255,0.5761,32.52,8.41,25.95,0.6182
"AI2",344.4032,0.5752,32.9,8.84,26.12,0.6285
"AML",152.9057,1.1795,27.71,9.93,19,0.5164
"AN1",137.0323,1.2401,28.53,10.81,19.05,0.5231
"AN2",188.1505,1.1367,25.76,8.84,17.3,0.495
"AN3",189.0312,1.1072,24.35,8,16.26,0.478
"AN4",129.9723,1.1237,24.45,8.23,16.19,0.4817
"AN5",155.2782,1.1312,23.57,7.91,15.3,0.4715
"APL",179.9313,1.1008,26.66,7.78,19.31,0.4675
"ARY",127.4023,1.2902,26.15,10.07,16.02,0.4965
"AW1",107.2608,1.4214,26.04,11.57,15.82,0.5108
"AW2",53.0343,1.5126,25.57,11.96,14.4,0.5039
"AWO",132.1917,1.2578,25.17,9.29,15.85,0.483
require(vegan)
bacteria <- read.csv("data-raw/bacteria.csv",
header = TRUE,
row.names = 1,
na.strings = "NA"
)
eukaryotes <- read.csv("data-raw/eukaryotes.csv",
header = TRUE,
row.names = 1,
na.strings = "NA"
)
climat <- read.csv("data-raw/climat.csv",
header = TRUE,
row.names = 1,
na.strings = "NA"
)
soil <- read.csv("data-raw/soil.csv",
header = TRUE,
row.names = 1,
na.strings = "NA"
)
geography <- read.csv("data-raw/geography.csv",
header = TRUE,
row.names = 1,
na.strings = "NA"
)
usethis::use_data(bacteria, overwrite = TRUE)
usethis::use_data(eukaryotes, overwrite = TRUE)
usethis::use_data(climat, overwrite = TRUE)
usethis::use_data(soil, overwrite = TRUE)
usethis::use_data(geography, overwrite = TRUE)
This source diff could not be displayed because it is too large. You can view the blob instead.
"","Latitude","Longitude"
"AA1",-17.609964,145.766577
"AA2",-17.68226,145.53411
"AA3",-16.167472,145.404203
"AA4",-16.594605,145.281487
"ABR",-32.122698,151.681657
"ADR",-30.36654,152.730009
"AE1",-21.25014,148.54388
"AE2",-21.118972,148.508602
"AI1",-12.714988,143.319181
"AI2",-12.739328,143.241397
"AML",-26.735437,152.89289
"AN1",-28.64008,153.332294
"AN2",-28.581605,153.375615
"AN3",-28.568607,153.344726
"AN4",-28.544691,153.289707
"AN5",-28.460052,153.133512
"APL",-18.994224,146.164664
"ARY",-34.6369444,150.7208333
"AW1",-30.361,152.795083
"AW2",-29.476051,152.335134
"AWO",-34.402028,150.843187
"","KLg","pH","AlLg","FeLg","PLg","SLg","CaLg","MgLg","MnLg","CNratio","CLg","NLg"
"AA1",2.336459734,5.51,4.752824104,5.123854906,3.152594078,2.995196292,2.80140371,2.923244019,3.127428778,2.59371350857308,2.15443305197019,-0.439280456602895
"AA2",2.225309282,5.38,5.021193435,5.206828574,3.238297068,2.902546779,2.26245109,2.99343623,3.187802639,2.52997764835275,2.05949390387014,-0.470483744482613
"AA3",2.600972896,5.59,4.442495447,4.212214247,1.883661435,2.499687083,1.996511672,2.178976947,1.824125834,2.77979061738005,0.862467925176648,-1.9173226922034
"AA4",2.491361694,4.79,4.136752266,3.532881719,2.371067862,2.444044796,2.136720567,2.257678575,1.959041392,2.65877734673006,0.979453306831795,-1.67932403989827
"ABR",3.130655349,4.4,4.60853673,4.399691024,2.825426118,2.933993164,3.374931554,2.98721923,2.835690571,2.74704992700182,2.55334381134123,-0.193706115660593
"ADR",2.760422483,4.5,4.860343997,4.916985305,3.633569443,3.053462605,3.742803658,3.385784959,3.124178055,2.58561770154574,2.60933422816305,0.0237165266173161
"AE1",2.59439255,5.82,4.964264346,5.075550611,3.456517858,2.963787827,3.045714059,2.617000341,3.320354033,2.48703632681194,2.14651590734416,-0.340520419467782
"AE2",2.481442629,6.12,4.754355982,4.594403601,2.963787827,2.816903839,3.01745073,2.610660163,3.285782274,2.44241829197956,1.59168119084484,-0.850737101134716
"AI1",2.588831726,6,3.893817224,4.348324338,2.342422681,2.484299839,3.243286146,2.803457116,2.562292864,2.5925052251585,1.04133622084838,-1.55116900431012
"AI2",3.086715664,4.76,3.894371454,4.113976758,2.178976947,2.460897843,2.696356389,2.693726949,2.002597981,2.63340227213191,1.15499262210422,-1.4784096500277
"AML",2.933487288,5.3,4.499700826,4.638499241,3.193402903,2.98721923,3.854366778,3.706803097,3.360025089,2.43523094205837,2.33408376005342,-0.101147182004958
"AN1",2.641474111,5.4,4.849425557,5.029387836,3.363799945,2.951337519,3.817631467,3.083144143,3.416806872,2.391482313416,2.06242253651024,-0.329059776905759
"AN2",2.547774705,4.4,4.61910377,4.187548921,2.190331698,2.799340549,3.262688344,2.618048097,1.703291378,2.76547430488356,2.23001440015921,-0.535459904724352
"AN3",2.51054501,4.7,4.57635287,4.243062865,2.214843848,2.773786445,3.100715087,2.563481085,1.631443769,2.70588053221028,2.08654127879506,-0.619339253415225
"AN4",2.833784375,4.4,4.872744649,4.900372591,3.114277297,2.993876915,3.546666025,3.25791845,3.255513713,2.44530482454504,2.31154483436552,-0.133759990179524