Language Reference

INVUPDT Function

updates a matrix inverse

INVUPDT( matrix, vector<, scalar>)

The inputs to the INVUPDT function are as follows:
matrix
is an n x n nonsingular matrix. In most applications matrix is symmetric positive definite.

vector
is an n x 1 or 1 x n vector.

scalar
is a numeric scalar.

The Sherman-Morrison-Woodbury formula is
(a + u{v}^')^{-1} =    a^{-1} - a^{-1} u    (i + v^'a^{-1}u)^{-1}    v^'a^{-1}
where a is an n x n nonsingular matrix and u and v are nx k. The formula shows that a rank k update to a corresponds to a rank k update of a^{-1}.

The INVUPDT function is used primarily to update a matrix inverse. The function implements the Sherman-Morrison-Woodbury formula for rank-one updates with u = w x and v = x, where x is an n x 1 vector and w is a scalar.

If m = a^{-1}, then you can call the INVUPDT function as follows:
  
    R=invupdt(M,X,w);
 
This statement computes the following matrix:
r = m - w{mx}    (i + w{x}^'{mx})^{-1}    x^'m
The matrix r is equivalent to (a + w{xx}^')^{-1}. If a is symmetric positive definite, then so is r.

If w is not specified, then it is given a default value of 1.

A common use of the INVUPDT function is in linear regression. If z is a design matrix, m = (z^'z)^{-1} is the associated inverse crossproduct matrix, and v is a new observation to be used in estimating the parameters of a linear model, then the inverse crossproducts matrix that includes the new observation can be updated from m by using the following statement:

  
    M2=invupdt(M,v);
 

If w is 1, the function adds an observation to the inverse; if w is -1, the function removes an observation from the inverse. If weighting is used, w is the weight.

To perform the computation, the INVUPDT function uses about 2n^2 multiplications and additions, where n is the row dimension of the positive definite argument matrix.

The following program demonstrates adding or removing observations from a linear fit and updating the inverse crossproduct matrix:

  
    X = {0,1,1,1,2,2,3,4,4}; 
    Y = {1,1,2,6,2,3,3,3,4}; 
  
    /* find linear fit */ 
    Z = j(nrow(X),1,1) || X; /* design matrix */ 
    M = inv(Z`*Z); 
  
    b = M*Z`*Y;        /* LS estimate */ 
    resid = Y - Z*b;   /* residuals */ 
    print "Original Fit", b resid; 
  
    /* residual for observation (1,6) seems too large. 
       Take obs number 4 out of data set and refit. */ 
    v = z[4,]; 
    M = invupdt( M, v, -1 ); /* update inverse crossprod */ 
  
    keepObs = (1:3) || (5:nrow(X)); 
    Z = Z[keepObs,]; 
    Y = Y[keepObs,]; 
    b = M*Z`*Y;        /* new LS estimate */ 
    print "After deleting observation 4", b; 
  
    /* Add a new obs (x,y) = (0,2) and refit. */ 
    obs = {0 2}; 
    v = 1 || obs[1];    /* new row in design matrix */ 
    M = invupdt( M, v ); 
  
    Z = Z // v; 
    Y = Y // obs[2]; 
    b = M*Z`*Y;        /* new LS estimate */ 
    print "After adding observation (0,2)", b;
 

The output is as follows:

  
                          Original Fit 
  
                               B     RESID 
  
                       2.0277778 -1.027778 
                           0.375 -1.402778 
                                 -0.402778 
                                 3.5972222 
                                 -0.777778 
                                 0.2222222 
                                 -0.152778 
                                 -0.527778 
                                 0.4722222 
  
  
                  After deleting observation 4 
  
                                B 
  
                                    1 
                            0.6470588 
  
  
                 After adding observation (0,2) 
  
                                B 
  
                                  1.3 
                            0.5470588
 

Previous Page | Next Page | Top of Page