rmatrixregressionlinear-regressionlm

lm(): What is qraux returned by QR decomposition in LINPACK / LAPACK


rich.main3 is a linear model in R. I understand the rest of the elements of the list but I don't get what qraux is. The documentation states that it is

a vector of length ncol(x) which contains additional information on \bold{Q}".

What additional information does it mean?

str(rich.main3$qr)

qr   : num [1:164, 1:147] -12.8062 0.0781 0.0781 0.0781 0.0781 ...


..- attr(*, "dimnames")=List of 2
  .. ..$ : chr [1:164] "1" "2" "3" "4" ...
  .. ..$ : chr [1:147] "(Intercept)" "S2" "S3" "x1" ...
  ..- attr(*, "assign")= int [1:147] 0 1 1 2 3 4 5 6 7 8 ...
  ..- attr(*, "contrasts")=List of 3
  .. ..$ S    : chr "contr.treatment"
  .. ..$ ID   : chr "contr.treatment"
  .. ..$ Block: chr "contr.treatment"
 $ qraux: num [1:147] 1.08 1.06 1.16 1.21 1.27 ...
 $ pivot: int [1:147] 1 2 3 4 5 6 7 8 10 11 ...
 $ tol  : num 1e-07
 $ rank : int 21
 - attr(*, "class")= chr "qr"

Solution

  • Presumably you don't know how QR factorization is computed. I wrote the following in LaTeX which might help you clarify this. Surely on a programming site I need to show you some code. In the end I offer you a toy R function computing Householder reflection.


    Householder reflection matrix

    enter image description here

    Householder transformation

    enter image description here

    Householder QR factorization (without pivoting)

    enter image description here

    Compact storage of QR and rescaling

    enter image description here


    The LAPACK auxiliary routine dlarfg is performing Householder transform. I have also written the following toy R function for demonstration:

    dlarfg <- function (x) {
      beta <- -1 * sign(x[1]) * sqrt(as.numeric(crossprod(x)))
      v <- c(1, x[-1] / (x[1] - beta))
      tau <- 1 - x[1] / beta
      y <- c(beta, rep(0, length(x)-1L))
      packed_yv <- c(beta, v[-1])
      oo <- cbind(x, y, v, packed_yv)
      attr(oo, "tau") <- tau
      oo
      }
    

    Suppose we have an input vector

    set.seed(0); x <- rnorm(5)
    

    my function gives:

    dlarfg(x)
    #              x         y           v   packed_yv
    #[1,]  1.2629543 -2.293655  1.00000000 -2.29365466
    #[2,] -0.3262334  0.000000 -0.09172596 -0.09172596
    #[3,]  1.3297993  0.000000  0.37389527  0.37389527
    #[4,]  1.2724293  0.000000  0.35776475  0.35776475
    #[5,]  0.4146414  0.000000  0.11658336  0.11658336
    #attr(,"tau")
    #[1] 1.55063