https://github.com/cran/robCompositions
Raw File
Tip revision: 603e991f22931dee89245568fb7ae42ec7c13bf2 authored by Matthias Templ on 19 February 2019, 12:50:03 UTC
version 2.0.10
Tip revision: 603e991
daCoDa.R
#' Linear and quadratic discriminant analysis for compositional data.
#' 
#' Linear and quadratic discriminant analysis for compositional data using either robust or 
#' classical estimation.
#' 
#' Compositional data are expressed in orthonormal (ilr) coordinates (if \code{coda==TRUE}). For linear 
#' discriminant analysis the functions LdaClassic (classical) and Linda (robust) from the 
#' package rrcov are used. Similarly, quadratic discriminant analysis 
#' uses the functions QdaClassic and QdaCov (robust) from the same package.
#' 
#' The classical linear and quadratic discriminant rules are invariant to ilr coordinates and clr
#' coefficients. The robust rules are invariant to ilr transformations if
#' affine equivariant robust estimators of location and covariance are taken.
#' 
#' @param x a matrix or data frame containing the explanatory variables
#' @param grp grouping variable: a factor specifying the class for each
#' observation.
#' @param coda TRUE, when the underlying data are compositions.
#' @param method \dQuote{classical} or \dQuote{robust}
#' @param rule a character, either \dQuote{linear} (the default) or \dQuote{quadratic}.
#' @param ... additional arguments for the functions passed through
#' @return An S4 object of class LdaClassic, Linda, QdaClassic or QdaCov. See package 
#' rrcov for details.
#' @author Jutta Gamper
#' @seealso \code{\link[rrcov]{LdaClassic}}, \code{\link[rrcov]{Linda}}, 
#' \code{\link[rrcov]{QdaClassic}}, \code{\link[rrcov]{QdaCov}}
#' @references Filzmoser, P., Hron, K., Templ, M. (2012) 
#' Discriminant analysis for compositional data and robust parameter estimation. 
#' \emph{Computational Statistics}, 27(4), 585-604.
#' @keywords multivariate
#' @export
#' @importFrom rrcov Linda LdaClassic QdaClassic QdaCov
#' @examples
#' ## toy data (non-compositional)
#' require(MASS)
#' x1 <- mvrnorm(20,c(0,0,0),diag(3))
#' x2 <- mvrnorm(30,c(3,0,0),diag(3))
#' x3 <- mvrnorm(40,c(0,3,0),diag(3))
#' X <- rbind(x1,x2,x3)
#' grp=c(rep(1,20),rep(2,30),rep(3,40))
#' 
#' clas1 <- daCoDa(X, grp, coda=FALSE, method = "classical", rule="linear")
#' summary(clas1)
#' ## predict runs only with newest verison of rrcov
#' \dontrun{
#' predict(clas1)
#' }
#' # specify different prior probabilities
#' clas2 <- daCoDa(X, grp, coda=FALSE, prior=c(1/3, 1/3, 1/3))
#' summary(clas2)
#' 
#' ## compositional data
#' data(coffee)
#' x <- coffee[coffee$sort!="robusta",2:7]
#' group <- droplevels(coffee$sort[coffee$sort!="robusta"])
#' cof.cla <- daCoDa(x, group, method="classical", rule="quadratic")
#' cof.rob <- daCoDa(x, group, method="robust", rule="quadratic")
#' ## predict runs only with newest verison of rrcov
#' \dontrun{
#' predict(cof.cla)@ct
#' predict(cof.rob)@ct
#' }
daCoDa <- function(x, grp, coda=TRUE, method = "classical", rule="linear", ...){
  ## some checks
  if(!class(x) %in% c("matrix", "data.frame")) stop("x must be a matrix or data.frame")
  if(class(x) == "data.frame") x <- as.matrix(x)
  if(length(grp) != dim(x)[1]){
    stop(paste("grp must be of length", dim(x)[1]))
  }
  if(dim(x)[2] < 1){
    stop("matrix or data.frame expected.")
  }
  if(coda){
    x <- pivotCoord(x)
  }
  
  if(rule=="linear" & method=="classical"){
    res <- LdaClassic(x, grp, ...)
  }
  else if(rule=="linear" & method=="robust"){
    res <- Linda(x, grp, method="mcd")
  }
  else if(rule=="quadratic" & method=="classical"){
    res <- QdaClassic(x, grp, ...)
  }
  else if(rule=="quadratic" & method=="robust"){
    res <- QdaCov(x, grp, ...)
  }
  return(res)
}
back to top