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 n≥p), if the matrix is not of full rank, the corresponding columns (n>=p) or rows (n<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 n∗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 X 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 delicatedim(T <- tcrossprod(data.matrix(toxicity)))# 38 x 38dim(T. <- fullRank(T))# 38 x 10if(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 18dim(T.3<- fullRank(T, tol =1e-12))# 38 x 13dim(T.3<- fullRank(T, tol =1e-10))# 38 x 13dim(T.3<- fullRank(T, tol =1e-8))# 38 x 12dim(T.)# default from above 38 x 10dim(T.3<- fullRank(T, tol =1e-5))# 38 x 10 -- stillplot(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.