Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
524 views
in Technique[技术] by (71.8m points)

r - 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 old{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"
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

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

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

2.1m questions

2.1m answers

60 comments

56.9k users

...