Language Reference

RDODT and RUPDT Calls

CALL RDODT (def, rup, bup, sup, r, z <, b> <, y> <, ssq> ) ;

CALL RUPDT (rup, bup, sup, r, z <, b> <, y> <, ssq> ) ;

This subroutine is supported by the IML procedure and the iml action.

If bold upper A equals bold upper Q bold upper R is the QR decomposition of the matrix bold upper A, the RUPDT subroutine enables you to efficiently recompute the bold upper R matrix when a new row is added to A. This is called an update. Similarly, the RDODT subroutine enables you to efficiently recompute the bold upper R matrix when an existing row is deleted from A. This is called a downdate. You can also use the RDODT and RUPDT subroutines to downdate and update Cholesky decompositions.

The RDODT and RUPDT subroutines return the values:

def

is only used for downdating, and it specifies whether the downdating of matrix bold upper R by using the q rows in argument z has been successful. The result def=2 means that the downdating of bold upper R by at least one row of bold upper Z leads to a singular matrix and cannot be completed successfully (since the result of downdating is not unique). In that case, the results rup, bup, and sup contain missing values only. The result def=1 means that the residual sum of squares, ssq, could not be downdated successfully and the result sup contains missing values only. The result def=0 means that the downdating of bold upper R by bold upper Z was completed successfully.

rup

is the n times n upper triangular matrix bold upper R that has been updated or downdated by using the q rows in bold upper Z.

bup

is the n times p matrix bold upper B of right-hand sides that has been updated or downdated by using the q rows in argument y. If the argument b is not specified, bup is not computed.

sup

is a p vector of square roots of residual sum of squares that is updated or downdated by using the q rows of argument y. If ssq is not specified, sup is not computed.

The input arguments to the RDODT and RUPDT subroutines are as follows:

r

specifies an n times n upper triangular matrix bold upper R to be updated or downdated by the q rows in bold upper Z. Only the upper triangle of bold upper R is used; the lower triangle can contain any information.

z

specifies a q times n matrix bold upper Z used rowwise to update or downdate the matrix bold upper R.

b

specifies an optional n times p matrix bold upper B of right-hand sides that have to be updated or downdated simultaneously with bold upper R. If b is specified, the argument y must also be specified.

y

specifies an optional q times p matrix bold upper Y used rowwise to update or downdate the right-hand side matrix bold upper B. If b is specified, the argument y must also be specified.

ssq

is an optional p vector that, if b is specified, specifies the square root of the error sum of squares that should be updated or downdated simultaneously with bold upper R and bold upper B.

The upper triangular matrix bold upper R of the QR decomposition of an m times n matrix bold upper A,

bold upper A equals bold upper Q bold upper R comma where bold upper Q prime bold upper Q equals bold upper Q bold upper Q Superscript prime Baseline equals bold upper I Subscript m Baseline

is recomputed efficiently in two cases:

  • update: An n vector z is added to matrix bold upper A.

  • downdate: An n vector z is deleted from matrix bold upper A.

Computing the whole QR decomposition of matrix bold upper A by Householder transformations requires 4 m n squared minus 4 n cubed slash 3 floating-point operations, whereas updating or downdating the QR decomposition (by Givens rotations) of one row vector z requires only 2 n squared floating-point operations.

If the QR decomposition is used to solve the full-rank linear least squares problem

min Underscript x Endscripts double-vertical-bar bold upper A x minus b double-vertical-bar squared equals ssq

by solving the nonsingular upper triangular system

x equals bold upper R Superscript negative 1 Baseline bold upper Q prime b

then the RUPDT and RDODT subroutines can be used to update or downdate the p-transformed right-hand sides bold upper Q prime bold upper B and the residual sum-of-squares p vector ssq provided that for each n vector z added to or deleted from bold upper A there is also a p vector y added to or deleted from the m times p right-hand-side matrix bold upper B.

If the arguments z and y of the subroutines RUPDT and RDODT contain q greater-than 1 row vectors for which bold upper R (and bold upper Q prime bold upper B, and eventually ssq) is to be updated or downdated, the process is performed stepwise by processing the rows zSubscript k (and ySubscript k), k equals 1 comma ellipsis comma q, in the order in which they are stored.

The QR decomposition of an m times n matrix bold upper A, m greater-than-or-equal-to n, rankleft-parenthesis bold upper A right-parenthesis equals n,

bold upper A equals bold upper Q bold upper R comma where bold upper Q prime bold upper Q equals bold upper Q bold upper Q Superscript prime Baseline equals bold upper I Subscript m Baseline

corresponds to the Cholesky factorization

bold upper C equals bold upper R prime bold upper R comma where bold upper C equals bold upper A prime bold upper A

of the positive definite n times n crossproduct matrix bold upper C equals bold upper A prime bold upper A. In the case where m greater-than-or-equal-to n and rankleft-parenthesis bold upper A right-parenthesis equals n, the upper triangular matrix bold upper R computed by the QR decomposition (with positive diagonal elements) is the same as the one computed by Cholesky factorization except for numerical error,

bold upper A prime bold upper A equals left-parenthesis bold upper Q bold upper R right-parenthesis prime left-parenthesis bold upper Q bold upper R right-parenthesis equals bold upper R prime bold upper R

Adding a row vector z to matrix bold upper A corresponds to the rank-1 modification of the crossproduct matrix bold upper C

bold upper C overTilde equals bold upper C plus z prime z comma where bold upper C overTilde equals bold upper A overTilde prime bold upper A overTilde

and the left-parenthesis m plus 1 right-parenthesis times n matrix bold upper A overTilde contains all rows of bold upper A with the row z added.

Deleting a row vector z from matrix bold upper A corresponds to the rank-1 modification

bold upper C Superscript asterisk Baseline equals bold upper C minus z prime z comma where bold upper C Superscript asterisk Baseline equals bold upper A Superscript asterisk prime Baseline bold upper A Superscript asterisk

and the left-parenthesis m minus 1 right-parenthesis times n matrix bold upper A Superscript asterisk contains all rows of bold upper A with the row z deleted. Thus, you can also use the subroutines RUPDT and RDODT to update or downdate the Cholesky factor bold upper R of a positive definite crossproduct matrix bold upper C of bold upper A.

The process of downdating an upper triangular matrix bold upper R (and eventually a residual sum-of-squares vector ssq) is not always successful. First of all, the downdated matrix bold upper R could be rank-deficient. Even if the downdated matrix bold upper R is of full rank, the process of downdating can be ill-conditioned and does not work well if the downdated matrix is close (by rounding errors) to a rank-deficient one. In these cases, the downdated matrix bold upper R is not unique and cannot be computed by subroutine RDODT. If bold upper R cannot be computed, def returns 2, and the results rup, bup, and sup return missing values.

The downdating of the residual sum-of-squares vector ssq can be a problem, too. In practice, the downdate formula

sans-serif-italic ssq Subscript new Baseline equals StartRoot sans-serif-italic ssq Subscript old Baseline minus sans-serif-italic ssq Subscript dod Baseline EndRoot

cannot always be computed because, due to rounding errors, the radicand can be negative. In this case, the result vector sup returns missing values, and def returns 1.

You can use various methods to compute the p columns x Subscript k of the n times p matrix bold upper X that minimize the p linear least squares problems with an m times n coefficient matrix bold upper A, m greater-than-or-equal-to n, rankleft-parenthesis bold upper A right-parenthesis equals n, and p right-hand-side vectors bSubscript k (stored columnwise in the m times p matrix bold upper B).

The methods in this section use the following simple example:

 a = { 1 3 ,
       2 2 ,
       3 1 };
 b = { 1, 1, 1};
 m = nrow(a);
 n = ncol(a);
 p = ncol(b);
  • Cholesky decomposition of crossproduct matrix:

    /* form and solve the normal equations */
    aa = a` * a; ab = a` * b;
    r  = root(aa);
    x  = trisolv(2,r,ab);
    x  = trisolv(1,r,x);
    print x;
    
  • QR decomposition by Householder transformations:

    call qr(qtb, r, piv, lindep, a, , b);
    x = trisolv(1, r[,piv], qtb[1:n,]);
    
  • Stepwise update by Givens rotations:

    r = j(n,n,0); qtb = j(n,p,0); ssq = j(1,p,0);
    do i = 1 to m;
       z = a[i,];
       y = b[i,];
       call rupdt(rup,bup,sup,r,z,qtb,y,ssq);
       r   = rup;
       qtb = bup;
       ssq = sup;
    end;
    x = trisolv(1,r,qtb);
    

    Or, equivalently:

    r   = j(n,n,0); qtb = j(n,p,0); ssq = j(1,p,0);
    call rupdt(rup,bup,sup,r,a,qtb,b,ssq);
    x   = trisolv(1,rup,bup);
    
  • Singular value decomposition:

    call svd(u, d, v, a);
    d = diag(1 / d);
    x = v * d * u` * b;
    

For the preceding 3 times 2 example matrix a, each method obtains the unique LS estimator:

ss = ssq(a * x - b);
print ss x;

Figure 362: Least Squares Solution and Sum of Squared Residuals

ssx
5.916E-310.25
 0.25


To compute the (transposed) matrix bold upper Q, you can use the following technique:

r = repeat(0,n,n);
y = i(m);
qt = repeat(0,n,m);
call rupdt(rup, qtup, sup, r, a, qt, y);
print qtup;

Figure 363: Transposed Matrix

qtup
0.26726120.53452250.8017837
-0.872872-0.2182180.4364358


Last updated: May 07, 2026