[ top | up ]

Reconstruct the Q, R, or X Matrices from a QR Object

Usage

qr.X(qrstr, complete=FALSE, ncol=)
qr.Q(qrstr, complete=FALSE, Dvec=1)
qr.R(qrstr, complete=FALSE)

Arguments

qrstr object representing a QR decomposition. This will typically have come from a previous call to qr or lsfit.
complete logical expression of length 1. Indicates whether an arbitrary orthogonal completion of the Q or X matrices is to be made, or whether the R matrix is to be completed by binding zero-value rows beneath the square upper triangle.
ncol integer in the range 1:nrow(qrstr$qr). The number of columns to be in the reconstructed X. The default when complete==FALSE is the original X from which the qr object was constructed. The default when complete==TRUE is a square matrix with the original \eqn{\bold{X}} in the first ncol(X) columns and an arbitrary orthogonal completion (unitary completion in the complex case) in the remaining columns.
Dvec vector (not matrix) of diagonal values. Each column of the returned Q will be multiplied by the corresponding diagonal value.

Description

Returns the original matrix from which the object was constructed or the components of the decomposition.

Value

qr.X returns X, the original matrix from which the qr object was constructed. If complete==TRUE or the argument ncol is greater than ncol(X), additional columns from an arbitrary orthogonal (unitary) completion of X are returned.

qr.Q returns Q, the order-nrow(X) orthogonal (unitary) transformation represented by qrstr. If complete==TRUE, Q has nrow(X) columns. If complete==FALSE, Q has ncol(X) columns. When Dvec is specified, each column of Q is multiplied by the corresponding value in Dvec.

qr.R returns R, the c(ncol(X),ncol(X)) upper triangular matrix such that X == Q %*% R. If complete==TRUE, R has nrow(X) rows. If complete==FALSE, R has ncol(X) rows.

Examples

data(savings)
p <- ncol(x <- savings[,-1]) # not the 'sr'
qrstr <- qr(x)   # dim(x) == c(n,p)
qrstr $ rank # = 4 = p
Q <- qr.Q(qrstr) # dim(Q) == dim(x)
R <- qr.R(qrstr) # dim(R) == ncol(x)
X <- qr.X(qrstr) # X == x
range(X - as.matrix(x))# ~ < 6e-12

## X == Q %*% R :
all((1 - X /( Q %*% R))< 100*.Machine$double.eps)#TRUE

dim(Qc <- qr.Q(qrstr, complete=TRUE)) # Square: dim(Qc) == rep(nrow(x),2)
all((crossprod(Qc) - diag(nrow(x))) < 10*.Machine $double.eps)

QD <- qr.Q(qrstr, D=1:p)      # QD == Q %*% diag(1:p)
all(QD - Q %*% diag(1:p)  < 8* .Machine$double.eps)

dim(Rc <- qr.R(qrstr, complete=TRUE)) # == dim(x)
dim(Xc <- qr.X(qrstr, complete=TRUE)) # square: nrow(x) ^ 2
all(Xc[,1:p] == X)