fullRank function

Remove Columns (or Rows) From a Matrix to Make It Full Rank

Remove Columns (or Rows) From a Matrix to Make It Full Rank

From the QR decomposition with pivoting, (qr(x, tol) if npn \ge p), if the matrix is not of full rank, the corresponding columns (n>=pn >= p) or rows (n<pn < p) are omitted to form a full rank matrix.

fullRank(x, tol = 1e-7, qrx = qr(x, tol=tol))

Arguments

  • x: a numeric matrix of dimension npn * p, or a similar object for which qr() works.
  • tol: tolerance for determining rank (deficiency). Currently is simply passed to qr.
  • qrx: optionally may be used to pass a qr(x, ..); only used when p <= n.

Returns

a version of the matrix x, with less columns or rows if x's rank was smaller than min(n,p).

If x is of full rank, it is returned unchanged.

Author(s)

Martin Maechler

Note

This is useful for robustness algorithms that rely on XX matrices of full rank, e.g., adjOutlyingness.

This also works for numeric data frames and whenever qr() works correctly.

See Also

qr; for more sophisticated rank determination, rankMatrix from package list("Matrix").

Examples

stopifnot(identical(fullRank(wood), wood)) ## More sophisticated and delicate dim(T <- tcrossprod(data.matrix(toxicity))) # 38 x 38 dim(T. <- fullRank(T)) # 38 x 10 if(requireNamespace("Matrix")) { rMmeths <- eval(formals(Matrix::rankMatrix)$method) rT. <- sapply(rMmeths, function(.m.) Matrix::rankMatrix(T., method = .m.)) print(rT.) # "qr" (= "qrLinpack"): 13, others rather 10 } dim(T.2 <- fullRank(T, tol = 1e-15))# 38 x 18 dim(T.3 <- fullRank(T, tol = 1e-12))# 38 x 13 dim(T.3 <- fullRank(T, tol = 1e-10))# 38 x 13 dim(T.3 <- fullRank(T, tol = 1e-8 ))# 38 x 12 dim(T.) # default from above 38 x 10 dim(T.3 <- fullRank(T, tol = 1e-5 ))# 38 x 10 -- still plot(svd(T, 0,0)$d, log="y", main = "singular values of T", yaxt="n") axis(2, at=10^(-14:5), las=1) ## pretty clearly indicates that rank 10 is "correct" here.