make.PCA.groups(traitsImputed, traitsMissing, ...)

PCA with separate point sets for imputed and missing-trait species.

statisticsfunctional diversity
Args:traitsImputed — complete trait matrixtraitsMissing — species with missing traits
make.PCA.groups <- function(traitsImputed, traitsMissing,
                            group = c("Plants","Birds","Mammals","Reptiles","Amphibians","Fishes")) {
  require(paran)
  paranAux <- paran(traitsImputed[, 1:(ncol(traitsImputed) - 1)])
  if (paranAux$Retained < 2) paranAux$Retained <- 2
  dimensionsAux <- paranAux$Retained

  PCAImpute <- list()
  PCAImpute$traits <- traitsImputed[, 1:(ncol(traitsImputed) - 1)]
  PCAImpute$traitsMissing <- traitsMissing[, 1:(ncol(traitsImputed) - 1)]
  PCAImpute$nImputed <- rowSums(is.na(PCAImpute$traitsMissing))
  PCAImpute$PCA <- princomp(traitsImputed[, 1:(ncol(traitsImputed) - 1)])
  PCAImpute$dimensions <- dimensionsAux
  PCAImpute$variance <- (summary(PCAImpute$PCA)[1][[1]]^2)[1:dimensionsAux] /
    sum(summary(PCAImpute$PCA)[1][[1]]^2)

  if (group %in% c("Birds","Mammals")) { # Mammals & Birds
    multPC1 <- ifelse(PCAImpute$PCA$loadings["bm", "Comp.1"] > 0, 1, -1)
    PCAImpute$PCA$scores[, 1] <- multPC1 * PCAImpute$PCA$scores[, 1]
    PCAImpute$PCA$loadings[, "Comp.1"] <- multPC1 * PCAImpute$PCA$loadings[, "Comp.1"]
  }

  if (group == "Reptiles") { # Reptiles
    multPC2 <- ifelse(PCAImpute$PCA$loadings["inc", "Comp.2"] > 0, -1, 1)
    PCAImpute$PCA$scores[, 2] <- multPC2 * PCAImpute$PCA$scores[, 2]
    PCAImpute$PCA$loadings[, "Comp.2"] <- multPC2 * PCAImpute$PCA$loadings[, "Comp.2"]
  }

  if (group == "Fishes") { # Fishes
    multPC1 <- ifelse(PCAImpute$PCA$loadings["svl", "Comp.1"] > 0, 1, -1)
    multPC2 <- ifelse(PCAImpute$PCA$loadings["svl", "Comp.2"] < 0, 1, -1)
    PCAImpute$PCA$scores[, 1] <- multPC1 * PCAImpute$PCA$scores[, 1]
    PCAImpute$PCA$loadings[, "Comp.1"] <- multPC1 * PCAImpute$PCA$loadings[, "Comp.1"]
    PCAImpute$PCA$scores[, 2] <- multPC2 * PCAImpute$PCA$scores[, 2]
    PCAImpute$PCA$loadings[, "Comp.2"] <- multPC2 * PCAImpute$PCA$loadings[, "Comp.2"]
  }

  PCAImpute$loadings <- PCAImpute$PCA$loadings
  PCAImpute$traitsUse <- data.frame(PCAImpute$PCA$scores[, 1:PCAImpute$dimensions])

  treathCat <- c("EX", "EW", "CR", "EN", "VU")
  noThreatCat <- c("LC", "NT")
  PCAImpute$Threat <- with(traitsImputed,
                           ifelse(IUCN %in% treathCat, 1,
                                  ifelse(IUCN %in% noThreatCat, 0, NA)))
  return(PCAImpute)
}