首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QR分解在lm和biglm中不同?

QR分解在lm和biglm中不同?
EN

Stack Overflow用户
提问于 2012-11-06 10:22:29
回答 1查看 1.1K关注 0票数 3

我试图从biglm中使用的QR分解中恢复R矩阵。为此,我在vcov.biglm中使用了一部分代码,并将其放入如下函数:

代码语言:javascript
复制
qr.R.biglm <- function (object, ...) {
    # Return the qr.R matrix from a biglm object
    object$qr <- .Call("singcheckQR", object$qr)
    p <- length(object$qr$D)
    R <- diag(p)
    R[row(R) > col(R)] <- object$qr$rbar
    R <- t(R)
    R <- sqrt(object$qr$D) * R
    dimnames(R) <- list(object$names, object$names)
    return(R)
}

更具体地说,我试图从基包中获得与使用qr.R相同的结果,这个包用于类" QR“的qr分解,例如lm类中包含的qr (lm$qr)。基函数的代码如下:

代码语言:javascript
复制
qr.R <- function (qr, complete = FALSE) {
    if (!is.qr(qr)) 
        stop("argument is not a QR decomposition")
    R <- qr$qr
    if (!complete) 
        R <- R[seq.int(min(dim(R))), , drop = FALSE]
    R[row(R) > col(R)] <- 0
    R
}

我设法得到了同样的结果样本回归,除了迹象。

代码语言:javascript
复制
x <- as.data.frame(matrix(rnorm(100 * 10), 100, 10))
y <- seq.int(1, 100)
fit.lm <- lm("y ~ .", data =  cbind(y, x))
R.lm <- qr.R(fit.lm$qr)

library(biglm)
fmla <- as.formula(paste("y ~ ", paste(colnames(x), collapse = "+")))
fit.biglm <- biglm(fmla, data = cbind(y, x))
R.biglm <- qr.R.biglm(fit.biglm)

比较两者,很明显绝对值是匹配的,而不是符号。

代码语言:javascript
复制
mean(abs(R.lm) - abs(R.biglm) < 1e-6)
[1] 1
mean(R.lm - R.biglm < 1e-6)
[1] 0.9338843

我不太明白这是为什么。我希望能从biglm得到与lm相同的R矩阵的结果。

EN

回答 1

Stack Overflow用户

发布于 2012-11-06 13:57:25

两个R矩阵的不同之处在于,biglm显然执行它的旋转,使得R的对角线元素都是正的,而lm (实际上,它调用的例程)没有这种约束。(任何一种策略都不应该有数量上的优势,所以区别仅仅是传统的一种,AFAIKT。)

通过自己施加额外的约束,您可以使lm的结果与biglm的结果相同。我会使用一个反射矩阵,将列乘以1或-1,这样对角线元素最终都是正数:

代码语言:javascript
复制
## Apply the necessary reflections
R.lm2 <- diag(sign(diag(R.lm))) %*% R.lm

## Show that they did the job
mean(R.lm2 - R.biglm < 1e-6)
# [1] 1
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13248960

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档