PCA with separate point sets for imputed and missing-trait species.
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)
}