Learn R Programming

ade4 (version 1.7-16)

loocv.between: Leave-one-out cross-validation for a bca

Description

Leave-one-out cross-validation to test the existence of spurious groups in bca in the case p (number of variables) > n (number of samples).

Usage

# S3 method for between
loocv(x, progress = FALSE, …)

Arguments

x

the dudi of the bca on which cross-validation should be done

progress

logical to display a progress bar during computations (see the progress package)

further arguments passed to or from other methods

Value

A list with the cross-validated row coordinates XValCoord, the Predicted Residual Error Sum (PRESS, for each row and PRESSTot, its sum for each bca axis), the Root Mean Square Error (RMSE) and the IQR-standardized RMSE (RMSEIQR) for each bca axis.

Details

This function returns a list containing the cross-validated coordinates of the rows (the rows of the original analysis, not the rows of the bca). The analysis on which the bca was computed is redone after removing each row of the data table, one at a time. A bca is done on this new analysis and the coordinates of the missing row are computed by projection as supplementary element in the corresponding bca. This is mostly useful in the case p >> n (many variables and few samples), where bca graphs can show spurious groups (see Refs.)

References

Cardini A, O'Higgins P, Rohlf J. Seeing Distinct Groups Where There are None: Spurious Patterns from Between-Group PCA. Evolutionary Biology (2019) 46:303-316

Cardini A, Polly D. Cross-validated Between Group PCA Scatterplots: A Solution to Spurious Group Separation? Evolutionary Biology (2020) https://doi.org/10.1007/s11692-020-09494-x

Bookstein F. Pathologies of Between-Groups Principal Components Analysis in Geometric Morphometrics. Evolutionary Biology (2019) 46:271-302

See Also

loocv.dudi

Examples

Run this code
# NOT RUN {
# Data = meaudret
data(meaudret)
pca1 <- dudi.pca(meaudret$env, scannf = FALSE, nf = 3)
bca1 <- bca(pca1, meaudret$design$site, scannf = FALSE, nf = 3)
pst1 <- paste0("Meaudret BGA randtest: p=",
randtest(bca1)$pvalue, " ratio=", round(bca1$ratio, 2))

if(adegraphicsLoaded()){
    sc1 <- s.class(bca1$ls, meaudret$design$site, col = TRUE,
    psub.text = pst1, ellipseSize=0, chullSize=1, plot = FALSE)
    xbca1 <- loocv(bca1, progress = TRUE)
    sc2 <- s.class(xbca1$XValCoord, meaudret$design$site,
    col = TRUE, psub.text = "Meaudret cross-validation",
    ellipseSize=0, chullSize=1, plot = FALSE)
    ADEgS(list(sc1, sc2))
}
# }
# NOT RUN {
# Data = rnorm()
set.seed(9)
fac1 <- as.factor(rep(1:3, each = 10))
tab <- as.data.frame(matrix(rnorm(10800), nrow = 30))
pca2 <- dudi.pca(tab, scannf = FALSE)
bca2 <- bca(pca2, fac1, scannf = FALSE)
pst2 <- paste0("rnorm spurious groups: p=",
randtest(bca2)$pvalue, " ratio=", round(bca2$ratio, 2))
sc3 <- s.class(bca2$ls, fac1, col = TRUE,
psub.text = pst2, ellipseSize=0, chullSize=1,
xlim = c(-8, 8), ylim = c(-8, 8), plot = FALSE)
xbca2 <- loocv(bca2, progress = TRUE)
sc4 <- s.class(xbca2$XValCoord, fac1, col = TRUE,
psub.text = "rnorm cross-validation", ellipseSize=0,
chullSize=1, xlim = c(-8, 8), ylim = c(-8, 8), plot = FALSE)
ADEgS(list(sc3, sc4))
# }

Run the code above in your browser using DataLab