Q2: Cross-validation for PCA

Description Usage Arguments Details Value Author(s) References Examples

View source: R/xval.R


Internal cross-validation can be used for estimating the level of structure in a data set and to optimise the choice of number of principal components.


Q2(object, originalData = completeObs(object), fold = 5, nruncv = 1,
  type = c("krzanowski", "impute"), verbose = interactive(),
  variables = 1:nVar(object), ...)



A pcaRes object (result from previous PCA analysis.)


The matrix (or ExpressionSet) that used to obtain the pcaRes object.


The number of groups to divide the data in.


The number of times to repeat the whole cross-validation


krzanowski or imputation type cross-validation


boolean If TRUE Q2 outputs a primitive progress bar.


indices of the variables to use during cross-validation calculation. Other variables are kept as they are and do not contribute to the total sum-of-squares.


Further arguments passed to the pca function called within Q2.


This method calculates Q^2 for a PCA model. This is the cross-validated version of R^2 and can be interpreted as the ratio of variance that can be predicted independently by the PCA model. Poor (low) Q^2 indicates that the PCA model only describes noise and that the model is unrelated to the true data structure. The definition of Q^2 is:

Q^2=1 - sum_i^k sum_j^n (x - \hat{x})^2 / ∑_i^k ∑_j^n(x^2)

for the matrix x which has n rows and k columns. For a given number of PC's x is estimated as \hat{x}=TP' (T are scores and P are loadings). Although this defines the leave-one-out cross-validation this is not what is performed if fold is less than the number of rows and/or columns. In 'impute' type CV, diagonal rows of elements in the matrix are deleted and the re-estimated. In 'krzanowski' type CV, rows are sequentially left out to build fold PCA models which give the loadings. Then, columns are sequentially left out to build fold models for scores. By combining scores and loadings from different models, we can estimate completely left out values. The two types may seem similar but can give very different results, krzanowski typically yields more stable and reliable result for estimating data structure whereas impute is better for evaluating missing value imputation performance. Note that since Krzanowski CV operates on a reduced matrix, it is not possible estimate Q2 for all components and the result vector may therefore be shorter than nPcs(object).


A matrix or vector with Q^2 estimates.


Henning Redestig, Ondrej Mikula


Krzanowski, WJ. Cross-validation in principal component analysis. Biometrics. 1987(43):3,575-584


x <- iris[,1:4]
pcIr <- pca(x, nPcs=3)
q2 <- Q2(pcIr, x)
barplot(q2, main="Krzanowski CV", xlab="Number of PCs", ylab=expression(Q^2))
## q2 for a single variable
Q2(pcIr, x, variables=2)
pcIr <- pca(x, nPcs=3, method="nipals")
q2 <- Q2(pcIr, x, type="impute")
barplot(q2, main="Imputation CV", xlab="Number of PCs", ylab=expression(Q^2))

Example output

Loading required package: Biobase
Loading required package: BiocGenerics
Loading required package: parallel

Attaching package: 'BiocGenerics'

The following objects are masked from 'package:parallel':

    clusterApply, clusterApplyLB, clusterCall, clusterEvalQ,
    clusterExport, clusterMap, parApply, parCapply, parLapply,
    parLapplyLB, parRapply, parSapply, parSapplyLB

The following objects are masked from 'package:stats':

    IQR, mad, sd, var, xtabs

The following objects are masked from 'package:base':

    Filter, Find, Map, Position, Reduce, anyDuplicated, append,
    as.data.frame, cbind, colMeans, colSums, colnames, do.call,
    duplicated, eval, evalq, get, grep, grepl, intersect, is.unsorted,
    lapply, lengths, mapply, match, mget, order, paste, pmax, pmax.int,
    pmin, pmin.int, rank, rbind, rowMeans, rowSums, rownames, sapply,
    setdiff, sort, table, tapply, union, unique, unsplit, which,
    which.max, which.min

Welcome to Bioconductor

    Vignettes contain introductory material; view with
    'browseVignettes()'. To cite Bioconductor, see
    'citation("Biobase")', and for packages 'citation("pkgname")'.

Attaching package: 'pcaMethods'

The following object is masked from 'package:stats':


     PC 1      PC 2      PC 3 
0.1368185 0.3695745 0.4819950 

pcaMethods documentation built on Nov. 1, 2018, 2:45 a.m.