lm():LINPACK / LAPACK 中 QR 分解返回的 qraux 是什么
lm(): What is qraux returned by QR decomposition in LINPACK / LAPACK
rich.main3
是 R 中的线性模型。我了解列表的其余元素,但我不明白 qraux
是什么。文档指出它是
a vector of length ncol(x) which contains additional information on \bold{Q}".
附加信息是什么意思?
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"
想必您不知道 QR 分解是如何计算的。我在 LaTeX 中写了以下内容,这可能会帮助您澄清这一点。当然,在编程站点上,我需要向您展示一些代码。最后我给你一个计算Householder反射的玩具R函数。
住户反映矩阵
户主转型
Householder QR 分解(不旋转)
二维码压缩存储和缩放
LAPACK 辅助例程dlarfg
正在执行 Householder 变换。我还编写了以下玩具 R 函数用于演示:
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
}
假设我们有一个输入向量
set.seed(0); x <- rnorm(5)
我的函数给出:
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
rich.main3
是 R 中的线性模型。我了解列表的其余元素,但我不明白 qraux
是什么。文档指出它是
a vector of length ncol(x) which contains additional information on \bold{Q}".
附加信息是什么意思?
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"
想必您不知道 QR 分解是如何计算的。我在 LaTeX 中写了以下内容,这可能会帮助您澄清这一点。当然,在编程站点上,我需要向您展示一些代码。最后我给你一个计算Householder反射的玩具R函数。
住户反映矩阵
户主转型
Householder QR 分解(不旋转)
二维码压缩存储和缩放
LAPACK 辅助例程dlarfg
正在执行 Householder 变换。我还编写了以下玩具 R 函数用于演示:
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
}
假设我们有一个输入向量
set.seed(0); x <- rnorm(5)
我的函数给出:
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