lm和biglm的QR分解不同?

时间:2012-11-06 10:22:30

标签: r matrix lm qr-decomposition

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

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类(lm $ qr)中包含的那些。基函数的代码如下:

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
}

除了标志外,我设法得到相同的样本回归结果。

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)

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

mean(abs(R.lm) - abs(R.biglm) < 1e-6)
[1] 1
mean(R.lm - R.biglm < 1e-6)
[1] 0.9338843

我无法弄清楚为什么会这样。我希望能够从biglm获得与Rm相同的结果。

1 个答案:

答案 0 :(得分:2)

两个R矩阵之间的差异是 biglm 显然执行其旋转,使得R的对角元素都是正的,而 lm (或者,实际上,它是例程电话)没有施加这样的约束。 (一种策略或另一种策略应该没有数字优势,因此区别只是常规AFAIKT之一。)

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

## 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